Chromium Code Reviews| Index: src/ia32/full-codegen-ia32.cc |
| diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc |
| index 2dbbf0f473b44193f4ff9fa7252f3270d6e444ea..f9ded85ea2de8bf7fb3959c9f954f68a9c057124 100644 |
| --- a/src/ia32/full-codegen-ia32.cc |
| +++ b/src/ia32/full-codegen-ia32.cc |
| @@ -3532,6 +3532,39 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(ZoneList<Expression*>* args) { |
| } |
| +void FullCodeGenerator::EmitIsNativeOrStrictMode(ZoneList<Expression*>* args) { |
| + ASSERT(args->length() == 1); |
| + |
| + // Load the function into eax. |
| + VisitForAccumulatorValue(args->at(0)); |
| + |
| + // Prepare for the test. |
| + Label materialize_true, materialize_false; |
| + Label* if_true = NULL; |
| + Label* if_false = NULL; |
| + Label* fall_through = NULL; |
| + context()->PrepareTest(&materialize_true, &materialize_false, |
| + &if_true, &if_false, &fall_through); |
| + |
| + // Test for strict mode function. |
| + __ mov(ecx, FieldOperand(eax, JSFunction::kSharedFunctionInfoOffset)); |
|
Rico
2011/06/30 06:41:25
I know that we explicitly check for this at the ca
Mads Ager (chromium)
2011/06/30 12:28:10
We explicitly have checks before. We will then go
|
| + __ test_b(FieldOperand(ecx, SharedFunctionInfo::kStrictModeByteOffset), |
| + 1 << SharedFunctionInfo::kStrictModeBitWithinByte); |
| + __ j(not_equal, if_true); |
| + |
| + // Test for native function. |
| + __ test_b(FieldOperand(ecx, SharedFunctionInfo::kNativeByteOffset), |
| + 1 << SharedFunctionInfo::kNativeBitWithinByte); |
| + __ j(not_equal, if_true); |
|
Rico
2011/06/30 06:41:25
You could consider having just one test instructio
Mads Ager (chromium)
2011/06/30 12:28:10
We could. This code is similar to what we do in ap
|
| + |
| + // Not native or strict-mode function. |
| + __ jmp(if_false); |
| + |
| + PrepareForBailoutBeforeSplit(TOS_REG, true, if_true, if_false); |
| + context()->Plug(if_true, if_false); |
| +} |
| + |
| + |
| void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
| Handle<String> name = expr->name(); |
| if (name->length() > 0 && name->Get(0) == '_') { |