访问V8引擎的抽象语法树

问题描述 投票:0回答:3

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

javascript interpreter v8 abstract-syntax-tree embedded-v8
3个回答
13
投票

这已经很老了,但也许答案可以帮助那些偶然发现这一点的人。答案是肯定的,假设您愿意修改 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 的方法。


2
投票

通过

--print-ast
 使用 
SetFlagsFromString


1
投票

好吧,我不知道你想要实现什么,但听起来你想从 C++ 代码内部修改 AST(或者也可以为它们的 JavaScript 上下文编写包装类?)。

我建议看一下头文件,它很好地解释了 V8 的 AST 上要使用的内容:

https://chromium.googlesource.com/v8/v8/+/main/src/ast/ast.h

~干杯

© www.soinside.com 2019 - 2024. All rights reserved.