| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/interpreter/interpreter-assembler.h" | 5 #include "src/interpreter/interpreter-assembler.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <ostream> | 8 #include <ostream> |
| 9 | 9 |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 Label context_search(this, 2, context_search_loop_variables); | 97 Label context_search(this, 2, context_search_loop_variables); |
| 98 | 98 |
| 99 // Fast path if the depth is 0. | 99 // Fast path if the depth is 0. |
| 100 Branch(Word32Equal(depth, Int32Constant(0)), &context_found, &context_search); | 100 Branch(Word32Equal(depth, Int32Constant(0)), &context_found, &context_search); |
| 101 | 101 |
| 102 // Loop until the depth is 0. | 102 // Loop until the depth is 0. |
| 103 Bind(&context_search); | 103 Bind(&context_search); |
| 104 { | 104 { |
| 105 cur_depth.Bind(Int32Sub(cur_depth.value(), Int32Constant(1))); | 105 cur_depth.Bind(Int32Sub(cur_depth.value(), Int32Constant(1))); |
| 106 cur_context.Bind( | 106 cur_context.Bind( |
| 107 LoadContextSlot(cur_context.value(), Context::PREVIOUS_INDEX)); | 107 LoadContextElement(cur_context.value(), Context::PREVIOUS_INDEX)); |
| 108 | 108 |
| 109 Branch(Word32Equal(cur_depth.value(), Int32Constant(0)), &context_found, | 109 Branch(Word32Equal(cur_depth.value(), Int32Constant(0)), &context_found, |
| 110 &context_search); | 110 &context_search); |
| 111 } | 111 } |
| 112 | 112 |
| 113 Bind(&context_found); | 113 Bind(&context_found); |
| 114 return cur_context.value(); | 114 return cur_context.value(); |
| 115 } | 115 } |
| 116 | 116 |
| 117 void InterpreterAssembler::GotoIfHasContextExtensionUpToDepth(Node* context, | 117 void InterpreterAssembler::GotoIfHasContextExtensionUpToDepth(Node* context, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 128 | 128 |
| 129 // Loop until the depth is 0. | 129 // Loop until the depth is 0. |
| 130 Goto(&context_search); | 130 Goto(&context_search); |
| 131 Bind(&context_search); | 131 Bind(&context_search); |
| 132 { | 132 { |
| 133 // TODO(leszeks): We only need to do this check if the context had a sloppy | 133 // TODO(leszeks): We only need to do this check if the context had a sloppy |
| 134 // eval, we could pass in a context chain bitmask to figure out which | 134 // eval, we could pass in a context chain bitmask to figure out which |
| 135 // contexts actually need to be checked. | 135 // contexts actually need to be checked. |
| 136 | 136 |
| 137 Node* extension_slot = | 137 Node* extension_slot = |
| 138 LoadContextSlot(cur_context.value(), Context::EXTENSION_INDEX); | 138 LoadContextElement(cur_context.value(), Context::EXTENSION_INDEX); |
| 139 | 139 |
| 140 // Jump to the target if the extension slot is not a hole. | 140 // Jump to the target if the extension slot is not a hole. |
| 141 GotoIf(WordNotEqual(extension_slot, TheHoleConstant()), target); | 141 GotoIf(WordNotEqual(extension_slot, TheHoleConstant()), target); |
| 142 | 142 |
| 143 cur_depth.Bind(Int32Sub(cur_depth.value(), Int32Constant(1))); | 143 cur_depth.Bind(Int32Sub(cur_depth.value(), Int32Constant(1))); |
| 144 cur_context.Bind( | 144 cur_context.Bind( |
| 145 LoadContextSlot(cur_context.value(), Context::PREVIOUS_INDEX)); | 145 LoadContextElement(cur_context.value(), Context::PREVIOUS_INDEX)); |
| 146 | 146 |
| 147 GotoIf(Word32NotEqual(cur_depth.value(), Int32Constant(0)), | 147 GotoIf(Word32NotEqual(cur_depth.value(), Int32Constant(0)), |
| 148 &context_search); | 148 &context_search); |
| 149 } | 149 } |
| 150 } | 150 } |
| 151 | 151 |
| 152 Node* InterpreterAssembler::BytecodeOffset() { | 152 Node* InterpreterAssembler::BytecodeOffset() { |
| 153 return bytecode_offset_.value(); | 153 return bytecode_offset_.value(); |
| 154 } | 154 } |
| 155 | 155 |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 IntPtrAdd(IntPtrConstant(offset), WordShl(index, kPointerSizeLog2)); | 478 IntPtrAdd(IntPtrConstant(offset), WordShl(index, kPointerSizeLog2)); |
| 479 if (Is64()) { | 479 if (Is64()) { |
| 480 return ChangeInt32ToInt64( | 480 return ChangeInt32ToInt64( |
| 481 Load(MachineType::Int32(), constant_pool, entry_offset)); | 481 Load(MachineType::Int32(), constant_pool, entry_offset)); |
| 482 } else { | 482 } else { |
| 483 return SmiUntag( | 483 return SmiUntag( |
| 484 Load(MachineType::AnyTagged(), constant_pool, entry_offset)); | 484 Load(MachineType::AnyTagged(), constant_pool, entry_offset)); |
| 485 } | 485 } |
| 486 } | 486 } |
| 487 | 487 |
| 488 Node* InterpreterAssembler::LoadContextSlot(Node* context, int slot_index) { | |
| 489 return Load(MachineType::AnyTagged(), context, | |
| 490 IntPtrConstant(Context::SlotOffset(slot_index))); | |
| 491 } | |
| 492 | |
| 493 Node* InterpreterAssembler::LoadContextSlot(Node* context, Node* slot_index) { | 488 Node* InterpreterAssembler::LoadContextSlot(Node* context, Node* slot_index) { |
| 494 Node* offset = | 489 Node* offset = |
| 495 IntPtrAdd(WordShl(slot_index, kPointerSizeLog2), | 490 IntPtrAdd(WordShl(slot_index, kPointerSizeLog2), |
| 496 IntPtrConstant(Context::kHeaderSize - kHeapObjectTag)); | 491 IntPtrConstant(Context::kHeaderSize - kHeapObjectTag)); |
| 497 return Load(MachineType::AnyTagged(), context, offset); | 492 return Load(MachineType::AnyTagged(), context, offset); |
| 498 } | 493 } |
| 499 | 494 |
| 500 Node* InterpreterAssembler::StoreContextSlot(Node* context, Node* slot_index, | 495 Node* InterpreterAssembler::StoreContextSlot(Node* context, Node* slot_index, |
| 501 Node* value) { | 496 Node* value) { |
| 502 Node* offset = | 497 Node* offset = |
| (...skipping 875 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1378 Goto(&loop); | 1373 Goto(&loop); |
| 1379 } | 1374 } |
| 1380 Bind(&done_loop); | 1375 Bind(&done_loop); |
| 1381 | 1376 |
| 1382 return array; | 1377 return array; |
| 1383 } | 1378 } |
| 1384 | 1379 |
| 1385 } // namespace interpreter | 1380 } // namespace interpreter |
| 1386 } // namespace internal | 1381 } // namespace internal |
| 1387 } // namespace v8 | 1382 } // namespace v8 |
| OLD | NEW |