OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_X87 | 7 #if V8_TARGET_ARCH_X87 |
8 | 8 |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 #endif | 408 #endif |
409 SetSourcePosition(function()->end_position() - 1); | 409 SetSourcePosition(function()->end_position() - 1); |
410 __ RecordJSReturn(); | 410 __ RecordJSReturn(); |
411 // Do not use the leave instruction here because it is too short to | 411 // Do not use the leave instruction here because it is too short to |
412 // patch with the code required by the debugger. | 412 // patch with the code required by the debugger. |
413 __ mov(esp, ebp); | 413 __ mov(esp, ebp); |
414 int no_frame_start = masm_->pc_offset(); | 414 int no_frame_start = masm_->pc_offset(); |
415 __ pop(ebp); | 415 __ pop(ebp); |
416 | 416 |
417 int arg_count = info_->scope()->num_parameters() + 1; | 417 int arg_count = info_->scope()->num_parameters() + 1; |
418 if (FLAG_experimental_classes && | 418 if (IsSubclassConstructor(info_->function()->kind())) { |
419 IsSubclassConstructor(info_->function()->kind())) { | |
420 arg_count++; | 419 arg_count++; |
421 } | 420 } |
422 int arguments_bytes = arg_count * kPointerSize; | 421 int arguments_bytes = arg_count * kPointerSize; |
423 __ Ret(arguments_bytes, ecx); | 422 __ Ret(arguments_bytes, ecx); |
424 // Check that the size of the code used for returning is large enough | 423 // Check that the size of the code used for returning is large enough |
425 // for the debugger's requirements. | 424 // for the debugger's requirements. |
426 DCHECK(Assembler::kJSReturnSequenceLength <= | 425 DCHECK(Assembler::kJSReturnSequenceLength <= |
427 masm_->SizeOfCodeGeneratedSince(&check_exit_codesize)); | 426 masm_->SizeOfCodeGeneratedSince(&check_exit_codesize)); |
428 info_->AddNoFrameRange(no_frame_start, masm_->pc_offset()); | 427 info_->AddNoFrameRange(no_frame_start, masm_->pc_offset()); |
429 } | 428 } |
(...skipping 2620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3050 PreservePositionScope scope(masm()->positions_recorder()); | 3049 PreservePositionScope scope(masm()->positions_recorder()); |
3051 VisitForStackValue(property->obj()); | 3050 VisitForStackValue(property->obj()); |
3052 } | 3051 } |
3053 if (is_named_call) { | 3052 if (is_named_call) { |
3054 EmitCallWithLoadIC(expr); | 3053 EmitCallWithLoadIC(expr); |
3055 } else { | 3054 } else { |
3056 EmitKeyedCallWithLoadIC(expr, property->key()); | 3055 EmitKeyedCallWithLoadIC(expr, property->key()); |
3057 } | 3056 } |
3058 } | 3057 } |
3059 } else if (call_type == Call::SUPER_CALL) { | 3058 } else if (call_type == Call::SUPER_CALL) { |
3060 if (FLAG_experimental_classes) { | 3059 EmitSuperConstructorCall(expr); |
3061 EmitSuperConstructorCall(expr); | |
3062 } else { | |
3063 SuperReference* super_ref = callee->AsSuperReference(); | |
3064 EmitLoadSuperConstructor(); | |
3065 __ push(result_register()); | |
3066 VisitForStackValue(super_ref->this_var()); | |
3067 EmitCall(expr, CallICState::METHOD); | |
3068 } | |
3069 } else { | 3060 } else { |
3070 DCHECK(call_type == Call::OTHER_CALL); | 3061 DCHECK(call_type == Call::OTHER_CALL); |
3071 // Call to an arbitrary expression not handled specially above. | 3062 // Call to an arbitrary expression not handled specially above. |
3072 { PreservePositionScope scope(masm()->positions_recorder()); | 3063 { PreservePositionScope scope(masm()->positions_recorder()); |
3073 VisitForStackValue(callee); | 3064 VisitForStackValue(callee); |
3074 } | 3065 } |
3075 __ push(Immediate(isolate()->factory()->undefined_value())); | 3066 __ push(Immediate(isolate()->factory()->undefined_value())); |
3076 // Emit function call. | 3067 // Emit function call. |
3077 EmitCall(expr); | 3068 EmitCall(expr); |
3078 } | 3069 } |
(...skipping 2258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5337 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 5328 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), |
5338 Assembler::target_address_at(call_target_address, | 5329 Assembler::target_address_at(call_target_address, |
5339 unoptimized_code)); | 5330 unoptimized_code)); |
5340 return OSR_AFTER_STACK_CHECK; | 5331 return OSR_AFTER_STACK_CHECK; |
5341 } | 5332 } |
5342 | 5333 |
5343 | 5334 |
5344 } } // namespace v8::internal | 5335 } } // namespace v8::internal |
5345 | 5336 |
5346 #endif // V8_TARGET_ARCH_X87 | 5337 #endif // V8_TARGET_ARCH_X87 |
OLD | NEW |