| 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 #if V8_TARGET_ARCH_IA32 | 5 #if V8_TARGET_ARCH_IA32 | 
| 6 | 6 | 
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" | 
| 8 #include "src/codegen.h" | 8 #include "src/codegen.h" | 
| 9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" | 
| 10 #include "src/full-codegen/full-codegen.h" | 10 #include "src/full-codegen/full-codegen.h" | 
| (...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 703   __ mov(ebx, FieldOperand(ebx, Cell::kValueOffset)); | 703   __ mov(ebx, FieldOperand(ebx, Cell::kValueOffset)); | 
| 704   __ mov(optimized_code_entry, | 704   __ mov(optimized_code_entry, | 
| 705          FieldOperand(ebx, FeedbackVector::kOptimizedCodeIndex * kPointerSize + | 705          FieldOperand(ebx, FeedbackVector::kOptimizedCodeIndex * kPointerSize + | 
| 706                                FeedbackVector::kHeaderSize)); | 706                                FeedbackVector::kHeaderSize)); | 
| 707   __ mov(optimized_code_entry, | 707   __ mov(optimized_code_entry, | 
| 708          FieldOperand(optimized_code_entry, WeakCell::kValueOffset)); | 708          FieldOperand(optimized_code_entry, WeakCell::kValueOffset)); | 
| 709   __ JumpIfNotSmi(optimized_code_entry, &switch_to_optimized_code); | 709   __ JumpIfNotSmi(optimized_code_entry, &switch_to_optimized_code); | 
| 710 | 710 | 
| 711   // Get the bytecode array from the function object (or from the DebugInfo if | 711   // Get the bytecode array from the function object (or from the DebugInfo if | 
| 712   // it is present) and load it into kInterpreterBytecodeArrayRegister. | 712   // it is present) and load it into kInterpreterBytecodeArrayRegister. | 
|  | 713   Label maybe_load_debug_bytecode_array, bytecode_array_loaded; | 
| 713   __ mov(eax, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); | 714   __ mov(eax, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); | 
| 714   Label load_debug_bytecode_array, bytecode_array_loaded; |  | 
| 715   __ JumpIfNotSmi(FieldOperand(eax, SharedFunctionInfo::kDebugInfoOffset), |  | 
| 716                   &load_debug_bytecode_array); |  | 
| 717   __ mov(kInterpreterBytecodeArrayRegister, | 715   __ mov(kInterpreterBytecodeArrayRegister, | 
| 718          FieldOperand(eax, SharedFunctionInfo::kFunctionDataOffset)); | 716          FieldOperand(eax, SharedFunctionInfo::kFunctionDataOffset)); | 
|  | 717   __ JumpIfNotSmi(FieldOperand(eax, SharedFunctionInfo::kDebugInfoOffset), | 
|  | 718                   &maybe_load_debug_bytecode_array); | 
| 719   __ bind(&bytecode_array_loaded); | 719   __ bind(&bytecode_array_loaded); | 
| 720 | 720 | 
| 721   // Check whether we should continue to use the interpreter. | 721   // Check whether we should continue to use the interpreter. | 
| 722   // TODO(rmcilroy) Remove self healing once liveedit only has to deal with | 722   // TODO(rmcilroy) Remove self healing once liveedit only has to deal with | 
| 723   // Ignition bytecode. | 723   // Ignition bytecode. | 
| 724   Label switch_to_different_code_kind; | 724   Label switch_to_different_code_kind; | 
| 725   __ Move(ecx, masm->CodeObject());  // Self-reference to this code. | 725   __ Move(ecx, masm->CodeObject());  // Self-reference to this code. | 
| 726   __ cmp(ecx, FieldOperand(eax, SharedFunctionInfo::kCodeOffset)); | 726   __ cmp(ecx, FieldOperand(eax, SharedFunctionInfo::kCodeOffset)); | 
| 727   __ j(not_equal, &switch_to_different_code_kind); | 727   __ j(not_equal, &switch_to_different_code_kind); | 
| 728 | 728 | 
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 795                           kInterpreterBytecodeOffsetRegister, times_1, 0)); | 795                           kInterpreterBytecodeOffsetRegister, times_1, 0)); | 
| 796   __ mov(ebx, Operand(kInterpreterDispatchTableRegister, ebx, | 796   __ mov(ebx, Operand(kInterpreterDispatchTableRegister, ebx, | 
| 797                       times_pointer_size, 0)); | 797                       times_pointer_size, 0)); | 
| 798   __ call(ebx); | 798   __ call(ebx); | 
| 799   masm->isolate()->heap()->SetInterpreterEntryReturnPCOffset(masm->pc_offset()); | 799   masm->isolate()->heap()->SetInterpreterEntryReturnPCOffset(masm->pc_offset()); | 
| 800 | 800 | 
| 801   // The return value is in eax. | 801   // The return value is in eax. | 
| 802   LeaveInterpreterFrame(masm, ebx, ecx); | 802   LeaveInterpreterFrame(masm, ebx, ecx); | 
| 803   __ ret(0); | 803   __ ret(0); | 
| 804 | 804 | 
| 805   // Load debug copy of the bytecode array. | 805   // Load debug copy of the bytecode array if it exists. | 
| 806   __ bind(&load_debug_bytecode_array); | 806   // kInterpreterBytecodeArrayRegister is already loaded with | 
| 807   Register debug_info = kInterpreterBytecodeArrayRegister; | 807   // SharedFunctionInfo::kFunctionDataOffset. | 
| 808   __ mov(debug_info, FieldOperand(eax, SharedFunctionInfo::kDebugInfoOffset)); | 808   __ bind(&maybe_load_debug_bytecode_array); | 
|  | 809   __ mov(ecx, FieldOperand(eax, SharedFunctionInfo::kDebugInfoOffset)); | 
|  | 810   __ mov(ebx, FieldOperand(ecx, DebugInfo::kFlagsOffset)); | 
|  | 811   __ SmiUntag(ebx); | 
|  | 812   __ test(ebx, Immediate(DebugInfo::kHasBreakInfo)); | 
|  | 813   __ j(zero, &bytecode_array_loaded); | 
| 809   __ mov(kInterpreterBytecodeArrayRegister, | 814   __ mov(kInterpreterBytecodeArrayRegister, | 
| 810          FieldOperand(debug_info, DebugInfo::kDebugBytecodeArrayIndex)); | 815          FieldOperand(ecx, DebugInfo::kDebugBytecodeArrayOffset)); | 
| 811   __ jmp(&bytecode_array_loaded); | 816   __ jmp(&bytecode_array_loaded); | 
| 812 | 817 | 
| 813   // If the shared code is no longer this entry trampoline, then the underlying | 818   // If the shared code is no longer this entry trampoline, then the underlying | 
| 814   // function has been switched to a different kind of code and we heal the | 819   // function has been switched to a different kind of code and we heal the | 
| 815   // closure by switching the code entry field over to the new code as well. | 820   // closure by switching the code entry field over to the new code as well. | 
| 816   __ bind(&switch_to_different_code_kind); | 821   __ bind(&switch_to_different_code_kind); | 
| 817   __ pop(edx);  // Callee's new target. | 822   __ pop(edx);  // Callee's new target. | 
| 818   __ pop(edi);  // Callee's JS function. | 823   __ pop(edi);  // Callee's JS function. | 
| 819   __ pop(esi);  // Callee's context. | 824   __ pop(esi);  // Callee's context. | 
| 820   __ leave();   // Leave the frame so we can tail call. | 825   __ leave();   // Leave the frame so we can tail call. | 
| (...skipping 2504 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3325   } | 3330   } | 
| 3326   // Now jump to the instructions of the returned code object. | 3331   // Now jump to the instructions of the returned code object. | 
| 3327   __ jmp(edi); | 3332   __ jmp(edi); | 
| 3328 } | 3333 } | 
| 3329 | 3334 | 
| 3330 #undef __ | 3335 #undef __ | 
| 3331 }  // namespace internal | 3336 }  // namespace internal | 
| 3332 }  // namespace v8 | 3337 }  // namespace v8 | 
| 3333 | 3338 | 
| 3334 #endif  // V8_TARGET_ARCH_IA32 | 3339 #endif  // V8_TARGET_ARCH_IA32 | 
| OLD | NEW | 
|---|