如何使用自定义修改的v8::参数调用v8::函数
How to call a v8::Function with custom modified v8::Arguments?
我想用修改过的参数从C++端调用JSON.stringify方法,但我想到的任何解决方案都会导致一个奇怪的segfault,所有帧都位于"??"。
我想做以下事情:api::Console是用于调试目的的自定义控制台实现,因此具有静态方法,如api::Console::handleLog或api::Console::handleDebug。
对于正确传递到控制台的ObjectTemplate的handleDebug,以下内容不起作用,v8gl::context是当前执行上下文,可在其他api实现中正确使用:
v8::Handle<v8::Value> Console::handleDebug(const v8::Arguments& args) {
if (args.Length() < 1) {
return v8::Undefined();
}
v8::HandleScope scope;
v8::Handle<v8::Object> global = v8gl::context->Global();
v8::Handle<v8::Object> JSON = global->Get(v8::String::New("JSON"))->ToObject();
v8::Handle<v8::Function> JSON_stringify = v8::Handle<v8::Function>::Cast(JSON->Get(v8::String::New("stringify")));
for (signed a = 0; a < args.Length(); a++) {
for (int m = 0; m < consoleMargin; m++) {
fprintf(stdout, "t");
}
v8::Handle<v8::Value> passargs[1];
// alternative try was:
// passargs[0] = v8::String::New("{foo:'bar'}");
passargs[0] = v8::String::New(*v8::String::Utf8Value(args[a]->ToString()));
v8::String::Utf8Value value(JSON_stringify->Call(JSON, 1, passargs));
char* message = *value;
fprintf(stdout, "%sn", message);
}
return scope.Close(v8::Undefined());
}
gdb中的回溯有点奇怪,我不知道为什么:
(gdb) backtrace
#0 0x00000000004a0880 in v8::Context::Global() ()
#1 0x00000000004128ea in api::Console::handleDebug(v8::Arguments const&) ()
#2 0x00000000004b9eab in v8::internal::Builtin_HandleApiCall(v8::internal::(anonymous namespace)::BuiltinArguments<(v8::internal::BuiltinExtraArguments)1>, v8::internal::Isolate*) ()
#3 0x000004cd67f0618e in ?? ()
#4 0x000004cd67f12998 in ?? ()
#5 0x000004cd67f060e1 in ?? ()
# (... etc ...)
所以我的问题是:
如何正确地从本地值"v8::Arguments&args"转换为"v8:;Handle<v8::value>*",以便与v8::Function的Call()方法一起使用
如果我想在循环中直接使用args[a],则会为v8::Function::Call的不同签名引发编译器错误,这是正确的,因为args是本地值。v8::Function::Call的签名如下:
v8::本地<v8::值>v8::函数::调用(v8::句柄<v8::对象>,int,v8::手柄<v4::值>*)
//编辑:已更新passargs〔false index〕
您有错误:
v8::Handle<v8::Value> passargs[1];
passargs[1/* SHOULD BE 0!!!*/] =
v8::String::New(*v8::String::Utf8Value(args[a]->ToString()));
所以您尝试访问数组边界之外的元素。
BTW:v8::Local<>
继承自v8::Handle<>
,因此不需要任何魔法即可将Local
转换为Handle
。
编辑:v8的大多数功能不仅需要v8::HandleScope
,而且还需要v8::Context::Scope
。您似乎也需要创建上下文范围。您可以获得有效的上下文表单args
:
Local<Object> self = args.Holder();
Persistent<Context> context(self->CreationContext());
然后创建句柄范围和上下文范围:
Context::Scope work_in_context_scope(context);
HandleScope work_in_this_function_scope;
那你的工作。
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- v8 源代码中 ArrayMap 函数的回调 fn 参数是什么?
- 如何传递 ObjectTemplate::New in Google V8 的第二个参数
- 在v8中,使用cpp对象作为参数执行js函数
- 如何使用自定义修改的v8::参数调用v8::函数
- 使用参数从 c++ 调用 v8 JavaScript 函数
- V8如何获取作为参数提供的对象键值
- 如何解析c++ v8中的参数对象
- V8::参数和函数模板
- *v8::String::Utf8Value(args[0]->ToString()) 不返回 node 的字符串.js addon 参数
- 在Node.js和v8中调用一个使用包装对象作为参数的函数
- 参数返回值的 V8 内存管理
- V8 - 铸造参数.Data() 返回到 void 指针