Index: src/ia32/fast-codegen-ia32.cc |
=================================================================== |
--- src/ia32/fast-codegen-ia32.cc (revision 3204) |
+++ src/ia32/fast-codegen-ia32.cc (working copy) |
@@ -85,7 +85,9 @@ |
} |
{ Comment cmnt(masm_, "[ Body"); |
+ ASSERT(loop_depth() == 0); |
VisitStatements(fun->body()); |
+ ASSERT(loop_depth() == 0); |
} |
{ Comment cmnt(masm_, "[ return <undefined>;"); |
@@ -342,7 +344,7 @@ |
void FastCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { |
- Comment cmnt(masm_, "[ RegExp Literal"); |
+ Comment cmnt(masm_, "[ RegExpLiteral"); |
Label done; |
// Registers will be used as follows: |
// edi = JS function. |
@@ -840,8 +842,16 @@ |
EmitCallWithStub(expr); |
} |
} else { |
- // Call to some other function expression. |
- Visit(expr->expression()); |
+ // Call to some other expression. If the expression is an anonymous |
+ // function literal not called in a loop, mark it as one that should |
+ // also use the fast code generator. |
+ FunctionLiteral* lit = fun->AsFunctionLiteral(); |
+ if (lit != NULL && |
+ lit->name()->Equals(Heap::empty_string()) && |
+ loop_depth() == 0) { |
+ lit->mark_as_fast(); |
+ } |
+ Visit(fun); |
// Load global receiver object. |
__ mov(ebx, CodeGenerator::GlobalObject()); |
__ push(FieldOperand(ebx, GlobalObject::kGlobalReceiverOffset)); |
@@ -850,6 +860,7 @@ |
} |
} |
+ |
void FastCodeGenerator::VisitCallNew(CallNew* expr) { |
Comment cmnt(masm_, "[ CallNew"); |
// According to ECMA-262, section 11.2.2, page 44, the function |
@@ -910,7 +921,6 @@ |
void FastCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { |
Comment cmnt(masm_, "[ UnaryOperation"); |
- |
switch (expr->op()) { |
case Token::VOID: |
Visit(expr->expression()); |
@@ -1003,12 +1013,12 @@ |
void FastCodeGenerator::VisitCountOperation(CountOperation* expr) { |
- VariableProxy* v = expr->expression()->AsVariableProxy(); |
- ASSERT(v->AsVariable() != NULL); |
- ASSERT(v->AsVariable()->is_global()); |
+ Comment cmnt(masm_, "[ CountOperation"); |
+ VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
+ ASSERT(proxy->AsVariable() != NULL); |
+ ASSERT(proxy->AsVariable()->is_global()); |
- Visit(v); |
- |
+ Visit(proxy); |
__ InvokeBuiltin(Builtins::TO_NUMBER, CALL_FUNCTION); |
switch (expr->context()) { |
@@ -1034,7 +1044,7 @@ |
__ CallRuntime(Runtime::kNumberSub, 2); |
} |
// Call Store IC. |
- __ mov(ecx, v->AsVariable()->name()); |
+ __ mov(ecx, proxy->AsVariable()->name()); |
__ push(CodeGenerator::GlobalObject()); |
Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); |
__ call(ic, RelocInfo::CODE_TARGET); |
@@ -1076,6 +1086,7 @@ |
void FastCodeGenerator::VisitBinaryOperation(BinaryOperation* expr) { |
+ Comment cmnt(masm_, "[ BinaryOperation"); |
switch (expr->op()) { |
case Token::COMMA: |
ASSERT_EQ(Expression::kEffect, expr->left()->context()); |
@@ -1120,6 +1131,7 @@ |
void FastCodeGenerator::VisitCompareOperation(CompareOperation* expr) { |
+ Comment cmnt(masm_, "[ CompareOperation"); |
ASSERT_EQ(Expression::kValue, expr->left()->context()); |
ASSERT_EQ(Expression::kValue, expr->right()->context()); |
Visit(expr->left()); |