我们之前已经测试过neko的在c里的转换了。 接下来基于昨天的研究成果 我们来组合一下,把他们结合到一起试试。
neko测试模块
$exports.x = 33; var inner = function () { return 1; } $exports.f = function(x) { return x * 2 + 1 + inner(); }
examp.i 文件
%module example /*** * initVM(void) * @return userdata neko_vm * */ neko_vm * initVM (void) ; /** * selectVM */ void selectVM(neko_vm * vm) ; /*** * load a vm Module * return userdata ; * */ value loadModule(char * str); /*** * executeModule * */ void executeModule(value module);
example.c
/* * example.c */ /*** * initVM(void) * @return neko_vm * */ neko_vm * initVM (void) { neko_vm *vm; value module; neko_global_init(NULL); vm = neko_vm_alloc(NULL); return vm; } /** * selectVM */ void selectVM(neko_vm * vm) { neko_vm_select(vm); } /*** * load a vm Module * return userdata ; */ value loadModule(char * str) { value module ; value loader; value ret; value exc = NULL; value args[2]; loader = neko_default_loader(NULL,0); args[0] = alloc_string(str); args[1] = loader; ret = val_callEx(loader, val_field(loader,val_id("loadmodule")), args,2,&exc); if( exc != NULL ) { buffer b = alloc_buffer(NULL); val_buffer(b,exc); printf("Uncaught exception - %s\n",val_string(buffer_to_string(b))); return NULL; } return ret; } /*** * executeModule * */ void executeModule(value module) { value x = val_field(module,val_id("x")); value f = val_field(module,val_id("f")); value ret; if( !val_is_int(x) ) return; printf("x = %d\n",val_int(x)); if( !val_is_function(f) || val_fun_nargs(f) != 1 ) return; ret = val_call1(f,x); if( !val_is_int(ret) ) return; printf("f(x) = %d\n",val_int(ret)); }
make生成example.so 文件
测试的lua代码
package.cpath = './?.so;' print(package.loadlib); install,b,c = package.loadlib("./example.so","luaopen_example"); print(install,b,c); install(); print("vm test") local vm = example.initVM(); print(vm); example.selectVM(vm); local module = example.loadModule("mymodule.n") print(module); example.executeModule(module);
输出
function: 0x254ecb0 function: 0x25541c0 nil nil vm test userdata: 0x2556968 userdata: 0x2556a58 x = 33 f(x) = 68
这件事开始有点意思了。