swig生成基于neko虚拟机的测试库

原创
2018/03/14 17:00
阅读数 159

我们之前已经测试过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

这件事开始有点意思了。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部