2

我想在一个项目中使用 Google 的 Javascript Engine V8,并试图为引擎编写一个包装类。部分代码是从 V8 发行版的 samples/shell.cc 复制而来的。

但是,它只是因分段错误而中止,我不知道为什么,尽管问题正在发生v8::internal::Top::global_context()(由于 invalid context,这似乎是 NULL).. 代码本身对我来说看起来不错,但也许我做了一些非常愚蠢的事情:-)。

我的代码中的分段错误发生在v8::Script::Compile.

问题代码(更新):https ://gist.github.com/4c28227185a14bb6288c

感谢Luis G. Costantini R.'s Answer,(不再中止)中不再存在问题Set,但是,公开的名称仍然不可用,并将导致 ReferenceError ...

4

5 回答 5

1

你要改变 v8::Context::Scope context_scope(context); 从构造函数(第 134 行)到 internal_executeString(在 script = v8::Script::Compile(source, name); 之前)。那是因为类 v8::Context::Scope 的析构函数从上下文中退出。

我改变了方法addFunction:

void addFunction(const std::string& fname, v8::InvocationCallback func)
{
    v8::HandleScope handle_scope;
    std::cout << "before ::Set()" << std::endl;
    v8::Context::Scope context_scope(context);
    context->Global()->Set(v8::String::New(fname.c_str()),
                           v8::FunctionTemplate::New(func)->GetFunction());
    std::cout << "after ::Set()" << std::endl;
}

该函数必须添加到用于执行脚本的上下文的全局对象中。V8有一个很好的教程(分两部分):http: //www.homepluspower.info/2010/06/v8-javascript-engine-tutorial-part-1.htmlhttp://www.homepluspower.info /2010/06/v8-javascript-engine-tutorial-part-2.html

于 2010-11-26T22:34:22.510 回答
1

如果您尝试在进入上下文(通过 Context::Scope)之前创建 JavaScript 函数 (FunctionTemplate::GetFunction()) 或 JavaScript 对象 (ObjectTemplate::NewInstance()) 的实例,则会出现分段错误。原因:没有可用的 JavaScript 上下文,并且 Function 和 Object 始终只存在于 JavaScript 执行上下文中。根据 V8 文档:

函数:一个 JavaScript 函数对象 (ECMA-262, 15.3)。

Object : 一个 JavaScript 对象 (ECMA-262, 4.3.3)。

于 2011-07-15T23:40:36.610 回答
0

除非我下载所有源代码并尝试自己构建它,否则堆栈回溯几乎没用,所以...... :)

更改js.executeString("1+1", true, false);js.executeString("1+1", true, true);查看异常处理程序告诉您什么?

于 2010-11-23T07:10:49.593 回答
0

看起来你刚刚被这个 bug刺痛了,如果你还没有注意到它的话。也许提交另一份报告,因为引用的报告看起来很旧。也许更深入地研究并调查每个函数调用的堆栈帧,直到收到分段错误,您可以找到解决方法或修复此错误:)

于 2010-11-24T00:48:01.107 回答
0

我有一个类似的分段错误,问题结果如下。我正在创建一个新线程并尝试在该线程中创建一个对象模板和对象。不幸的是,如果您创建一个线程,您需要确保再次输入 v8::Context 才能执行此类操作。

我通过将 Handle 传递给 v8::Context::Calling 到新创建的线程并使用范围将其输入到新线程中来使其工作。

我在这里写了这个,因为这是我在谷歌搜索分段错误时出现的唯一有用的东西。

于 2011-04-27T15:30:04.117 回答