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