从 v8 引擎调用函数抛出错误
Calling function from v8 engine throws error
我正在制作一个应用程序,需要我在某些 Javascript 代码中调用一个函数。问题是,尽管查找了很多次,我仍然得到同样的错误。
No matching function for call to 'v8::Object::Get(v8::Local<v8::Context>&, v8::MaybeLocal<v8::String>)'
我已经查看了几个不同的帖子甚至文档,但我什至无法 运行 使用该功能。
Isolate::CreateParams create_params;
create_params.array_buffer_allocator = ArrayBuffer::Allocator::NewDefaultAllocator();
Isolate* isolate = Isolate::New(create_params);
{
Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);
Local<Context> context = Context::New(isolate);
Context::Scope context_scope(context);
std::string fileContent = f.getContents("./src/solutions/6t10.js");;
Local<String> source = String::NewFromUtf8(isolate, cv.stringToChar(fileContent), NewStringType::kNormal).ToLocalChecked();
Local<Script> script = Script::Compile(context, source).ToLocalChecked();
MaybeLocal<Value> result = script->Run(context).ToLocalChecked();
Handle<Object> global = context->Global();
MaybeLocal<String> strValue = String::NewFromUtf8(isolate, cv.stringToChar("prob"+std::to_string(pi)));
Local<Value> value = global->Get(context, strValue);
Handle<Function> func = Handle<Function>::Cast(value);
Handle<Value> args[1] = { global->Get(context, String::NewFromUtf8(isolate, ca)) };
MaybeLocal<Value> js_result = func->Call(context, global, 1, args);
v8::String::Utf8Value answer(isolate, js_result.ToLocalChecked());
answers+=*answer;
}
isolate->Dispose();
delete create_params.array_buffer_allocator;
如果你找不到问题我就问这个,我怎样才能把一个LocalString转成LocalValue?谢谢:)
(这里是 V8 开发者。)@pm100 的评论是正确的:Local
和 MaybeLocal
不可互换,需要前者的功能不能处理后者。
名称的“可能”部分表示由于可能发生的某些错误(通常是异常),该值可能不存在。所需的显式转换可帮助 您 确保您不会忘记对此进行检查。 (很多年前,V8 的 API 没有这种区别,它是嵌入代码中无穷无尽的错误来源。)
how can I turn a Local to Local?
我猜你的意思是“我怎样才能把 MaybeLocal 变成 Local?”。
针对不同的场景有两种选择,您的代码已经包含其中一种的示例:
MaybeLocal::ToLocalChecked()
检查值是否存在,如果不存在则使进程崩溃,否则 returns Local
。毫不奇怪,当您可以保证没有异常发生时,这是合适的,例如用于字符串分配。
MaybeLocal::ToLocal(Local* ...)
适用于您不能 保证值存在(即没有发生异常)并且您不 的情况想要崩溃的过程。它检查一个值是否存在,如果不存在,returns false
(这样你就可以优雅地处理这种情况),否则填充 out-parameter 中的 Local
(和 returns true
)。这通常用于从 JavaScript 返回的任何值。作为代码中的一个具体示例:如果 func->Call
抛出异常,js_result.ToLocalChecked()
将使进程崩溃。
我正在制作一个应用程序,需要我在某些 Javascript 代码中调用一个函数。问题是,尽管查找了很多次,我仍然得到同样的错误。
No matching function for call to 'v8::Object::Get(v8::Local<v8::Context>&, v8::MaybeLocal<v8::String>)'
我已经查看了几个不同的帖子甚至文档,但我什至无法 运行 使用该功能。
Isolate::CreateParams create_params;
create_params.array_buffer_allocator = ArrayBuffer::Allocator::NewDefaultAllocator();
Isolate* isolate = Isolate::New(create_params);
{
Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);
Local<Context> context = Context::New(isolate);
Context::Scope context_scope(context);
std::string fileContent = f.getContents("./src/solutions/6t10.js");;
Local<String> source = String::NewFromUtf8(isolate, cv.stringToChar(fileContent), NewStringType::kNormal).ToLocalChecked();
Local<Script> script = Script::Compile(context, source).ToLocalChecked();
MaybeLocal<Value> result = script->Run(context).ToLocalChecked();
Handle<Object> global = context->Global();
MaybeLocal<String> strValue = String::NewFromUtf8(isolate, cv.stringToChar("prob"+std::to_string(pi)));
Local<Value> value = global->Get(context, strValue);
Handle<Function> func = Handle<Function>::Cast(value);
Handle<Value> args[1] = { global->Get(context, String::NewFromUtf8(isolate, ca)) };
MaybeLocal<Value> js_result = func->Call(context, global, 1, args);
v8::String::Utf8Value answer(isolate, js_result.ToLocalChecked());
answers+=*answer;
}
isolate->Dispose();
delete create_params.array_buffer_allocator;
如果你找不到问题我就问这个,我怎样才能把一个LocalString转成LocalValue?谢谢:)
(这里是 V8 开发者。)@pm100 的评论是正确的:Local
和 MaybeLocal
不可互换,需要前者的功能不能处理后者。
名称的“可能”部分表示由于可能发生的某些错误(通常是异常),该值可能不存在。所需的显式转换可帮助 您 确保您不会忘记对此进行检查。 (很多年前,V8 的 API 没有这种区别,它是嵌入代码中无穷无尽的错误来源。)
how can I turn a Local to Local?
我猜你的意思是“我怎样才能把 MaybeLocal 变成 Local?”。
针对不同的场景有两种选择,您的代码已经包含其中一种的示例:
MaybeLocal::ToLocalChecked()
检查值是否存在,如果不存在则使进程崩溃,否则 returns Local
。毫不奇怪,当您可以保证没有异常发生时,这是合适的,例如用于字符串分配。
MaybeLocal::ToLocal(Local* ...)
适用于您不能 保证值存在(即没有发生异常)并且您不 的情况想要崩溃的过程。它检查一个值是否存在,如果不存在,returns false
(这样你就可以优雅地处理这种情况),否则填充 out-parameter 中的 Local
(和 returns true
)。这通常用于从 JavaScript 返回的任何值。作为代码中的一个具体示例:如果 func->Call
抛出异常,js_result.ToLocalChecked()
将使进程崩溃。