| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 // The stub will rewrite receiver and parameter count if the previous | 199 // The stub will rewrite receiver and parameter count if the previous |
| 200 // stack frame was an arguments adapter frame. | 200 // stack frame was an arguments adapter frame. |
| 201 ArgumentsAccessStub stub(ArgumentsAccessStub::NEW_OBJECT); | 201 ArgumentsAccessStub stub(ArgumentsAccessStub::NEW_OBJECT); |
| 202 __ CallStub(&stub); | 202 __ CallStub(&stub); |
| 203 __ mov(ecx, eax); // Duplicate result. | 203 __ mov(ecx, eax); // Duplicate result. |
| 204 Move(arguments->AsSlot(), eax, ebx, edx); | 204 Move(arguments->AsSlot(), eax, ebx, edx); |
| 205 Slot* dot_arguments_slot = scope()->arguments_shadow()->AsSlot(); | 205 Slot* dot_arguments_slot = scope()->arguments_shadow()->AsSlot(); |
| 206 Move(dot_arguments_slot, ecx, ebx, edx); | 206 Move(dot_arguments_slot, ecx, ebx, edx); |
| 207 } | 207 } |
| 208 | 208 |
| 209 { Comment cmnt(masm_, "[ Declarations"); | |
| 210 // For named function expressions, declare the function name as a | |
| 211 // constant. | |
| 212 if (scope()->is_function_scope() && scope()->function() != NULL) { | |
| 213 EmitDeclaration(scope()->function(), Variable::CONST, NULL); | |
| 214 } | |
| 215 // Visit all the explicit declarations unless there is an illegal | |
| 216 // redeclaration. | |
| 217 if (scope()->HasIllegalRedeclaration()) { | |
| 218 scope()->VisitIllegalRedeclaration(this); | |
| 219 } else { | |
| 220 VisitDeclarations(scope()->declarations()); | |
| 221 } | |
| 222 } | |
| 223 | |
| 224 if (FLAG_trace) { | 209 if (FLAG_trace) { |
| 225 __ CallRuntime(Runtime::kTraceEnter, 0); | 210 __ CallRuntime(Runtime::kTraceEnter, 0); |
| 226 } | 211 } |
| 227 | 212 |
| 228 { Comment cmnt(masm_, "[ Stack check"); | 213 // Visit the declarations and body unless there is an illegal |
| 229 PrepareForBailout(info->function(), NO_REGISTERS); | 214 // redeclaration. |
| 230 NearLabel ok; | 215 if (scope()->HasIllegalRedeclaration()) { |
| 231 ExternalReference stack_limit = | 216 Comment cmnt(masm_, "[ Declarations"); |
| 232 ExternalReference::address_of_stack_limit(); | 217 scope()->VisitIllegalRedeclaration(this); |
| 233 __ cmp(esp, Operand::StaticVariable(stack_limit)); | 218 |
| 234 __ j(above_equal, &ok, taken); | 219 } else { |
| 235 StackCheckStub stub; | 220 { Comment cmnt(masm_, "[ Declarations"); |
| 236 __ CallStub(&stub); | 221 // For named function expressions, declare the function name as a |
| 237 __ bind(&ok); | 222 // constant. |
| 223 if (scope()->is_function_scope() && scope()->function() != NULL) { |
| 224 EmitDeclaration(scope()->function(), Variable::CONST, NULL); |
| 225 } |
| 226 VisitDeclarations(scope()->declarations()); |
| 227 } |
| 228 |
| 229 { Comment cmnt(masm_, "[ Stack check"); |
| 230 PrepareForBailout(info->function(), NO_REGISTERS); |
| 231 NearLabel ok; |
| 232 ExternalReference stack_limit = |
| 233 ExternalReference::address_of_stack_limit(); |
| 234 __ cmp(esp, Operand::StaticVariable(stack_limit)); |
| 235 __ j(above_equal, &ok, taken); |
| 236 StackCheckStub stub; |
| 237 __ CallStub(&stub); |
| 238 __ bind(&ok); |
| 239 } |
| 240 |
| 241 { Comment cmnt(masm_, "[ Body"); |
| 242 ASSERT(loop_depth() == 0); |
| 243 VisitStatements(function()->body()); |
| 244 ASSERT(loop_depth() == 0); |
| 245 } |
| 238 } | 246 } |
| 239 | 247 |
| 240 { Comment cmnt(masm_, "[ Body"); | 248 // Always emit a 'return undefined' in case control fell off the end of |
| 241 ASSERT(loop_depth() == 0); | 249 // the body. |
| 242 VisitStatements(function()->body()); | |
| 243 ASSERT(loop_depth() == 0); | |
| 244 } | |
| 245 | |
| 246 { Comment cmnt(masm_, "[ return <undefined>;"); | 250 { Comment cmnt(masm_, "[ return <undefined>;"); |
| 247 // Emit a 'return undefined' in case control fell off the end of the body. | |
| 248 __ mov(eax, Factory::undefined_value()); | 251 __ mov(eax, Factory::undefined_value()); |
| 249 EmitReturnSequence(); | 252 EmitReturnSequence(); |
| 250 } | 253 } |
| 251 } | 254 } |
| 252 | 255 |
| 253 | 256 |
| 254 void FullCodeGenerator::ClearAccumulator() { | 257 void FullCodeGenerator::ClearAccumulator() { |
| 255 __ Set(eax, Immediate(Smi::FromInt(0))); | 258 __ Set(eax, Immediate(Smi::FromInt(0))); |
| 256 } | 259 } |
| 257 | 260 |
| (...skipping 4132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4390 // And return. | 4393 // And return. |
| 4391 __ ret(0); | 4394 __ ret(0); |
| 4392 } | 4395 } |
| 4393 | 4396 |
| 4394 | 4397 |
| 4395 #undef __ | 4398 #undef __ |
| 4396 | 4399 |
| 4397 } } // namespace v8::internal | 4400 } } // namespace v8::internal |
| 4398 | 4401 |
| 4399 #endif // V8_TARGET_ARCH_IA32 | 4402 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |