Index: src/code-stub-assembler.cc |
diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc |
index fff147e9b23ac1265ba9f319ef04a8e6b31c7942..833b4b20ead9bf58d4b0a06ee172b0a7356875bd 100644 |
--- a/src/code-stub-assembler.cc |
+++ b/src/code-stub-assembler.cc |
@@ -1172,9 +1172,13 @@ Node* CodeStubAssembler::LoadDoubleWithHoleCheck(Node* base, Node* offset, |
return Load(machine_type, base, offset); |
} |
+Node* CodeStubAssembler::LoadContextElement(Node* context, int slot_index) { |
+ int offset = Context::SlotOffset(slot_index); |
+ return Load(MachineType::AnyTagged(), context, IntPtrConstant(offset)); |
+} |
+ |
Node* CodeStubAssembler::LoadNativeContext(Node* context) { |
- return LoadFixedArrayElement(context, |
- IntPtrConstant(Context::NATIVE_CONTEXT_INDEX)); |
+ return LoadContextElement(context, Context::NATIVE_CONTEXT_INDEX); |
} |
Node* CodeStubAssembler::LoadJSArrayElementsMap(ElementsKind kind, |
@@ -4434,9 +4438,8 @@ void CodeStubAssembler::LoadGlobalIC(const LoadICParameters* p) { |
AssertInstanceType(handler, CODE_TYPE); |
LoadWithVectorDescriptor descriptor(isolate()); |
Node* native_context = LoadNativeContext(p->context); |
- Node* receiver = LoadFixedArrayElement( |
- native_context, IntPtrConstant(Context::EXTENSION_INDEX), 0, |
- INTPTR_PARAMETERS); |
+ Node* receiver = |
+ LoadContextElement(native_context, Context::EXTENSION_INDEX); |
Node* fake_name = IntPtrConstant(0); |
TailCallStub(descriptor, handler, p->context, receiver, fake_name, p->slot, |
p->vector); |
@@ -4577,7 +4580,11 @@ Node* CodeStubAssembler::EmitKeyedSloppyArguments(Node* receiver, Node* key, |
mapped_index = SmiUntag(mapped_index); |
Node* the_context = LoadFixedArrayElement(elements, IntPtrConstant(0), 0, |
INTPTR_PARAMETERS); |
+ // Assert that we can use LoadFixedArrayElement/StoreFixedArrayElement |
+ // methods for accessing Context. |
STATIC_ASSERT(Context::kHeaderSize == FixedArray::kHeaderSize); |
+ DCHECK_EQ(Context::SlotOffset(0) + kHeapObjectTag, |
+ FixedArray::OffsetOfElementAt(0)); |
if (is_load) { |
Node* result = LoadFixedArrayElement(the_context, mapped_index, 0, |
INTPTR_PARAMETERS); |
@@ -4619,6 +4626,17 @@ Node* CodeStubAssembler::EmitKeyedSloppyArguments(Node* receiver, Node* key, |
return var_result.value(); |
} |
+Node* CodeStubAssembler::LoadScriptContext(Node* context, int context_index) { |
+ Node* native_context = LoadNativeContext(context); |
+ Node* script_context_table = |
+ LoadContextElement(native_context, Context::SCRIPT_CONTEXT_TABLE_INDEX); |
+ |
+ int offset = |
+ ScriptContextTable::GetContextOffset(context_index) - kHeapObjectTag; |
+ return Load(MachineType::AnyTagged(), script_context_table, |
+ IntPtrConstant(offset)); |
+} |
+ |
Node* CodeStubAssembler::EnumLength(Node* map) { |
Node* bitfield_3 = LoadMapBitField3(map); |
Node* enum_length = BitFieldDecode<Map::EnumLengthBits>(bitfield_3); |