You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jp...@apache.org on 2012/06/12 17:51:36 UTC
[3/50] git commit: Restore RRI method support by trampolining through
__index
Restore RRI method support by trampolining through __index
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/1d380fb2
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/1d380fb2
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/1d380fb2
Branch: refs/heads/jpeach/lua
Commit: 1d380fb2f6bdc73e79ee69f4b63f99880007c5c7
Parents: 01d9d9c
Author: James Peach <jp...@apache.org>
Authored: Sat Apr 21 10:43:34 2012 -0700
Committer: James Peach <jp...@apache.org>
Committed: Tue Jun 12 08:48:38 2012 -0700
----------------------------------------------------------------------
plugins/lua/lapi.cc | 23 ++++++++++++++++++++++-
1 files changed, 22 insertions(+), 1 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1d380fb2/plugins/lua/lapi.cc
----------------------------------------------------------------------
diff --git a/plugins/lua/lapi.cc b/plugins/lua/lapi.cc
index 885e24a..3ae2645 100644
--- a/plugins/lua/lapi.cc
+++ b/plugins/lua/lapi.cc
@@ -234,6 +234,21 @@ LuaRemapIndex(lua_State * lua)
TSDebug("lua", "%s[%s]", __func__, index);
+ // XXX When we set __index in the metatable, Lua routes all method calls through here rather than checking for the
+ // existing key first. That's a bit surprising and I wonder whether there's a better way to handle this.
+
+ // Get the userdata's metatable and look up the index in it.
+ lua_getmetatable(lua, 1);
+ lua_getfield(lua, -1, index);
+ if (!lua_isnoneornil(lua, -1)) {
+ // Pop the metatable, leaving the field value on top.
+ lua_remove(lua, -2);
+ return 1;
+ }
+
+ // Pop the field value and the metatable.
+ lua_pop(lua, 2);
+
if (strcmp(index, "headers") != 0) {
return 0;
}
@@ -246,7 +261,13 @@ LuaRemapIndex(lua_State * lua)
if (lua_isnoneornil(lua, -1)) {
TSDebug("lua", "populating '%s' field", index);
lua_pop(lua, 1);
- lua_pushstring(lua, "ping");
+
+ // Make a new header table.
+ lua_newtable(lua);
+ luaL_getmetatable(lua, "ts.meta.headers");
+ lua_setmetatable(lua, -2);
+
+ // Set it for the 'headers' index and push it on the stack.
lua_setfield(lua, -2, index);
lua_getfield(lua, -1, index);
}