2012-02-26 11 views
8

¿Es posible acceder al AST del motor v8 para obtener un código JavaScript determinado? Estoy trabajando en un Analizador Estático JavaScript usando el motor V8.Acceda al árbol de sintaxis abstracto del motor V8

+1

posible duplicado de [¿Cómo puedo acceder al árbol de análisis de v8? ¿Cómo puedo hacerlo?] (Http://stackoverflow.com/questions/8550774/how-do-i-access-v8-parse-tree-how- can-it-be-done) – zengr

Respuesta

10

Esto es bastante viejo, pero tal vez la respuesta ayuda alguien tropezando con esto. La respuesta es sí, suponiendo que esté dispuesto a modificar V8 y compilar su propia versión de la misma.

Si es así, entonces en compiler.cc a encontrar un lugar donde MakeCode se llama a lo largo MakeFunctionInfo que transforma la AST que se almacena en el pasado en el objeto CompilationInfo en código nativo. Usted tiene que escribir una clase que hereda de AstVisitor entonces se puede inspeccionar el AST mediante la inserción de las siguientes líneas antes de la llamada a MakeCode:

MyAstVisitor mAV; 
// this will call VisitFunctionLiteral in your AST visitor 
info->function()->Accept(mAV); 

Como V8 compila funciones justo a tiempo cuando en realidad están llamado, hay otro punto en CompileLazy donde tendría que hacer lo mismo para obtener sus AST durante la ejecución de los scripts de llamada.

Debido a la compilación perezosa, esto probablemente no le permitirá hacer un análisis estático, porque la ejecución ya está en progreso antes de que tenga acceso a los AST para cosas compiladas perezosamente. Pero así es como obtener los AST.

1

Uso --print-ast través SetFlagsFromString

+1

Creo que OP quiere acceder al AST como una estructura de datos que puede rastrear. Es cierto que puede exportar de esta manera y construir su propio lector AST, y rastrear sus propias estructuras de datos, pero sospecho que quiere evitar ese poco de torpeza si es posible. –

+0

¿Sabes si todavía existe esa bandera? –

0

Bueno, no sé lo que quiere lograr, pero parece que usted quiere modificar el AST del interior de su código C++ (o tal vez escribir clases contenedoras para el contexto JavaScript para ellos también?).

que sugieren que echar un vistazo en el archivo de cabeceras que bonito explica lo que está ahí para ser usado en AST de V8:

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

~ Saludos

Cuestiones relacionadas