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(); |
} |