gpt4 book ai didi

node.js - 在 Nodejs 附加组件中调用 ObjectWrap::Unwrap 时如何检查类型是否正确?

转载 作者:搜寻专家 更新时间:2023-10-31 22:20:19 26 4
gpt4 key购买 nike

我有 2 个 C++ 类公开为 javascript 类,VanillaOptionNoomraEngine,它们都继承自 ObjectWrap

NoomraEngine 中的以下方法中,我应该会收到一个先前“包装的”VanillaOption:

Handle<Value> 
NoomraEngine::Price(const Arguments& args) {
HandleScope scope;
Local<Object> object = args[0]->ToObject(); // VanillaOption expected in args[0]

VanillaOption* equityOption = ObjectWrap::Unwrap<VanillaOption>(object);

Local<Number> x = Number::New(this->price(equityOption));
return scope.Close(x);
}

一切正常,除了如果我将错误的类型传递给方法, Node 会在 ObjectWrap::Unwrap 中崩溃。

我的问题是如何确保我在 args[0] 中收到了正确的类型?

最佳答案

编辑:比下面的裸 V8 更好的方法是使用 NanHasInstance ( https://github.com/rvagg/nan#api_nan_has_instance )

MyObject::Init :

Local<FunctionTemplate> tpl = NanNew<FunctionTemplate>(New);
tpl->SetClassName(NanNew<String>("MyObject"));
...
NanAssignPersistent(prototype, tpl);

哪里prototype是静态的 Persistent<FunctionTemplate> MyObject的成员.

像这样使用:

if (NanHasInstance(prototype, handle)) {
MyObject* obj = ObjectWrap::Unwrap<MyObject>(handle);
...
}

请注意,这是我第一次尝试编写 Node 插件,我通过使用我自己的包装器检查对象的原型(prototype)解决了这个确切的问题 UnWrap .

这是插件工厂类演示的补丁,展示了该方法: https://github.com/petli/node-addon-examples/commit/d3e92cd060a26da2623690718e78f9005db060a8

它将仅支持工厂生成的对象,而不支持公开构造函数以便用户可以从基类继承的对象。然而,这可以通过遍历原型(prototype)链来推广。

总之,它在MyObject::Init 中获取了对预期类原型(prototype)的引用。 :

Local<Object> obj = constructor->NewInstance();
prototype = Persistent<Value>::New(obj->GetPrototype());

然后在取消引用对象之前检查:

MyObject* MyObject::CheckedUnWrap(Handle<Object> handle)
{
if (!handle.IsEmpty() && handle->InternalFieldCount() == 1) {
Handle<Value> objproto = handle->GetPrototype();
if (objproto == prototype) {
// OK, this is us
return ObjectWrap::Unwrap<MyObject>(handle);
}
}

ThrowException(Exception::TypeError(String::New("<this> is not a MyObject")));
return NULL;
}

然后所有函数都使用CheckedUnWrap相反:

Handle<Value> MyObject::PlusOne(const Arguments& args) {
HandleScope scope;

MyObject* obj = CheckedUnWrap(args.This());
if (obj) {
obj->counter_ += 1;
return scope.Close(Number::New(obj->counter_));
}
else {
// Invalid type, an exception has been thrown so return an empty value
return Handle<Value>();
}
}

我也在考虑添加一个内部字段并将其设置为某个魔术指针,但代码将依赖于该 node::ObjectWrap不会改变它使用内部字段的方式。

关于node.js - 在 Nodejs 附加组件中调用 ObjectWrap::Unwrap 时如何检查类型是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8994196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com