特定のJavaScriptコードに対して、v8エンジンのASTにアクセスすることは可能ですか?私はV8エンジンを使用してJavaScript静的アナライザーに取り組んでいます。
3 に答える
これはかなり古いですが、おそらく答えは誰かがこれに遭遇するのを助けます。答えは「はい」です。V8を変更して独自のバージョンをコンパイルする用意があると仮定します。
その場合、compiler.ccで、 MakeFunctionInfo全体でMakeCodeが呼び出され、渡されたCompilationInfoオブジェクトに格納されているASTをネイティブコードに変換する場所が見つかります。AstVisitorから継承するクラスを作成する必要があります。その後、 MakeCodeを呼び出す前に次の行を挿入して、ASTを検査できます。
MyAstVisitor mAV;
// this will call VisitFunctionLiteral in your AST visitor
info->function()->Accept(mAV);
V8は、実際に呼び出されたときに関数をジャストインタイムでコンパイルするため、CompileLazyには、呼び出しスクリプトの実行中にASTを取得するために同じことを行う必要がある別の場所があります。
コンパイルが遅いため、静的分析を実行できない可能性があります。コンパイルが遅れているもののASTにアクセスする前に、実行がすでに進行中であるためです。しかし、これがASTを取得する方法です。
--print-ast
経由で使用SetFlagsFromString
何を達成したいのかわかりませんが、C ++コード内からASTを変更したいようです(または、JavaScriptコンテキストのラッパークラスも作成しますか?)。
V8のASTで使用されるものをかなり説明しているヘッダーファイルを確認することをお勧めします。
http://v8.googlecode.com/svn/trunk/src/ast.h
〜乾杯