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 。 和脚本语言不同, 直接存取字面量这里会发生取不到内容的问题。

在交叉编译领域里, 类型包装会引申出很多问题, 特别的跨vm架构的时候,比如lua中引用js, lua引用neko的对象,C++引用neko,swig包装的lua userdata ,都会超出各自vm所能处理的边界,有时候稍有不当,就会内存泄漏。这就需要我们细心和测试了。

事情越来越好玩了。

相关文章
|
JavaScript
04avalon - vm内部属性($id)
04avalon - vm内部属性($id)
51 0
|
3月前
|
JavaScript 前端开发
理解包装对象类型
理解包装对象类型
25 0
|
JSON 数据格式
调用 sap.ui.base.ManagedObject 的构造函数时,如何传递绑定路径进去
调用 sap.ui.base.ManagedObject 的构造函数时,如何传递绑定路径进去
|
5月前
|
JavaScript
为什么data属性是一个函数而不是一个对象?
为什么data属性是一个函数而不是一个对象?
78 1
|
5月前
|
存储 C++
【C++11特性篇】玩转C++11中的包装器(function&bind)
【C++11特性篇】玩转C++11中的包装器(function&bind)
|
存储 安全 编译器
02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
|
存储 C#
【.Net底层剖析】2.stfld指令-给对象的字段赋值
【.Net底层剖析】2.stfld指令-给对象的字段赋值
153 0
【.Net底层剖析】2.stfld指令-给对象的字段赋值
|
存储 运维 算法
RH236创建不同类型的卷
RH236创建不同类型的卷
103 0
RH236创建不同类型的卷
|
监控
利用Object.defineProperty挂接set钩子,监控对象属性的修改事件
利用Object.defineProperty挂接set钩子,监控对象属性的修改事件
143 0
利用Object.defineProperty挂接set钩子,监控对象属性的修改事件
|
测试技术
Object C学习笔记3-对象的使用和定义
  1. 如何定义一个对象   在面向对象的语言中,定义一个对象是使用Class关键字,而在Object-C中则是使用@interface,@interface用于定义对象的属性和方法,@implementation则用于对象的详细描述。
855 0