neko vm 类型包装

在neko中的value类型映射的string类型和c/c++中的char* 在实际开发中 如果不了解的情况会遇到未知的问题。

由于char*是从宿主传递过来的标准指针,但是在neko vm中无法管理会成为游离指针,所以设计者一开始就直接抛弃原始标准指针。使用neko的内置类型来托管和注册各类标准指针。

所以在neko的api中使用string的时候需要注意的是,你需要的是char* 还是neko string,当然我们对宿主提供api的时候可能需要大量使用char *指针 ,这是不可避免的,那么需要我们通过几个特殊的宏来转换两者。

比如我们现在有一个table 类似这个样子。

var moduleCollections = { "moduleName" : "test" };

我们在neko中定义了key存取的方法,因为要提供给宿主使用所以参数char * 是最简单的方法。


void setObjectKeyString(value obj, char * k, char * v) {
	value pack = alloc_string(v);
	alloc_field(obj,val_id(k),pack);
}

value getObjectKeyString(value obj, char * k) {
	value str = val_field(obj, val_id(k));
	return str;
}

那么在c里面直接使用对象的存取器,设置的时候需要我们把char *转化为neko string 并且把key 转化为 int (hash key). 取的时候没有那么麻烦,因为取的是neko string 并不是我们预期的char *了, 可以直接使用key取处理。

假设我们有这样一段代码:从对象里把moduleName的属性取出来做为另外一个 对象存取的key。如果想获得正确的表现应该如何做呢?

value moduName =getObjectKeyString(obj,"moduleName");

getObjectKeyString的原型在上面。这个是可以直接取得的,虽然打印的字面和char * 的值字面量是一样的。但是他的类型是value 类型而不是char* 。

getModuleFromCollectionEx 的原型是:

value getModuleFromCollectionEx (value k) { return val_field(moduleCollections, k); }

value module = getModuleFromCollectionEx (val_id(val_string(moduName)));

由于在neko的table内部存储的field 是根据id来设置,这个id就是一个hash值。我们需要在存取的时候注意的,通过val_string宏来取string的字面量, 在通过val_id的宏来转换成 id 。 和脚本语言不同, 直接存取字面量这里会 发生取不到内容的问题。

事情越来越好玩了。

转载于:https://my.oschina.net/littlemonkeyc/blog/1668774

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值