Merge branch 'alexwarg-fix-lua-getitem'
* alexwarg-fix-lua-getitem: Add test case for Lua __getitem + inheritance Fix lua base class methods with __getitem
This commit is contained in:
commit
d98f7050a0
4 changed files with 74 additions and 13 deletions
|
|
@ -14,6 +14,7 @@ top_builddir = @top_builddir@
|
||||||
|
|
||||||
CPP_TEST_CASES += \
|
CPP_TEST_CASES += \
|
||||||
lua_no_module_global \
|
lua_no_module_global \
|
||||||
|
lua_inherit_getitem \
|
||||||
|
|
||||||
|
|
||||||
C_TEST_CASES += \
|
C_TEST_CASES += \
|
||||||
|
|
|
||||||
12
Examples/test-suite/lua/lua_inherit_getitem_runme.lua
Normal file
12
Examples/test-suite/lua/lua_inherit_getitem_runme.lua
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
require("import") -- the import fn
|
||||||
|
import("lua_inherit_getitem") -- import lib
|
||||||
|
|
||||||
|
local t = lua_inherit_getitem;
|
||||||
|
local base = t.CBase()
|
||||||
|
local derived = t.CDerived()
|
||||||
|
|
||||||
|
assert(base.Foo ~= nil)
|
||||||
|
assert(base:Foo() == "CBase::Foo")
|
||||||
|
assert(derived.Foo == base.Foo)
|
||||||
|
assert(derived:Foo() == "CBase::Foo")
|
||||||
|
|
||||||
19
Examples/test-suite/lua_inherit_getitem.i
Normal file
19
Examples/test-suite/lua_inherit_getitem.i
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
%module lua_inherit_getitem
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
|
||||||
|
class CBase {
|
||||||
|
public:
|
||||||
|
const char* Foo(void) {
|
||||||
|
return "CBase::Foo";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class CDerived : public CBase {
|
||||||
|
public:
|
||||||
|
void *__getitem(const char *name) const {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
@ -806,6 +806,44 @@ SWIGINTERN int SWIG_Lua_iterate_bases(lua_State *L, swig_type_info * SWIGUNUSED
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The class.get method helper, performs the lookup of class attributes.
|
||||||
|
* It returns an error code. Number of function return values is passed inside 'ret'.
|
||||||
|
* first_arg is not used in this function because function always has 2 arguments.
|
||||||
|
*/
|
||||||
|
SWIGINTERN int SWIG_Lua_class_do_get_item(lua_State *L, swig_type_info *type, int SWIGUNUSED first_arg, int *ret)
|
||||||
|
{
|
||||||
|
/* there should be 2 params passed in
|
||||||
|
(1) userdata (not the meta table)
|
||||||
|
(2) string name of the attribute
|
||||||
|
*/
|
||||||
|
int bases_search_result;
|
||||||
|
int substack_start = lua_gettop(L)-2;
|
||||||
|
assert(first_arg == substack_start+1);
|
||||||
|
lua_checkstack(L,5);
|
||||||
|
assert(lua_isuserdata(L,-2)); /* just in case */
|
||||||
|
lua_getmetatable(L,-2); /* get the meta table */
|
||||||
|
assert(lua_istable(L,-1)); /* just in case */
|
||||||
|
/* NEW: looks for the __getitem() fn
|
||||||
|
this is a user provided get fn */
|
||||||
|
SWIG_Lua_get_table(L,"__getitem"); /* find the __getitem fn */
|
||||||
|
if (lua_iscfunction(L,-1)) /* if its there */
|
||||||
|
{ /* found it so call the fn & return its value */
|
||||||
|
lua_pushvalue(L,substack_start+1); /* the userdata */
|
||||||
|
lua_pushvalue(L,substack_start+2); /* the parameter */
|
||||||
|
lua_call(L,2,1); /* 2 value in (userdata),1 out (result) */
|
||||||
|
lua_remove(L,-2); /* stack tidy, remove metatable */
|
||||||
|
if(ret) *ret = 1;
|
||||||
|
return SWIG_OK;
|
||||||
|
}
|
||||||
|
lua_pop(L,1);
|
||||||
|
/* Remove the metatable */
|
||||||
|
lua_pop(L,1);
|
||||||
|
/* Search in base classes */
|
||||||
|
bases_search_result = SWIG_Lua_iterate_bases(L,type,substack_start+1,SWIG_Lua_class_do_get_item,ret);
|
||||||
|
return bases_search_result; /* sorry not known */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* The class.get method helper, performs the lookup of class attributes.
|
/* The class.get method helper, performs the lookup of class attributes.
|
||||||
* It returns an error code. Number of function return values is passed inside 'ret'.
|
* It returns an error code. Number of function return values is passed inside 'ret'.
|
||||||
* first_arg is not used in this function because function always has 2 arguments.
|
* first_arg is not used in this function because function always has 2 arguments.
|
||||||
|
|
@ -853,19 +891,6 @@ SWIGINTERN int SWIG_Lua_class_do_get(lua_State *L, swig_type_info *type, int SW
|
||||||
return SWIG_OK;
|
return SWIG_OK;
|
||||||
}
|
}
|
||||||
lua_pop(L,1); /* remove whatever was there */
|
lua_pop(L,1); /* remove whatever was there */
|
||||||
/* NEW: looks for the __getitem() fn
|
|
||||||
this is a user provided get fn */
|
|
||||||
SWIG_Lua_get_table(L,"__getitem"); /* find the __getitem fn */
|
|
||||||
if (lua_iscfunction(L,-1)) /* if its there */
|
|
||||||
{ /* found it so call the fn & return its value */
|
|
||||||
lua_pushvalue(L,substack_start+1); /* the userdata */
|
|
||||||
lua_pushvalue(L,substack_start+2); /* the parameter */
|
|
||||||
lua_call(L,2,1); /* 2 value in (userdata),1 out (result) */
|
|
||||||
lua_remove(L,-2); /* stack tidy, remove metatable */
|
|
||||||
if(ret) *ret = 1;
|
|
||||||
return SWIG_OK;
|
|
||||||
}
|
|
||||||
lua_pop(L,1);
|
|
||||||
/* Remove the metatable */
|
/* Remove the metatable */
|
||||||
lua_pop(L,1);
|
lua_pop(L,1);
|
||||||
/* Search in base classes */
|
/* Search in base classes */
|
||||||
|
|
@ -892,6 +917,10 @@ SWIGINTERN int SWIG_Lua_class_get(lua_State *L)
|
||||||
if(result == SWIG_OK)
|
if(result == SWIG_OK)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
result = SWIG_Lua_class_do_get_item(L,type,1,&ret);
|
||||||
|
if(result == SWIG_OK)
|
||||||
|
return ret;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue