Доступ к абстрактному синтаксическому дереву движка V8 - PullRequest
8 голосов
/ 26 февраля 2012

Возможно ли получить доступ к AST движка v8 для данного кода JavaScript?Я работаю над статическим анализатором JavaScript с использованием движка V8.

Ответы [ 3 ]

10 голосов
/ 04 октября 2012

Это довольно старый, но, возможно, ответ поможет кому-то наткнуться на это. Ответ - да, если вы готовы изменить V8 и скомпилировать свою собственную версию.

Если это так, то в compiler.cc вы найдете место, где MakeCode вызывается повсюду MakeFunctionInfo , который преобразует AST, который хранится в переданном в Объект CompilationInfo в нативный код. Вам нужно написать класс, который наследует от AstVisitor , затем вы можете проверить AST, вставив следующие строки перед вызовом MakeCode :

MyAstVisitor mAV;
// this will call VisitFunctionLiteral in your AST visitor
info->function()->Accept(mAV);

Поскольку V8 компилирует функции точно в срок, когда они на самом деле вызываются, в CompileLazy есть еще одно место, где вам придется делать то же самое, чтобы получать их AST во время выполнения вызывающих скриптов.

Из-за отложенной компиляции это, вероятно, не позволит вам выполнять статический анализ, потому что выполнение уже выполняется до того, как вы получите доступ к AST для лениво скомпилированных вещей. Но это как получить AST.

1 голос
/ 23 июля 2012

Ну, я не знаю, чего вы хотите достичь, но звучит так, будто вы хотите изменить AST изнутри вашего кода C ++ (или, возможно, написать классы-обертки для контекста JavaScript для них?).

Я предлагаю взглянуть на файл заголовков, который довольно подробно объясняет, что там будет использоваться в AST V8:

http://v8.googlecode.com/svn/trunk/src/ast.h

~ Cheers

1 голос
/ 03 апреля 2012

Использование --print-ast через SetFlagsFromString

...