@@ -1472,13 +1472,30 @@ void FullCodeGenerator::EmitGlobalVariableLoad(VariableProxy* proxy,
14721472 Variable* var = proxy->var ();
14731473 DCHECK (var->IsUnallocatedOrGlobalSlot () ||
14741474 (var->IsLookupSlot () && var->mode () == DYNAMIC_GLOBAL ));
1475- __ Ldr (LoadDescriptor::ReceiverRegister (), GlobalObjectMemOperand ());
1476- __ Mov (LoadDescriptor::NameRegister (), Operand (var->name ()));
1477- __ Mov (LoadDescriptor::SlotRegister (),
1478- SmiFromSlot (proxy->VariableFeedbackSlot ()));
1479- // Inside typeof use a regular load, not a contextual load, to avoid
1480- // a reference error.
1481- CallLoadIC (typeof_state == NOT_INSIDE_TYPEOF ? CONTEXTUAL : NOT_CONTEXTUAL );
1475+ if (var->IsGlobalSlot ()) {
1476+ DCHECK (var->index () > 0 );
1477+ DCHECK (var->IsStaticGlobalObjectProperty ());
1478+ // Each var occupies two slots in the context: for reads and writes.
1479+ int slot_index = var->index ();
1480+ int depth = scope ()->ContextChainLength (var->scope ());
1481+ __ Mov (LoadGlobalViaContextDescriptor::DepthRegister (),
1482+ Operand (Smi::FromInt (depth)));
1483+ __ Mov (LoadGlobalViaContextDescriptor::SlotRegister (),
1484+ Operand (Smi::FromInt (slot_index)));
1485+ __ Mov (LoadGlobalViaContextDescriptor::NameRegister (),
1486+ Operand (var->name ()));
1487+ LoadGlobalViaContextStub stub (isolate (), depth);
1488+ __ CallStub (&stub);
1489+
1490+ } else {
1491+ __ Ldr (LoadDescriptor::ReceiverRegister (), GlobalObjectMemOperand ());
1492+ __ Mov (LoadDescriptor::NameRegister (), Operand (var->name ()));
1493+ __ Mov (LoadDescriptor::SlotRegister (),
1494+ SmiFromSlot (proxy->VariableFeedbackSlot ()));
1495+ // Inside typeof use a regular load, not a contextual load, to avoid
1496+ // a reference error.
1497+ CallLoadIC (typeof_state == NOT_INSIDE_TYPEOF ? CONTEXTUAL : NOT_CONTEXTUAL );
1498+ }
14821499}
14831500
14841501
@@ -2439,13 +2456,30 @@ void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot(
24392456void FullCodeGenerator::EmitVariableAssignment (Variable* var, Token::Value op,
24402457 FeedbackVectorICSlot slot) {
24412458 ASM_LOCATION (" FullCodeGenerator::EmitVariableAssignment" );
2442- if (var->IsUnallocatedOrGlobalSlot ()) {
2459+ if (var->IsUnallocated ()) {
24432460 // Global var, const, or let.
24442461 __ Mov (StoreDescriptor::NameRegister (), Operand (var->name ()));
24452462 __ Ldr (StoreDescriptor::ReceiverRegister (), GlobalObjectMemOperand ());
24462463 if (FLAG_vector_stores) EmitLoadStoreICSlot (slot);
24472464 CallStoreIC ();
24482465
2466+ } else if (var->IsGlobalSlot ()) {
2467+ // Global var, const, or let.
2468+ DCHECK (var->index () > 0 );
2469+ DCHECK (var->IsStaticGlobalObjectProperty ());
2470+ // Each var occupies two slots in the context: for reads and writes.
2471+ int slot_index = var->index () + 1 ;
2472+ int depth = scope ()->ContextChainLength (var->scope ());
2473+ __ Mov (StoreGlobalViaContextDescriptor::DepthRegister (),
2474+ Operand (Smi::FromInt (depth)));
2475+ __ Mov (StoreGlobalViaContextDescriptor::SlotRegister (),
2476+ Operand (Smi::FromInt (slot_index)));
2477+ __ Mov (StoreGlobalViaContextDescriptor::NameRegister (),
2478+ Operand (var->name ()));
2479+ DCHECK (StoreGlobalViaContextDescriptor::ValueRegister ().is (x0));
2480+ StoreGlobalViaContextStub stub (isolate (), depth, language_mode ());
2481+ __ CallStub (&stub);
2482+
24492483 } else if (var->mode () == LET && op != Token::INIT_LET ) {
24502484 // Non-initializing assignment to let variable needs a write barrier.
24512485 DCHECK (!var->IsLookupSlot ());
0 commit comments