mirror of https://github.com/swig/swig
114 lines
3.2 KiB
C++
114 lines
3.2 KiB
C++
/*
|
|
dual.cpp a test for multiple modules and multiple interpreters statically linked together.
|
|
|
|
Earlier version of lua bindings for SWIG would fail if statically linked.
|
|
|
|
What is happening is as follows:
|
|
example.i declares a type Foo
|
|
examples2.i declares Bar
|
|
|
|
The first lua state will load example.i
|
|
and check to see if types Foo and Bar are registered with it
|
|
(Foo should be & Bar should not)
|
|
|
|
The second lua state will load example2.i
|
|
and check to see if types Foo and Bar are registered with it
|
|
(Bar should be & Foo should not)
|
|
|
|
Note: Though both the modules exist and are loaded, they are not linked together,
|
|
as they are connected to separate lua interpreters.
|
|
|
|
When the third lua state loads both example.i and example2.i,
|
|
the two modules are now linked together, and all can now find
|
|
both Foo and Bar.
|
|
*/
|
|
|
|
#include "swigluarun.h" // the swig runtimes
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
// the 2 libraries which are wrapped via SWIG
|
|
extern "C" int luaopen_example(lua_State*L);
|
|
extern "C" int luaopen_example2(lua_State*L);
|
|
|
|
#define DEBUG(X) {printf(X);fflush(stdout);}
|
|
#define DEBUG2(X,Y) {printf(X,Y);fflush(stdout);}
|
|
#define DEBUG3(X,Y,Z) {printf(X,Y,Z);fflush(stdout);}
|
|
|
|
#if LUA_VERSION_NUM > 501
|
|
#define lua_open luaL_newstate
|
|
#endif
|
|
|
|
void testModule(lua_State *L)
|
|
{
|
|
swig_type_info *pTypeInfo=0,*pTypeInfo2=0;
|
|
swig_module_info *pModule=0;
|
|
pModule=SWIG_GetModule(L);
|
|
DEBUG2(" SWIG_GetModule() returns %p\n", (void *)pModule)
|
|
if(pModule==0) return;
|
|
pTypeInfo = SWIG_TypeQuery(L,"Foo *");
|
|
DEBUG2(" Type (Foo*) is %s\n",pTypeInfo==0?"unknown":"known");
|
|
DEBUG3(" Module %p typeinfo(Foo*) %p\n", (void *)pModule, (void *)pTypeInfo);
|
|
pTypeInfo2 = SWIG_TypeQuery(L,"Bar *");
|
|
DEBUG2(" Type (Bar*) is %s\n",pTypeInfo2==0?"unknown":"known");
|
|
DEBUG3(" Module %p typeinfo(Bar*) %p\n", (void *)pModule, (void *)pTypeInfo2);
|
|
}
|
|
|
|
int main(int argc,char* argv[])
|
|
{
|
|
lua_State *L1=0,*L2=0,*L3=0;
|
|
|
|
printf("This is a test of having two SWIG'ed modules and three lua states\n"
|
|
"statically linked together.\n"
|
|
"Its mainly to check that all the types are correctly managed\n\n");
|
|
|
|
DEBUG("creating lua states(L1,L2,L3)");
|
|
L1=lua_open();
|
|
L2=lua_open();
|
|
L3=lua_open();
|
|
DEBUG("ok\n\n");
|
|
|
|
DEBUG("luaopen_example(L1)..");
|
|
luaopen_example(L1);
|
|
DEBUG("ok\n");
|
|
|
|
DEBUG("Testing Module L1\n");
|
|
DEBUG("This module should know about Foo* but not Bar*\n");
|
|
testModule(L1);
|
|
DEBUG("End Testing Module L1\n\n");
|
|
|
|
DEBUG("luaopen_example2(L2)..");
|
|
luaopen_example2(L2);
|
|
DEBUG("ok\n");
|
|
|
|
DEBUG("Testing Module L2\n");
|
|
DEBUG("This module should know about Bar* but not Foo*\n");
|
|
testModule(L2);
|
|
DEBUG("End Testing Module L2\n\n");
|
|
|
|
DEBUG("luaopen_example(L3)..");
|
|
luaopen_example(L3);
|
|
DEBUG("ok\n");
|
|
DEBUG("luaopen_example2(L3)..");
|
|
luaopen_example2(L3);
|
|
DEBUG("ok\n");
|
|
|
|
DEBUG("Testing Module L3\n");
|
|
DEBUG("This module should know about Foo* and Bar*\n");
|
|
testModule(L3);
|
|
DEBUG("End Testing Module L3\n\n");
|
|
|
|
DEBUG("Testing Module L1 again\n");
|
|
DEBUG("It now should know about Foo* and Bar*\n");
|
|
testModule(L1);
|
|
DEBUG("End Testing Module L1 again\n\n");
|
|
|
|
DEBUG("close all..");
|
|
lua_close(L1);
|
|
lua_close(L2);
|
|
lua_close(L3);
|
|
DEBUG("ok, exiting\n");
|
|
return 0;
|
|
}
|