Ошибка сегментации при переносе V8 в класс? - PullRequest
2 голосов
/ 23 ноября 2010

Я хочу использовать Javascript Engine от Google V8 в проекте и попытался написать класс-оболочку для этого движка. Части кода скопированы из samples / shell.cc, из дистрибутива V8.

Однако, это просто прерывается из-за ошибки сегментации, и я не могу понять, почему, хотя проблема возникает около v8::internal::Top::global_context() (из-за неверного context, который выглядит как NULL). сам выглядит хорошо для меня, но, может быть, я сделал что-то невероятно глупое: -).

Ошибка сегментации в моем коде происходит в v8::Script::Compile.

Код в вопросе (обновлено): https://gist.github.com/4c28227185a14bb6288c

Благодаря Ответ Луиса Г. Костантини Р. , в Set больше нет проблемы (она больше не прерывается), однако открытые имена по-прежнему недоступны и будут результат в ReferenceError ...

Ответы [ 5 ]

1 голос
/ 16 июля 2011

Если вы попытаетесь создать экземпляр функции JavaScript (FunctionTemplate :: GetFunction ()) или объекта JavaScript (ObjectTemplate :: NewInstance ()) перед входом в контекст (через Context :: Scope), вы получите ошибку сегментации. Причина: отсутствует доступный контекст JavaScript, а функция и объект всегда существуют только в контексте выполнения JavaScript. Согласно документации V8:

Функция : Функциональный объект JavaScript (ECMA-262, 15.3).

Object : Объект JavaScript (ECMA-262, 4.3.3).

1 голос
/ 27 ноября 2010

Тебе поменять 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.html а также http://www.homepluspower.info/2010/06/v8-javascript-engine-tutorial-part-2.html

0 голосов
/ 27 апреля 2011

У меня была похожая ошибка сегментации, и проблема оказалась в следующем. Я создавал новый поток и пытался создать шаблон объекта и объект в этом потоке. К сожалению, кажется, что если вы создаете поток, вам необходимо убедиться, что вы снова вводите v8 :: Context, чтобы делать такие вещи.

Я получил его, передав Handle в v8 :: Context :: Вызов недавно созданному потоку и введя его в новый поток с помощью области.

Я написал это здесь, так как это единственная полезная вещь, которая возникает, когда я выполняю поиск в Google по поводу ошибки сегментации.

0 голосов
/ 24 ноября 2010

Похоже, что вас только что задело этой ошибкой , то есть, если вы еще не обратили на это внимание.Возможно, представьте еще один отчет, так как ссылка на него выглядит старой.Возможно, копайте немного глубже и исследуйте кадр стека при каждом вызове функции, пока не будет получен Сегментарный сбой, вы можете найти обходной путь или исправить эту ошибку:

0 голосов
/ 23 ноября 2010

Обратная трассировка стека практически бесполезна, если я не скачаю весь исходный код и не попытаюсь собрать его сам, поэтому ...:)

Измените js.executeString("1+1", true, false); на js.executeString("1+1", true, true); и посмотрите, что вам скажет обработчик исключений?

...