我们之前已经测试过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
这件事开始有点意思了。