Provide a way to serialize the compiler's AST in the form of a PHP Code Model.
The AST classes now have an additional visitor that can serialize the AST in the format expected by the unserialize function. The concrete classes to be produced by the unserialize function can be controlled by passing in a prefix argument to the visitor. Facebook only: Also added is an extension function fb_serialize_code_model_for(codeobject, prefix) that takes a string as its first argument, prefixes it with "<?php " and then parses it as if it were an eval string and then returns the serialized AST. Reviewed By: @paroski Differential Revision: D1027004
Esse commit está contido em:
@@ -19,6 +19,7 @@
|
||||
#include "hphp/compiler/expression/scalar_expression.h"
|
||||
#include "hphp/compiler/analysis/variable_table.h"
|
||||
#include "hphp/compiler/analysis/code_error.h"
|
||||
#include "hphp/compiler/code_model_enums.h"
|
||||
#include "hphp/compiler/option.h"
|
||||
#include "hphp/compiler/expression/static_member_expression.h"
|
||||
#include "hphp/compiler/analysis/function_scope.h"
|
||||
@@ -388,6 +389,42 @@ ExpressionPtr ArrayElementExpression::unneeded() {
|
||||
return Expression::unneeded();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void ArrayElementExpression::outputCodeModel(CodeGenerator &cg) {
|
||||
if (Option::ConvertSuperGlobals && m_global && !m_dynamicGlobal &&
|
||||
getScope() && (getScope()->is(BlockScope::ProgramScope) ||
|
||||
getScope()-> getVariables()->
|
||||
isConvertibleSuperGlobal(m_globalName))) {
|
||||
cg.printObjectHeader("SimpleVariableExpression", 2);
|
||||
cg.printPropertyHeader("name");
|
||||
cg.printValue(m_globalName);
|
||||
cg.printPropertyHeader("location");
|
||||
cg.printLocation(this->getLocation());
|
||||
cg.printObjectFooter();
|
||||
} else if (m_offset) {
|
||||
cg.printObjectHeader("BinaryOpExpression", 4);
|
||||
cg.printPropertyHeader("expression1");
|
||||
m_variable->outputCodeModel(cg);
|
||||
cg.printPropertyHeader("expression2");
|
||||
cg.printExpression(m_offset, false);
|
||||
cg.printPropertyHeader("operation");
|
||||
cg.printValue(PHP_ARRAY_ELEMENT);
|
||||
cg.printPropertyHeader("location");
|
||||
cg.printLocation(this->getLocation());
|
||||
cg.printObjectFooter();
|
||||
} else {
|
||||
cg.printObjectHeader("UnaryOpExpression", 4);
|
||||
cg.printPropertyHeader("expression");
|
||||
m_variable->outputCodeModel(cg);
|
||||
cg.printPropertyHeader("operation");
|
||||
cg.printValue(PHP_ARRAY_APPEND_POINT_OP);
|
||||
cg.printPropertyHeader("location");
|
||||
cg.printLocation(this->getLocation());
|
||||
cg.printObjectFooter();
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// code generation functions
|
||||
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário