| /* | |
| 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);} | |
| 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=luaL_newstate(); | |
| L2=luaL_newstate(); | |
| L3=luaL_newstate(); | |
| 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; | |
| } |