访问V8引擎的抽象语法树

Coo*_*ies 8 javascript interpreter v8 abstract-syntax-tree embedded-v8

对于给定的JavaScript代码,是否可以访问v8引擎的AST?我正在使用V8引擎开发JavaScript静态分析器.

Jon*_*nas 10

这是相当古老但也许答案可以帮助有人绊倒这个.答案是肯定的,假设您愿意修改V8并编译自己的版本.

如果是这样,那么在compiler.cc中你会找到一个在MakeFunctionInfo中调用MakeCode的位置,它将存储在传入的CompilationInfo对象中的AST转换为本机代码.您需要编写一个继承自AstVisitor的类,然后您可以通过在调用MakeCode之前插入以下行来检查AST :

MyAstVisitor mAV;
// this will call VisitFunctionLiteral in your AST visitor
info->function()->Accept(mAV);
Run Code Online (Sandbox Code Playgroud)

由于V8在实际调用时及时编译函数,因此CompileLazy中还有另一个位置,您必须执行相同的操作才能在执行调用脚本时获取它们的AST.

由于懒惰的编译事情,这可能不会使您进行静态分析,因为在您访问AST以获取延迟编译的内容之前,执行已经在进行中.但这是如何获得AST.