| Index: src/full-codegen.cc
|
| ===================================================================
|
| --- src/full-codegen.cc (revision 5323)
|
| +++ src/full-codegen.cc (working copy)
|
| @@ -38,412 +38,6 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| -#define BAILOUT(reason) \
|
| - do { \
|
| - if (FLAG_trace_bailout) { \
|
| - PrintF("%s\n", reason); \
|
| - } \
|
| - has_supported_syntax_ = false; \
|
| - return; \
|
| - } while (false)
|
| -
|
| -
|
| -#define CHECK_BAILOUT \
|
| - do { \
|
| - if (!has_supported_syntax_) return; \
|
| - } while (false)
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::Check(FunctionLiteral* fun) {
|
| - Scope* scope = fun->scope();
|
| - VisitDeclarations(scope->declarations());
|
| - CHECK_BAILOUT;
|
| -
|
| - VisitStatements(fun->body());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitDeclarations(
|
| - ZoneList<Declaration*>* decls) {
|
| - for (int i = 0; i < decls->length(); i++) {
|
| - Visit(decls->at(i));
|
| - CHECK_BAILOUT;
|
| - }
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitStatements(ZoneList<Statement*>* stmts) {
|
| - for (int i = 0, len = stmts->length(); i < len; i++) {
|
| - Visit(stmts->at(i));
|
| - CHECK_BAILOUT;
|
| - }
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitDeclaration(Declaration* decl) {
|
| - Property* prop = decl->proxy()->AsProperty();
|
| - if (prop != NULL) {
|
| - Visit(prop->obj());
|
| - Visit(prop->key());
|
| - }
|
| -
|
| - if (decl->fun() != NULL) {
|
| - Visit(decl->fun());
|
| - }
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitBlock(Block* stmt) {
|
| - VisitStatements(stmt->statements());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitExpressionStatement(
|
| - ExpressionStatement* stmt) {
|
| - Visit(stmt->expression());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitEmptyStatement(EmptyStatement* stmt) {
|
| - // Supported.
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitIfStatement(IfStatement* stmt) {
|
| - Visit(stmt->condition());
|
| - CHECK_BAILOUT;
|
| - Visit(stmt->then_statement());
|
| - CHECK_BAILOUT;
|
| - Visit(stmt->else_statement());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitContinueStatement(ContinueStatement* stmt) {
|
| - // Supported.
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitBreakStatement(BreakStatement* stmt) {
|
| - // Supported.
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitReturnStatement(ReturnStatement* stmt) {
|
| - Visit(stmt->expression());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitWithEnterStatement(
|
| - WithEnterStatement* stmt) {
|
| - Visit(stmt->expression());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitWithExitStatement(WithExitStatement* stmt) {
|
| - // Supported.
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitSwitchStatement(SwitchStatement* stmt) {
|
| - BAILOUT("SwitchStatement");
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitDoWhileStatement(DoWhileStatement* stmt) {
|
| - Visit(stmt->cond());
|
| - CHECK_BAILOUT;
|
| - Visit(stmt->body());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitWhileStatement(WhileStatement* stmt) {
|
| - Visit(stmt->cond());
|
| - CHECK_BAILOUT;
|
| - Visit(stmt->body());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitForStatement(ForStatement* stmt) {
|
| - if (!FLAG_always_full_compiler) BAILOUT("ForStatement");
|
| - if (stmt->init() != NULL) {
|
| - Visit(stmt->init());
|
| - CHECK_BAILOUT;
|
| - }
|
| - if (stmt->cond() != NULL) {
|
| - Visit(stmt->cond());
|
| - CHECK_BAILOUT;
|
| - }
|
| - Visit(stmt->body());
|
| - if (stmt->next() != NULL) {
|
| - CHECK_BAILOUT;
|
| - Visit(stmt->next());
|
| - }
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitForInStatement(ForInStatement* stmt) {
|
| - BAILOUT("ForInStatement");
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitTryCatchStatement(TryCatchStatement* stmt) {
|
| - Visit(stmt->try_block());
|
| - CHECK_BAILOUT;
|
| - Visit(stmt->catch_block());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitTryFinallyStatement(
|
| - TryFinallyStatement* stmt) {
|
| - Visit(stmt->try_block());
|
| - CHECK_BAILOUT;
|
| - Visit(stmt->finally_block());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitDebuggerStatement(
|
| - DebuggerStatement* stmt) {
|
| - // Supported.
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitFunctionLiteral(FunctionLiteral* expr) {
|
| - // Supported.
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitSharedFunctionInfoLiteral(
|
| - SharedFunctionInfoLiteral* expr) {
|
| - BAILOUT("SharedFunctionInfoLiteral");
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitConditional(Conditional* expr) {
|
| - Visit(expr->condition());
|
| - CHECK_BAILOUT;
|
| - Visit(expr->then_expression());
|
| - CHECK_BAILOUT;
|
| - Visit(expr->else_expression());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitSlot(Slot* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitVariableProxy(VariableProxy* expr) {
|
| - // Supported.
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitLiteral(Literal* expr) {
|
| - // Supported.
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitRegExpLiteral(RegExpLiteral* expr) {
|
| - // Supported.
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitObjectLiteral(ObjectLiteral* expr) {
|
| - ZoneList<ObjectLiteral::Property*>* properties = expr->properties();
|
| -
|
| - for (int i = 0, len = properties->length(); i < len; i++) {
|
| - ObjectLiteral::Property* property = properties->at(i);
|
| - if (property->IsCompileTimeValue()) continue;
|
| - Visit(property->key());
|
| - CHECK_BAILOUT;
|
| - Visit(property->value());
|
| - CHECK_BAILOUT;
|
| - }
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitArrayLiteral(ArrayLiteral* expr) {
|
| - ZoneList<Expression*>* subexprs = expr->values();
|
| - for (int i = 0, len = subexprs->length(); i < len; i++) {
|
| - Expression* subexpr = subexprs->at(i);
|
| - if (subexpr->AsLiteral() != NULL) continue;
|
| - if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue;
|
| - Visit(subexpr);
|
| - CHECK_BAILOUT;
|
| - }
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitCatchExtensionObject(
|
| - CatchExtensionObject* expr) {
|
| - Visit(expr->key());
|
| - CHECK_BAILOUT;
|
| - Visit(expr->value());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitAssignment(Assignment* expr) {
|
| - Token::Value op = expr->op();
|
| - if (op == Token::INIT_CONST) BAILOUT("initialize constant");
|
| -
|
| - Variable* var = expr->target()->AsVariableProxy()->AsVariable();
|
| - Property* prop = expr->target()->AsProperty();
|
| - ASSERT(var == NULL || prop == NULL);
|
| - if (var != NULL) {
|
| - if (var->mode() == Variable::CONST) BAILOUT("Assignment to const");
|
| - // All other variables are supported.
|
| - } else if (prop != NULL) {
|
| - Visit(prop->obj());
|
| - CHECK_BAILOUT;
|
| - Visit(prop->key());
|
| - CHECK_BAILOUT;
|
| - } else {
|
| - // This is a throw reference error.
|
| - BAILOUT("non-variable/non-property assignment");
|
| - }
|
| -
|
| - Visit(expr->value());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitThrow(Throw* expr) {
|
| - Visit(expr->exception());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitProperty(Property* expr) {
|
| - Visit(expr->obj());
|
| - CHECK_BAILOUT;
|
| - Visit(expr->key());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitCall(Call* expr) {
|
| - Expression* fun = expr->expression();
|
| - ZoneList<Expression*>* args = expr->arguments();
|
| - Variable* var = fun->AsVariableProxy()->AsVariable();
|
| -
|
| - // Check for supported calls
|
| - if (var != NULL && var->is_possibly_eval()) {
|
| - BAILOUT("call to the identifier 'eval'");
|
| - } else if (var != NULL && !var->is_this() && var->is_global()) {
|
| - // Calls to global variables are supported.
|
| - } else if (var != NULL && var->slot() != NULL &&
|
| - var->slot()->type() == Slot::LOOKUP) {
|
| - BAILOUT("call to a lookup slot");
|
| - } else if (fun->AsProperty() != NULL) {
|
| - Property* prop = fun->AsProperty();
|
| - Visit(prop->obj());
|
| - CHECK_BAILOUT;
|
| - Visit(prop->key());
|
| - CHECK_BAILOUT;
|
| - } else {
|
| - // Otherwise the call is supported if the function expression is.
|
| - Visit(fun);
|
| - }
|
| - // Check all arguments to the call.
|
| - for (int i = 0; i < args->length(); i++) {
|
| - Visit(args->at(i));
|
| - CHECK_BAILOUT;
|
| - }
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitCallNew(CallNew* expr) {
|
| - Visit(expr->expression());
|
| - CHECK_BAILOUT;
|
| - ZoneList<Expression*>* args = expr->arguments();
|
| - // Check all arguments to the call
|
| - for (int i = 0; i < args->length(); i++) {
|
| - Visit(args->at(i));
|
| - CHECK_BAILOUT;
|
| - }
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitCallRuntime(CallRuntime* expr) {
|
| - // Check for inline runtime call
|
| - if (expr->name()->Get(0) == '_' &&
|
| - CodeGenerator::FindInlineRuntimeLUT(expr->name()) != NULL) {
|
| - BAILOUT("inlined runtime call");
|
| - }
|
| - // Check all arguments to the call. (Relies on TEMP meaning STACK.)
|
| - for (int i = 0; i < expr->arguments()->length(); i++) {
|
| - Visit(expr->arguments()->at(i));
|
| - CHECK_BAILOUT;
|
| - }
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitUnaryOperation(UnaryOperation* expr) {
|
| - switch (expr->op()) {
|
| - case Token::ADD:
|
| - case Token::BIT_NOT:
|
| - case Token::NOT:
|
| - case Token::SUB:
|
| - case Token::TYPEOF:
|
| - case Token::VOID:
|
| - Visit(expr->expression());
|
| - break;
|
| - case Token::DELETE:
|
| - BAILOUT("UnaryOperation: DELETE");
|
| - default:
|
| - UNREACHABLE();
|
| - }
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitCountOperation(CountOperation* expr) {
|
| - Variable* var = expr->expression()->AsVariableProxy()->AsVariable();
|
| - Property* prop = expr->expression()->AsProperty();
|
| - ASSERT(var == NULL || prop == NULL);
|
| - if (var != NULL) {
|
| - // All global variables are supported.
|
| - if (!var->is_global()) {
|
| - ASSERT(var->slot() != NULL);
|
| - Slot::Type type = var->slot()->type();
|
| - if (type == Slot::LOOKUP) {
|
| - BAILOUT("CountOperation with lookup slot");
|
| - }
|
| - }
|
| - } else if (prop != NULL) {
|
| - Visit(prop->obj());
|
| - CHECK_BAILOUT;
|
| - Visit(prop->key());
|
| - CHECK_BAILOUT;
|
| - } else {
|
| - // This is a throw reference error.
|
| - BAILOUT("CountOperation non-variable/non-property expression");
|
| - }
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitBinaryOperation(BinaryOperation* expr) {
|
| - Visit(expr->left());
|
| - CHECK_BAILOUT;
|
| - Visit(expr->right());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitCompareOperation(CompareOperation* expr) {
|
| - Visit(expr->left());
|
| - CHECK_BAILOUT;
|
| - Visit(expr->right());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitCompareToNull(CompareToNull* expr) {
|
| - Visit(expr->expression());
|
| -}
|
| -
|
| -
|
| -void FullCodeGenSyntaxChecker::VisitThisFunction(ThisFunction* expr) {
|
| - // Supported.
|
| -}
|
| -
|
| -#undef BAILOUT
|
| -#undef CHECK_BAILOUT
|
| -
|
| -
|
| void BreakableStatementChecker::Check(Statement* stmt) {
|
| Visit(stmt);
|
| }
|
| @@ -868,10 +462,9 @@
|
| Emit##name(expr->arguments()); \
|
| return; \
|
| }
|
| -
|
| INLINE_RUNTIME_FUNCTION_LIST(CHECK_EMIT_INLINE_CALL)
|
| - UNREACHABLE();
|
| #undef CHECK_EMIT_INLINE_CALL
|
| + UNREACHABLE();
|
| }
|
|
|
|
|
|
|