对于给定的JavaScript代码,是否可以访问v8引擎的AST?我正在开发一个使用V8引擎的JavaScript静态分析器。
发布于 2012-10-04 22:53:47
这是相当古老的,但也许答案可以帮助偶然发现这一点的人。答案是肯定的,假设您愿意修改V8并编译您自己的版本。
如果是这样,那么在compiler.cc中,您会发现MakeCode在整个MakeFunctionInfo中都会被调用,从而将存储在传入的CompilationInfo对象中的AST转换为本机代码。您需要编写一个继承自AstVisitor的类,然后可以通过在调用MakeCode之前插入以下代码行来检查AST
MyAstVisitor mAV;
// this will call VisitFunctionLiteral in your AST visitor
info->function()->Accept(mAV);
由于V8会在函数实际被调用时即时编译函数,因此在CompileLazy中还有一个地方,您必须执行相同的操作才能在调用脚本的整个执行过程中获得它们的As。
由于延迟编译,这可能无法让您进行静态分析,因为在您访问延迟编译内容的AST之前,执行已经在进行中了。但这就是如何获得ASTs。
发布于 2012-04-03 14:17:38
通过SetFlagsFromString
使用--print-ast
发布于 2012-07-23 16:45:40
好吧,我不知道您想要实现什么,但是听起来您想要从C++代码内部修改AST (或者为它们编写JavaScript上下文的包装类?)。
我建议看一下头文件,它很好地解释了在V8的AST上使用的是什么:
http://v8.googlecode.com/svn/trunk/src/ast.h
~干杯
https://stackoverflow.com/questions/9451067
复制相似问题