[Lua] Removed generation of _wrap_delete_XXXXX (wrappered destructor) which was unused and causing warning with g++ -Wall.

Removed other unused warning in typemaps.i and other places.
Added Examples/lua/embed3, and run tests a few test cases.

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10402 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Mark Gossage 2008-04-30 00:17:53 +00:00
commit ef7c0cbbd2
13 changed files with 317 additions and 19 deletions

View file

@ -5,6 +5,7 @@ constants
dual
embed
embed2
embed3
exception
funcptr3
functest

View file

@ -0,0 +1,20 @@
TOP = ../..
SWIG = $(TOP)/../preinst-swig
TARGET = embed3
SRCS = example.cpp
INTERFACE = example.i
LUA_INTERP = embed3.cpp
# this is a little different to normal as we have our own special interpreter
# which we want to static link
# we also need the external runtime, so we can get access to certain internals of SWIG
all::
$(SWIG) -c++ -lua $(SWIGOPT) -external-runtime swigluarun.h
$(MAKE) -f $(TOP)/Makefile $(SWIGLIB) SRCS='$(SRCS)' SWIG='$(SWIG)' \
SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='example.i' LUA_INTERP='$(LUA_INTERP)' lua_static_cpp
clean::
$(MAKE) -f $(TOP)/Makefile lua_clean
check: all

View file

@ -0,0 +1,133 @@
/* embed3.cpp A C++ embeded interpreter
This will register a C++ class with Lua, and then call a Lua function
passing C++ objects to this function.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
extern "C" {
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
#include "swigluarun.h" // the SWIG external runtime
/* the SWIG wrappered library */
extern "C" int luaopen_example(lua_State*L);
// the code itself
#include "example.h"
// this code pushes a C++ pointer as well as the SWIG type onto the Lua stack
bool push_pointer(lua_State*L, void* ptr, const char* type_name, int owned = 0) {
// task 1: get the object 'type' which is registered with SWIG
// you need to call SWIG_TypeQuery() with the class name
// (normally, just look in the wrapper file to get this)
swig_type_info * pTypeInfo = SWIG_TypeQuery(L, type_name);
if (pTypeInfo == 0)
return false; // error
// task 2: push the pointer to the Lua stack
// this requires a pointer & the type
// the last param specifies if Lua is responsible for deleting the object
SWIG_NewPointerObj(L, ptr, pTypeInfo, owned);
return true;
}
/* This is an example of how to call the Lua function
void onEvent(Event e)
its very tedious, but gives you an idea of the issues involed.
*/
int call_onEvent(lua_State *L, Event e) {
int top;
/* ok, here we go:
push a, push b, call 'add' check & return res
*/
top = lua_gettop(L); /* for later */
lua_pushstring(L, "onEvent"); /* function name */
lua_gettable(L, LUA_GLOBALSINDEX); /* function to be called */
if (!lua_isfunction(L, -1)) {
printf("[C++] error: cannot find function 'OnEvent'\n");
lua_settop(L, top); // reset
return 0;
}
// push the event object
push_pointer(L, &e, "Event *", 0);
if (lua_pcall(L, 1, 0, 0) != 0) /* call function with 1 arguments and no result */
{
printf("[C++] error running function `OnEvent': %s\n", lua_tostring(L, -1));
lua_settop(L, top); // reset
return 0;
}
lua_settop(L, top); /* reset stack */
return 1; // ok
}
int main(int argc, char* argv[]) {
int ok;
int res;
char str[80];
printf("[C++] Welcome to the simple embedded Lua example v3\n");
printf("[C++] We are in C++\n");
printf("[C++] opening a Lua state & loading the libraries\n");
lua_State *L = lua_open();
luaopen_base(L);
luaopen_string(L);
luaopen_math(L);
printf("[C++] now loading the SWIG wrappered library\n");
luaopen_example(L);
printf("[C++] all looks ok\n");
printf("\n");
printf("[C++] lets create an Engine and pass a pointer to Lua\n");
Engine engine;
/* this code will pass a pointer into lua, but C++ still owns the object
this is a little tedious, to do, but lets do it
we need to pass the pointer (obviously), the type name
and a flag which states if Lua should delete the pointer once its finished with it
The type name is a class name string which is registered with SWIG
(normally, just look in the wrapper file to get this)
in this case we don't want Lua to delete the pointer so the ownership flag is 0
*/
push_pointer(L,&engine,"Engine *",0);
lua_setglobal(L, "pEngine"); // set as global variable
printf("[C++] now lets load the file 'runme.lua'\n");
printf("[C++] any lua code in this file will be executed\n");
if (luaL_loadfile(L, "runme.lua") || lua_pcall(L, 0, 0, 0)) {
printf("[C++] ERROR: cannot run lua file: %s", lua_tostring(L, -1));
exit(3);
}
printf("[C++] We are now back in C++, all looks ok\n");
printf("\n");
printf("[C++] Lets call the Lua function onEvent(e)\n");
printf("[C++] We will give it different events, as we wish\n");
printf("[C++] Starting with STARTUP\n");
Event ev;
ev.mType = Event::STARTUP;
call_onEvent(L, ev);
printf("[C++] ok\n");
printf("[C++] now we will try MOUSEPRESS,KEYPRESS,MOUSEPRESS\n");
ev.mType = Event::MOUSEPRESS;
call_onEvent(L, ev);
ev.mType = Event::KEYPRESS;
call_onEvent(L, ev);
ev.mType = Event::MOUSEPRESS;
call_onEvent(L, ev);
printf("[C++] ok\n");
printf("[C++] Finally we will SHUTDOWN\n");
ev.mType = Event::SHUTDOWN;
call_onEvent(L, ev);
printf("[C++] ok\n");
printf("\n");
printf("[C++] all finished, closing the lua state\n");
lua_close(L);
return 0;
}

View file

@ -0,0 +1,25 @@
/* File : example.cpp */
#include <stdio.h>
#include "example.h"
void Engine::start()
{
printf("[C++] Engine::start()\n");
}
void Engine::stop()
{
printf("[C++] Engine::stop()\n");
}
void Engine::accelerate(float f)
{
printf("[C++] Engine::accelerate(%f)\n",f);
}
void Engine::decelerate(float f)
{
printf("[C++] Engine::decelerate(%f)\n",f);
}

View file

@ -0,0 +1,24 @@
/* File : example.h */
/* This is some kind of engine of some kind
we will give it some dummy methods for Lua to call*/
class Engine
{
public:
void start();
void stop();
void accelerate(float f);
void decelerate(float f);
};
/* We also want to pass some events to Lua, so lets have a few classes
to do this.
*/
class Event
{
public:
enum {STARTUP,KEYPRESS,MOUSEPRESS,SHUTDOWN} mType;
// etc
};

View file

@ -0,0 +1,8 @@
/* File : example.i */
%module example
%{
#include "example.h"
%}
%include "example.h"

View file

@ -0,0 +1,35 @@
print "[lua] This is runme.lua"
-- test program for embeded lua
-- we do not need to load the library, as it was already in the intrepreter
-- but lets check anyway
assert(type(example)=='table',"Don't appear to have loaded the example module. Do not run this file directly, run the embed3 executable")
print "[lua] looking to see if we have a pointer to the engine"
if type(pEngine)=="userdata" then
print "[lua] looks good"
else
print "[lua] nope, no signs of it"
end
-- the embed program expects a function void onEvent(Event)
-- this is it
function onEvent(e)
print("[Lua] onEvent with event",e.mType)
-- lets do something with the Engine
-- nothing clever, but ...
if e.mType==example.Event_STARTUP then
pEngine:start()
elseif e.mType==example.Event_KEYPRESS then
pEngine:accelerate(0.4)
elseif e.mType==example.Event_MOUSEPRESS then
pEngine:decelerate(0.4)
elseif e.mType==example.Event_SHUTDOWN then
pEngine:stop()
else
error("unknown event type")
end
print("[Lua] ending onEvent")
end

View file

@ -27,9 +27,6 @@ void add_Shape(Shape* s,ShapeOwner* own){own->add(s);}
// or a better solution is a typemap
%apply SWIGTYPE *DISOWN {Shape* ptr};
//%ignore ShapeOwner::add;
// now we can grab the header file
%include "example.h"