jbe*_*rd4 3 javascript c++ v8 embedding
请考虑以下代码片段,基于v8的sample.cc示例shell,这会导致分段错误:
int RunMain(int argc, char* argv[]) {
v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
v8::HandleScope handle_scope;
// Create a template for the global object.
v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
v8::Handle<v8::String> testStr = v8::String::New("test");
v8::Handle<v8::Array> testArr = v8::Array::New();
// Create a new execution environment containing the built-in
// functions
v8::Handle<v8::Context> context = v8::Context::New(NULL, global);
// Enter the newly created execution environment.
v8::Context::Scope context_scope(context);
return 0;
}
int main(int argc, char* argv[]) {
int result = RunMain(argc, argv);
v8::V8::Dispose();
return result;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果在实例化v8 :: Context并设置范围后实例化v8 :: Array,则代码不会出现段错误:
int RunMain(int argc, char* argv[]) {
v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
v8::HandleScope handle_scope;
// Create a template for the global object.
v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
v8::Handle<v8::String> testStr = v8::String::New("test");
// Create a new execution environment containing the built-in
// functions
v8::Handle<v8::Context> context = v8::Context::New(NULL, global);
// Enter the newly created execution environment.
v8::Context::Scope context_scope(context);
v8::Handle<v8::Array> testArr = v8::Array::New();
return 0;
}
int main(int argc, char* argv[]) {
int result = RunMain(argc, argv);
v8::V8::Dispose();
return result;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么在第一个示例中实例化v8 :: Array会导致应用程序出现段错误,而在创建v8 :: Context之后创建v8 :: Array会导致应用程序出现段错误?而且,为什么在创建Context之前实例化v8 :: String也不会导致应用程序出现段错误?
这个问题是相关的,因为在一个真正的shell应用程序中,我想实例化一个数组并将它分配给全局上下文对象,但这是不可能的,因为它似乎必须在v8 :: Array之前创建上下文实例化,从而创建循环依赖.
我很感激任何人都可以提供任何指导.
当您创建新的v8::Arrayvia API时,V8实际上会Array从当前上下文中调用构造函数.这几乎就像你new Array(n)在JavaScript中执行一样.如果没有上下文,那么V8就无法调用来创建一个数组,这就是为什么它会出现段错误.
v8::String表示原始字符串值.不必调用特定于上下文的构造函数来创建它.这就是为什么你可以在没有segfaulting V8的上下文之前创建它的原因.
您可以通过直接设置Context::Global()方法返回的对象上的字段来扩展上下文的全局对象.
| 归档时间: |
|
| 查看次数: |
1615 次 |
| 最近记录: |