我想用C ++方面用修改过的参数调用JSON.stringify方法,但是我想到的任何解决方案都会产生一个奇怪的段错误,所有帧都在“??”。
我想做以下事情: 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, "%s\n", 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&amp; args”转换为“v8 :: Handle&lt; v8 :: Value&gt; *”,以便与v8 :: Function的Call()方法一起使用吗
如果我想直接在循环中使用args [a],则会针对v8 :: Function :: Call的不同签名抛出编译器错误,由于args是本地值,这是正确的。 v8 :: Function :: Call的签名如下:
V8 ::本地及LT; V8 ::值及GT; v8 :: Function :: Call(v8 :: Handle&lt; v8 :: Object&gt;,int,v8 :: Handle&lt; v8 :: Value&gt; *)
//编辑:更新了passargs [false index]
答案 0 :(得分:2)
你有错误:
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;
然后你的工作。