added support for passing function pointers as well as native lua object
into wrappered function added example funcptr3 git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9264 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
6bf67f2412
commit
db5bb83440
8 changed files with 312 additions and 0 deletions
13
SWIG/Examples/lua/funcptr3/.cvsignore
Normal file
13
SWIG/Examples/lua/funcptr3/.cvsignore
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
example.py
|
||||
example.pyc
|
||||
*_wrap.c
|
||||
*_wrap.cxx
|
||||
*.dll
|
||||
*.dsw
|
||||
*.exp
|
||||
*.lib
|
||||
*.ncb
|
||||
*.opt
|
||||
*.plg
|
||||
Release
|
||||
Debug
|
||||
19
SWIG/Examples/lua/funcptr3/Makefile
Normal file
19
SWIG/Examples/lua/funcptr3/Makefile
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
TOP = ../..
|
||||
SWIG = $(TOP)/../preinst-swig
|
||||
CXXSRCS = example.c
|
||||
TARGET = example
|
||||
INTERFACE = example.i
|
||||
LIBS =
|
||||
|
||||
all::
|
||||
$(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
|
||||
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' lua
|
||||
|
||||
static::
|
||||
$(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
|
||||
TARGET='mylua' INTERFACE='$(INTERFACE)' lua_static
|
||||
|
||||
clean::
|
||||
$(MAKE) -f $(TOP)/Makefile lua_clean
|
||||
|
||||
check: all
|
||||
19
SWIG/Examples/lua/funcptr3/example.c
Normal file
19
SWIG/Examples/lua/funcptr3/example.c
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/* File : example.c */
|
||||
|
||||
int do_op(int a, int b, int (*op)(int,int)) {
|
||||
return (*op)(a,b);
|
||||
}
|
||||
|
||||
int add(int a, int b) {
|
||||
return a+b;
|
||||
}
|
||||
|
||||
int sub(int a, int b) {
|
||||
return a-b;
|
||||
}
|
||||
|
||||
int mul(int a, int b) {
|
||||
return a*b;
|
||||
}
|
||||
|
||||
int (*funcvar)(int,int) = add;
|
||||
9
SWIG/Examples/lua/funcptr3/example.h
Normal file
9
SWIG/Examples/lua/funcptr3/example.h
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
/* file: example.h */
|
||||
|
||||
extern int do_op(int,int, int (*op)(int,int));
|
||||
extern int add(int,int);
|
||||
extern int sub(int,int);
|
||||
extern int mul(int,int);
|
||||
|
||||
extern int (*funcvar)(int,int);
|
||||
|
||||
69
SWIG/Examples/lua/funcptr3/example.i
Normal file
69
SWIG/Examples/lua/funcptr3/example.i
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
/* File : example.i */
|
||||
/*
|
||||
This demonstrates how to pass a lua function, into some C code and then call it.
|
||||
|
||||
There are two examples, the first is as a parameter, the second as a global variable.
|
||||
|
||||
*/
|
||||
%module example
|
||||
%{
|
||||
#include "example.h"
|
||||
%}
|
||||
/* the extra wrappers for lua functions, see SWIG/Lib/lua/lua_fnptr.i for more details */
|
||||
%include "lua_fnptr.i"
|
||||
|
||||
/* these are a bunch of C functions which we want to be able to call from lua */
|
||||
extern int add(int,int);
|
||||
extern int sub(int,int);
|
||||
extern int mul(int,int);
|
||||
|
||||
/* this function takes a lua function as a parameter and calls it.
|
||||
As this is takes a lua fn it needs lua code
|
||||
*/
|
||||
%inline %{
|
||||
|
||||
int callback(int a, int b, SWIGLUA_FN fn)
|
||||
{
|
||||
SWIGLUA_FN_GET(fn);
|
||||
lua_pushnumber(fn.L,a);
|
||||
lua_pushnumber(fn.L,b);
|
||||
lua_call(fn.L,2,1); /* 2 in, 1 out */
|
||||
return luaL_checknumber(fn.L,-1);
|
||||
}
|
||||
%}
|
||||
|
||||
/******************
|
||||
Second code uses a stored reference.
|
||||
*******************/
|
||||
|
||||
%inline %{
|
||||
/* note: this is not so good to just have it as a raw ref
|
||||
people could set anything to this
|
||||
a better solution would to be to have a fn which wants a SWIGLUA_FN, then
|
||||
checks the type & converts to a SWIGLUA_REF.
|
||||
*/
|
||||
SWIGLUA_REF the_func={0,0};
|
||||
|
||||
void call_the_func(int a)
|
||||
{
|
||||
int i;
|
||||
if (the_func.L==0){
|
||||
printf("the_func is zero\n");
|
||||
return;
|
||||
}
|
||||
swiglua_ref_get(&the_func);
|
||||
if (!lua_isfunction(the_func.L,-1))
|
||||
{
|
||||
printf("the_func is not a function\n");
|
||||
return;
|
||||
}
|
||||
lua_pop(the_func.L,1); /* tidy stack */
|
||||
for(i=0;i<a;i++)
|
||||
{
|
||||
swiglua_ref_get(&the_func);
|
||||
lua_pushnumber(the_func.L,i);
|
||||
lua_call(the_func.L,1,0); /* 1 in, 0 out */
|
||||
}
|
||||
}
|
||||
|
||||
%}
|
||||
54
SWIG/Examples/lua/funcptr3/runme.lua
Normal file
54
SWIG/Examples/lua/funcptr3/runme.lua
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
---- importing ----
|
||||
if string.sub(_VERSION,1,7)=='Lua 5.0' then
|
||||
-- lua5.0 doesnt have a nice way to do this
|
||||
lib=loadlib('example.dll','Example_Init') or loadlib('example.so','Example_Init')
|
||||
assert(lib)()
|
||||
else
|
||||
-- lua 5.1 does
|
||||
require('example')
|
||||
end
|
||||
|
||||
a = 37
|
||||
b = 42
|
||||
|
||||
-- Now call our C function
|
||||
|
||||
print("Trying some C functions")
|
||||
print(" a =", a)
|
||||
print(" b =", b)
|
||||
print(" add(a,b) =", example.add(a,b))
|
||||
print(" sub(a,b) =", example.sub(a,b))
|
||||
print(" mul(a,b) =", example.mul(a,b))
|
||||
|
||||
print("Calling them using the my_func()")
|
||||
print(" add(a,b) =", example.callback(a,b,example.add))
|
||||
print(" sub(a,b) =", example.callback(a,b,example.sub))
|
||||
print(" mul(a,b) =", example.callback(a,b,example.mul))
|
||||
|
||||
print("Now let us write our own function")
|
||||
function foo(a,b) return 101 end
|
||||
print(" foo(a,b) =", example.callback(a,b,foo))
|
||||
|
||||
print("Now let us try something that will fail")
|
||||
local ok,c=pcall(example.callback,a,b,print)
|
||||
if ok==false then
|
||||
print("this failed as expected, error:",c)
|
||||
else
|
||||
print("oops, that worked! result:",c)
|
||||
end
|
||||
|
||||
|
||||
-- part2 stored function
|
||||
print("trying a stored fn")
|
||||
print("the_func=",example.the_func)
|
||||
print("setting to print")
|
||||
example.the_func=print
|
||||
print("the_func=",example.the_func)
|
||||
print("call_the_func(5)")
|
||||
example.call_the_func(5)
|
||||
|
||||
function bar(i) print("bar",i) end
|
||||
print("setting to bar")
|
||||
example.the_func=bar
|
||||
print("call_the_func(5)")
|
||||
example.call_the_func(5)
|
||||
Loading…
Add table
Add a link
Reference in a new issue