【问题标题】:Access the Abstract Syntax Tree of V8 Engine访问 V8 引擎的抽象语法树
【发布时间】:2012-02-26 06:24:02
【问题描述】:

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

【问题讨论】:

标签: javascript interpreter v8 abstract-syntax-tree embedded-v8


【解决方案1】:

这已经很老了,但也许答案可以帮助偶然发现此问题的人。答案是肯定的,假设你愿意修改 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】:

    通过SetFlagsFromString 使用--print-ast

    【讨论】:

    • 我认为 OP 希望访问 AST 作为他可以抓取的数据结构。的确,他可以像这样导出并构建自己的 AST 阅读器,并爬取自己的数据结构,但我怀疑他想尽可能避免那种笨拙。
    • 你知道那个标志还存在吗?
    【解决方案3】:

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

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

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

    ~干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多