From 5edd18fc2e78c29594c667b9cfae68c293862d14 Mon Sep 17 00:00:00 2001 From: bmeurer Date: Thu, 30 Jul 2015 02:29:41 -0700 Subject: [PATCH] [runtime] DeclareGlobals and DeclareLookupSlot don't need context parameters. All runtime function get a context anyway, which is the same as the explicit one in case of DeclareGlobals and DeclareLookupSlot. So we can remove the additional parameter there. As an additional bonus, improve the runtime interface to DeclareLookupSlot. R=yangguo@chromium.org Review URL: https://codereview.chromium.org/1261863002 Cr-Commit-Position: refs/heads/master@{#29923} --- src/arm/lithium-codegen-arm.cc | 3 +- src/arm64/lithium-codegen-arm64.cc | 4 +-- src/compiler/ast-graph-builder.cc | 4 +-- src/full-codegen/arm/full-codegen-arm.cc | 21 +++++------- src/full-codegen/arm64/full-codegen-arm64.cc | 21 ++++++------ src/full-codegen/ia32/full-codegen-ia32.cc | 16 ++++----- src/full-codegen/mips/full-codegen-mips.cc | 21 +++++------- src/full-codegen/mips64/full-codegen-mips64.cc | 21 +++++------- src/full-codegen/ppc/full-codegen-ppc.cc | 22 ++++++------ src/full-codegen/x64/full-codegen-x64.cc | 16 ++++----- src/full-codegen/x87/full-codegen-x87.cc | 16 ++++----- src/ia32/lithium-codegen-ia32.cc | 3 +- src/mips/lithium-codegen-mips.cc | 5 ++- src/mips64/lithium-codegen-mips64.cc | 5 ++- src/ppc/lithium-codegen-ppc.cc | 3 +- src/runtime/runtime-scopes.cc | 46 ++++++++++++++++++-------- src/runtime/runtime.h | 5 +-- src/x64/lithium-codegen-x64.cc | 3 +- src/x87/lithium-codegen-x87.cc | 3 +- 19 files changed, 113 insertions(+), 125 deletions(-) diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc index d5a3d81..51d56ca 100644 --- a/src/arm/lithium-codegen-arm.cc +++ b/src/arm/lithium-codegen-arm.cc @@ -3582,12 +3582,11 @@ void LCodeGen::DoContext(LContext* instr) { void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { DCHECK(ToRegister(instr->context()).is(cp)); - __ push(cp); // The context is the first argument. __ Move(scratch0(), instr->hydrogen()->pairs()); __ push(scratch0()); __ mov(scratch0(), Operand(Smi::FromInt(instr->hydrogen()->flags()))); __ push(scratch0()); - CallRuntime(Runtime::kDeclareGlobals, 3, instr); + CallRuntime(Runtime::kDeclareGlobals, 2, instr); } diff --git a/src/arm64/lithium-codegen-arm64.cc b/src/arm64/lithium-codegen-arm64.cc index 3a2ef8f..6fb1088 100644 --- a/src/arm64/lithium-codegen-arm64.cc +++ b/src/arm64/lithium-codegen-arm64.cc @@ -5035,8 +5035,8 @@ void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { // here. __ LoadHeapObject(scratch1, instr->hydrogen()->pairs()); __ Mov(scratch2, Smi::FromInt(instr->hydrogen()->flags())); - __ Push(cp, scratch1, scratch2); // The context is the first argument. - CallRuntime(Runtime::kDeclareGlobals, 3, instr); + __ Push(scratch1, scratch2); + CallRuntime(Runtime::kDeclareGlobals, 2, instr); } diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc index a9a7678..db61cd1 100644 --- a/src/compiler/ast-graph-builder.cc +++ b/src/compiler/ast-graph-builder.cc @@ -2917,8 +2917,8 @@ void AstGraphBuilder::VisitDeclarations(ZoneList* declarations) { DeclareGlobalsLanguageMode::encode(language_mode()); Node* flags = jsgraph()->Constant(encoded_flags); Node* pairs = jsgraph()->Constant(data); - const Operator* op = javascript()->CallRuntime(Runtime::kDeclareGlobals, 3); - Node* call = NewNode(op, current_context(), pairs, flags); + const Operator* op = javascript()->CallRuntime(Runtime::kDeclareGlobals, 2); + Node* call = NewNode(op, pairs, flags); PrepareFrameState(call, BailoutId::Declarations()); globals()->clear(); } diff --git a/src/full-codegen/arm/full-codegen-arm.cc b/src/full-codegen/arm/full-codegen-arm.cc index 236a6d8..e7742b0 100644 --- a/src/full-codegen/arm/full-codegen-arm.cc +++ b/src/full-codegen/arm/full-codegen-arm.cc @@ -860,21 +860,20 @@ void FullCodeGenerator::VisitVariableDeclaration( __ mov(r2, Operand(variable->name())); // Declaration nodes are always introduced in one of four modes. DCHECK(IsDeclaredVariableMode(mode)); - PropertyAttributes attr = - IsImmutableVariableMode(mode) ? READ_ONLY : NONE; - __ mov(r1, Operand(Smi::FromInt(attr))); // Push initial value, if any. // Note: For variables we must not push an initial value (such as // 'undefined') because we may have a (legal) redeclaration and we // must not destroy the current value. if (hole_init) { __ LoadRoot(r0, Heap::kTheHoleValueRootIndex); - __ Push(cp, r2, r1, r0); } else { __ mov(r0, Operand(Smi::FromInt(0))); // Indicates no initial value. - __ Push(cp, r2, r1, r0); } - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ Push(r2, r0); + __ CallRuntime(IsImmutableVariableMode(mode) + ? Runtime::kDeclareReadOnlyLookupSlot + : Runtime::kDeclareLookupSlot, + 2); break; } } @@ -927,11 +926,10 @@ void FullCodeGenerator::VisitFunctionDeclaration( case VariableLocation::LOOKUP: { Comment cmnt(masm_, "[ FunctionDeclaration"); __ mov(r2, Operand(variable->name())); - __ mov(r1, Operand(Smi::FromInt(NONE))); - __ Push(cp, r2, r1); + __ Push(r2); // Push initial value for function declaration. VisitForStackValue(declaration->fun()); - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ CallRuntime(Runtime::kDeclareLookupSlot, 2); break; } } @@ -940,11 +938,10 @@ void FullCodeGenerator::VisitFunctionDeclaration( void FullCodeGenerator::DeclareGlobals(Handle pairs) { // Call the runtime to declare the globals. - // The context is the first argument. __ mov(r1, Operand(pairs)); __ mov(r0, Operand(Smi::FromInt(DeclareGlobalsFlags()))); - __ Push(cp, r1, r0); - __ CallRuntime(Runtime::kDeclareGlobals, 3); + __ Push(r1, r0); + __ CallRuntime(Runtime::kDeclareGlobals, 2); // Return value is ignored. } diff --git a/src/full-codegen/arm64/full-codegen-arm64.cc b/src/full-codegen/arm64/full-codegen-arm64.cc index 62db03a..6cd4900 100644 --- a/src/full-codegen/arm64/full-codegen-arm64.cc +++ b/src/full-codegen/arm64/full-codegen-arm64.cc @@ -861,21 +861,21 @@ void FullCodeGenerator::VisitVariableDeclaration( __ Mov(x2, Operand(variable->name())); // Declaration nodes are always introduced in one of four modes. DCHECK(IsDeclaredVariableMode(mode)); - PropertyAttributes attr = IsImmutableVariableMode(mode) ? READ_ONLY - : NONE; - __ Mov(x1, Smi::FromInt(attr)); // Push initial value, if any. // Note: For variables we must not push an initial value (such as // 'undefined') because we may have a (legal) redeclaration and we // must not destroy the current value. if (hole_init) { __ LoadRoot(x0, Heap::kTheHoleValueRootIndex); - __ Push(cp, x2, x1, x0); + __ Push(x2, x0); } else { // Pushing 0 (xzr) indicates no initial value. - __ Push(cp, x2, x1, xzr); + __ Push(x2, xzr); } - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ CallRuntime(IsImmutableVariableMode(mode) + ? Runtime::kDeclareReadOnlyLookupSlot + : Runtime::kDeclareLookupSlot, + 2); break; } } @@ -928,11 +928,10 @@ void FullCodeGenerator::VisitFunctionDeclaration( case VariableLocation::LOOKUP: { Comment cmnt(masm_, "[ Function Declaration"); __ Mov(x2, Operand(variable->name())); - __ Mov(x1, Smi::FromInt(NONE)); - __ Push(cp, x2, x1); + __ Push(x2); // Push initial value for function declaration. VisitForStackValue(declaration->fun()); - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ CallRuntime(Runtime::kDeclareLookupSlot, 2); break; } } @@ -947,8 +946,8 @@ void FullCodeGenerator::DeclareGlobals(Handle pairs) { flags = x10; __ Mov(flags, Smi::FromInt(DeclareGlobalsFlags())); } - __ Push(cp, x11, flags); - __ CallRuntime(Runtime::kDeclareGlobals, 3); + __ Push(x11, flags); + __ CallRuntime(Runtime::kDeclareGlobals, 2); // Return value is ignored. } diff --git a/src/full-codegen/ia32/full-codegen-ia32.cc b/src/full-codegen/ia32/full-codegen-ia32.cc index 6652c92..d14939b 100644 --- a/src/full-codegen/ia32/full-codegen-ia32.cc +++ b/src/full-codegen/ia32/full-codegen-ia32.cc @@ -809,13 +809,9 @@ void FullCodeGenerator::VisitVariableDeclaration( case VariableLocation::LOOKUP: { Comment cmnt(masm_, "[ VariableDeclaration"); - __ push(esi); __ push(Immediate(variable->name())); // VariableDeclaration nodes are always introduced in one of four modes. DCHECK(IsDeclaredVariableMode(mode)); - PropertyAttributes attr = - IsImmutableVariableMode(mode) ? READ_ONLY : NONE; - __ push(Immediate(Smi::FromInt(attr))); // Push initial value, if any. // Note: For variables we must not push an initial value (such as // 'undefined') because we may have a (legal) redeclaration and we @@ -825,7 +821,10 @@ void FullCodeGenerator::VisitVariableDeclaration( } else { __ push(Immediate(Smi::FromInt(0))); // Indicates no initial value. } - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ CallRuntime(IsImmutableVariableMode(mode) + ? Runtime::kDeclareReadOnlyLookupSlot + : Runtime::kDeclareLookupSlot, + 2); break; } } @@ -875,11 +874,9 @@ void FullCodeGenerator::VisitFunctionDeclaration( case VariableLocation::LOOKUP: { Comment cmnt(masm_, "[ FunctionDeclaration"); - __ push(esi); __ push(Immediate(variable->name())); - __ push(Immediate(Smi::FromInt(NONE))); VisitForStackValue(declaration->fun()); - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ CallRuntime(Runtime::kDeclareLookupSlot, 2); break; } } @@ -888,10 +885,9 @@ void FullCodeGenerator::VisitFunctionDeclaration( void FullCodeGenerator::DeclareGlobals(Handle pairs) { // Call the runtime to declare the globals. - __ push(esi); // The context is the first argument. __ Push(pairs); __ Push(Smi::FromInt(DeclareGlobalsFlags())); - __ CallRuntime(Runtime::kDeclareGlobals, 3); + __ CallRuntime(Runtime::kDeclareGlobals, 2); // Return value is ignored. } diff --git a/src/full-codegen/mips/full-codegen-mips.cc b/src/full-codegen/mips/full-codegen-mips.cc index 47fe911..f28ba8b 100644 --- a/src/full-codegen/mips/full-codegen-mips.cc +++ b/src/full-codegen/mips/full-codegen-mips.cc @@ -864,22 +864,21 @@ void FullCodeGenerator::VisitVariableDeclaration( __ li(a2, Operand(variable->name())); // Declaration nodes are always introduced in one of four modes. DCHECK(IsDeclaredVariableMode(mode)); - PropertyAttributes attr = - IsImmutableVariableMode(mode) ? READ_ONLY : NONE; - __ li(a1, Operand(Smi::FromInt(attr))); // Push initial value, if any. // Note: For variables we must not push an initial value (such as // 'undefined') because we may have a (legal) redeclaration and we // must not destroy the current value. if (hole_init) { __ LoadRoot(a0, Heap::kTheHoleValueRootIndex); - __ Push(cp, a2, a1, a0); } else { DCHECK(Smi::FromInt(0) == 0); __ mov(a0, zero_reg); // Smi::FromInt(0) indicates no initial value. - __ Push(cp, a2, a1, a0); } - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ Push(a2, a0); + __ CallRuntime(IsImmutableVariableMode(mode) + ? Runtime::kDeclareReadOnlyLookupSlot + : Runtime::kDeclareLookupSlot, + 2); break; } } @@ -932,11 +931,10 @@ void FullCodeGenerator::VisitFunctionDeclaration( case VariableLocation::LOOKUP: { Comment cmnt(masm_, "[ FunctionDeclaration"); __ li(a2, Operand(variable->name())); - __ li(a1, Operand(Smi::FromInt(NONE))); - __ Push(cp, a2, a1); + __ Push(a2); // Push initial value for function declaration. VisitForStackValue(declaration->fun()); - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ CallRuntime(Runtime::kDeclareLookupSlot, 2); break; } } @@ -945,11 +943,10 @@ void FullCodeGenerator::VisitFunctionDeclaration( void FullCodeGenerator::DeclareGlobals(Handle pairs) { // Call the runtime to declare the globals. - // The context is the first argument. __ li(a1, Operand(pairs)); __ li(a0, Operand(Smi::FromInt(DeclareGlobalsFlags()))); - __ Push(cp, a1, a0); - __ CallRuntime(Runtime::kDeclareGlobals, 3); + __ Push(a1, a0); + __ CallRuntime(Runtime::kDeclareGlobals, 2); // Return value is ignored. } diff --git a/src/full-codegen/mips64/full-codegen-mips64.cc b/src/full-codegen/mips64/full-codegen-mips64.cc index 89c5593..50b5976 100644 --- a/src/full-codegen/mips64/full-codegen-mips64.cc +++ b/src/full-codegen/mips64/full-codegen-mips64.cc @@ -860,22 +860,21 @@ void FullCodeGenerator::VisitVariableDeclaration( __ li(a2, Operand(variable->name())); // Declaration nodes are always introduced in one of four modes. DCHECK(IsDeclaredVariableMode(mode)); - PropertyAttributes attr = - IsImmutableVariableMode(mode) ? READ_ONLY : NONE; - __ li(a1, Operand(Smi::FromInt(attr))); // Push initial value, if any. // Note: For variables we must not push an initial value (such as // 'undefined') because we may have a (legal) redeclaration and we // must not destroy the current value. if (hole_init) { __ LoadRoot(a0, Heap::kTheHoleValueRootIndex); - __ Push(cp, a2, a1, a0); } else { DCHECK(Smi::FromInt(0) == 0); __ mov(a0, zero_reg); // Smi::FromInt(0) indicates no initial value. - __ Push(cp, a2, a1, a0); } - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ Push(a2, a0); + __ CallRuntime(IsImmutableVariableMode(mode) + ? Runtime::kDeclareReadOnlyLookupSlot + : Runtime::kDeclareLookupSlot, + 2); break; } } @@ -928,11 +927,10 @@ void FullCodeGenerator::VisitFunctionDeclaration( case VariableLocation::LOOKUP: { Comment cmnt(masm_, "[ FunctionDeclaration"); __ li(a2, Operand(variable->name())); - __ li(a1, Operand(Smi::FromInt(NONE))); - __ Push(cp, a2, a1); + __ Push(a2); // Push initial value for function declaration. VisitForStackValue(declaration->fun()); - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ CallRuntime(Runtime::kDeclareLookupSlot, 2); break; } } @@ -941,11 +939,10 @@ void FullCodeGenerator::VisitFunctionDeclaration( void FullCodeGenerator::DeclareGlobals(Handle pairs) { // Call the runtime to declare the globals. - // The context is the first argument. __ li(a1, Operand(pairs)); __ li(a0, Operand(Smi::FromInt(DeclareGlobalsFlags()))); - __ Push(cp, a1, a0); - __ CallRuntime(Runtime::kDeclareGlobals, 3); + __ Push(a1, a0); + __ CallRuntime(Runtime::kDeclareGlobals, 2); // Return value is ignored. } diff --git a/src/full-codegen/ppc/full-codegen-ppc.cc b/src/full-codegen/ppc/full-codegen-ppc.cc index 8147880..d92048d 100644 --- a/src/full-codegen/ppc/full-codegen-ppc.cc +++ b/src/full-codegen/ppc/full-codegen-ppc.cc @@ -831,21 +831,21 @@ void FullCodeGenerator::VisitVariableDeclaration( __ mov(r5, Operand(variable->name())); // Declaration nodes are always introduced in one of four modes. DCHECK(IsDeclaredVariableMode(mode)); - PropertyAttributes attr = - IsImmutableVariableMode(mode) ? READ_ONLY : NONE; - __ LoadSmiLiteral(r4, Smi::FromInt(attr)); // Push initial value, if any. // Note: For variables we must not push an initial value (such as // 'undefined') because we may have a (legal) redeclaration and we // must not destroy the current value. if (hole_init) { __ LoadRoot(r3, Heap::kTheHoleValueRootIndex); - __ Push(cp, r5, r4, r3); + __ Push(r5, r3); } else { __ LoadSmiLiteral(r3, Smi::FromInt(0)); // Indicates no initial value. - __ Push(cp, r5, r4, r3); + __ Push(r5, r3); } - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ CallRuntime(IsImmutableVariableMode(mode) + ? Runtime::kDeclareReadOnlyLookupSlot + : Runtime::kDeclareLookupSlot, + 2); break; } } @@ -893,11 +893,10 @@ void FullCodeGenerator::VisitFunctionDeclaration( case VariableLocation::LOOKUP: { Comment cmnt(masm_, "[ FunctionDeclaration"); __ mov(r5, Operand(variable->name())); - __ LoadSmiLiteral(r4, Smi::FromInt(NONE)); - __ Push(cp, r5, r4); + __ Push(r5); // Push initial value for function declaration. VisitForStackValue(declaration->fun()); - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ CallRuntime(Runtime::kDeclareLookupSlot, 2); break; } } @@ -906,11 +905,10 @@ void FullCodeGenerator::VisitFunctionDeclaration( void FullCodeGenerator::DeclareGlobals(Handle pairs) { // Call the runtime to declare the globals. - // The context is the first argument. __ mov(r4, Operand(pairs)); __ LoadSmiLiteral(r3, Smi::FromInt(DeclareGlobalsFlags())); - __ Push(cp, r4, r3); - __ CallRuntime(Runtime::kDeclareGlobals, 3); + __ Push(r4, r3); + __ CallRuntime(Runtime::kDeclareGlobals, 2); // Return value is ignored. } diff --git a/src/full-codegen/x64/full-codegen-x64.cc b/src/full-codegen/x64/full-codegen-x64.cc index 894a64a..5256b1a 100644 --- a/src/full-codegen/x64/full-codegen-x64.cc +++ b/src/full-codegen/x64/full-codegen-x64.cc @@ -823,13 +823,9 @@ void FullCodeGenerator::VisitVariableDeclaration( case VariableLocation::LOOKUP: { Comment cmnt(masm_, "[ VariableDeclaration"); - __ Push(rsi); __ Push(variable->name()); // Declaration nodes are always introduced in one of four modes. DCHECK(IsDeclaredVariableMode(mode)); - PropertyAttributes attr = - IsImmutableVariableMode(mode) ? READ_ONLY : NONE; - __ Push(Smi::FromInt(attr)); // Push initial value, if any. // Note: For variables we must not push an initial value (such as // 'undefined') because we may have a (legal) redeclaration and we @@ -839,7 +835,10 @@ void FullCodeGenerator::VisitVariableDeclaration( } else { __ Push(Smi::FromInt(0)); // Indicates no initial value. } - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ CallRuntime(IsImmutableVariableMode(mode) + ? Runtime::kDeclareReadOnlyLookupSlot + : Runtime::kDeclareLookupSlot, + 2); break; } } @@ -890,11 +889,9 @@ void FullCodeGenerator::VisitFunctionDeclaration( case VariableLocation::LOOKUP: { Comment cmnt(masm_, "[ FunctionDeclaration"); - __ Push(rsi); __ Push(variable->name()); - __ Push(Smi::FromInt(NONE)); VisitForStackValue(declaration->fun()); - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ CallRuntime(Runtime::kDeclareLookupSlot, 2); break; } } @@ -903,10 +900,9 @@ void FullCodeGenerator::VisitFunctionDeclaration( void FullCodeGenerator::DeclareGlobals(Handle pairs) { // Call the runtime to declare the globals. - __ Push(rsi); // The context is the first argument. __ Push(pairs); __ Push(Smi::FromInt(DeclareGlobalsFlags())); - __ CallRuntime(Runtime::kDeclareGlobals, 3); + __ CallRuntime(Runtime::kDeclareGlobals, 2); // Return value is ignored. } diff --git a/src/full-codegen/x87/full-codegen-x87.cc b/src/full-codegen/x87/full-codegen-x87.cc index 40b7836..dbe8a66 100644 --- a/src/full-codegen/x87/full-codegen-x87.cc +++ b/src/full-codegen/x87/full-codegen-x87.cc @@ -806,13 +806,9 @@ void FullCodeGenerator::VisitVariableDeclaration( case VariableLocation::LOOKUP: { Comment cmnt(masm_, "[ VariableDeclaration"); - __ push(esi); __ push(Immediate(variable->name())); // VariableDeclaration nodes are always introduced in one of four modes. DCHECK(IsDeclaredVariableMode(mode)); - PropertyAttributes attr = - IsImmutableVariableMode(mode) ? READ_ONLY : NONE; - __ push(Immediate(Smi::FromInt(attr))); // Push initial value, if any. // Note: For variables we must not push an initial value (such as // 'undefined') because we may have a (legal) redeclaration and we @@ -822,7 +818,10 @@ void FullCodeGenerator::VisitVariableDeclaration( } else { __ push(Immediate(Smi::FromInt(0))); // Indicates no initial value. } - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ CallRuntime(IsImmutableVariableMode(mode) + ? Runtime::kDeclareReadOnlyLookupSlot + : Runtime::kDeclareLookupSlot, + 2); break; } } @@ -868,11 +867,9 @@ void FullCodeGenerator::VisitFunctionDeclaration( case VariableLocation::LOOKUP: { Comment cmnt(masm_, "[ FunctionDeclaration"); - __ push(esi); __ push(Immediate(variable->name())); - __ push(Immediate(Smi::FromInt(NONE))); VisitForStackValue(declaration->fun()); - __ CallRuntime(Runtime::kDeclareLookupSlot, 4); + __ CallRuntime(Runtime::kDeclareLookupSlot, 2); break; } } @@ -881,10 +878,9 @@ void FullCodeGenerator::VisitFunctionDeclaration( void FullCodeGenerator::DeclareGlobals(Handle pairs) { // Call the runtime to declare the globals. - __ push(esi); // The context is the first argument. __ Push(pairs); __ Push(Smi::FromInt(DeclareGlobalsFlags())); - __ CallRuntime(Runtime::kDeclareGlobals, 3); + __ CallRuntime(Runtime::kDeclareGlobals, 2); // Return value is ignored. } diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc index 680dabd..8b528d1 100644 --- a/src/ia32/lithium-codegen-ia32.cc +++ b/src/ia32/lithium-codegen-ia32.cc @@ -3411,10 +3411,9 @@ void LCodeGen::DoContext(LContext* instr) { void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { DCHECK(ToRegister(instr->context()).is(esi)); - __ push(esi); // The context is the first argument. __ push(Immediate(instr->hydrogen()->pairs())); __ push(Immediate(Smi::FromInt(instr->hydrogen()->flags()))); - CallRuntime(Runtime::kDeclareGlobals, 3, instr); + CallRuntime(Runtime::kDeclareGlobals, 2, instr); } diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index 7985dfa..d6af326 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -3521,9 +3521,8 @@ void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { DCHECK(ToRegister(instr->context()).is(cp)); __ li(scratch0(), instr->hydrogen()->pairs()); __ li(scratch1(), Operand(Smi::FromInt(instr->hydrogen()->flags()))); - // The context is the first argument. - __ Push(cp, scratch0(), scratch1()); - CallRuntime(Runtime::kDeclareGlobals, 3, instr); + __ Push(scratch0(), scratch1()); + CallRuntime(Runtime::kDeclareGlobals, 2, instr); } diff --git a/src/mips64/lithium-codegen-mips64.cc b/src/mips64/lithium-codegen-mips64.cc index 364a961..15105aa 100644 --- a/src/mips64/lithium-codegen-mips64.cc +++ b/src/mips64/lithium-codegen-mips64.cc @@ -3686,9 +3686,8 @@ void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { DCHECK(ToRegister(instr->context()).is(cp)); __ li(scratch0(), instr->hydrogen()->pairs()); __ li(scratch1(), Operand(Smi::FromInt(instr->hydrogen()->flags()))); - // The context is the first argument. - __ Push(cp, scratch0(), scratch1()); - CallRuntime(Runtime::kDeclareGlobals, 3, instr); + __ Push(scratch0(), scratch1()); + CallRuntime(Runtime::kDeclareGlobals, 2, instr); } diff --git a/src/ppc/lithium-codegen-ppc.cc b/src/ppc/lithium-codegen-ppc.cc index 74a486f..e5dd69a 100644 --- a/src/ppc/lithium-codegen-ppc.cc +++ b/src/ppc/lithium-codegen-ppc.cc @@ -3762,12 +3762,11 @@ void LCodeGen::DoContext(LContext* instr) { void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { DCHECK(ToRegister(instr->context()).is(cp)); - __ push(cp); // The context is the first argument. __ Move(scratch0(), instr->hydrogen()->pairs()); __ push(scratch0()); __ LoadSmiLiteral(scratch0(), Smi::FromInt(instr->hydrogen()->flags())); __ push(scratch0()); - CallRuntime(Runtime::kDeclareGlobals, 3, instr); + CallRuntime(Runtime::kDeclareGlobals, 2, instr); } diff --git a/src/runtime/runtime-scopes.cc b/src/runtime/runtime-scopes.cc index 948f729..0d69d0a 100644 --- a/src/runtime/runtime-scopes.cc +++ b/src/runtime/runtime-scopes.cc @@ -86,12 +86,12 @@ static Object* DeclareGlobals(Isolate* isolate, Handle global, RUNTIME_FUNCTION(Runtime_DeclareGlobals) { HandleScope scope(isolate); - DCHECK(args.length() == 3); + DCHECK_EQ(2, args.length()); Handle global(isolate->global_object()); + Handle context(isolate->context()); - CONVERT_ARG_HANDLE_CHECKED(Context, context, 0); - CONVERT_ARG_HANDLE_CHECKED(FixedArray, pairs, 1); - CONVERT_SMI_ARG_CHECKED(flags, 2); + CONVERT_ARG_HANDLE_CHECKED(FixedArray, pairs, 0); + CONVERT_SMI_ARG_CHECKED(flags, 1); // Traverse the name/value pairs and set the properties. int length = pairs->length(); @@ -202,20 +202,16 @@ RUNTIME_FUNCTION(Runtime_InitializeConstGlobal) { } -RUNTIME_FUNCTION(Runtime_DeclareLookupSlot) { - HandleScope scope(isolate); - DCHECK(args.length() == 4); +namespace { +Object* DeclareLookupSlot(Isolate* isolate, Handle name, + Handle initial_value, + PropertyAttributes attr) { // Declarations are always made in a function, eval or script context. In // the case of eval code, the context passed is the context of the caller, // which may be some nested context and not the declaration context. - CONVERT_ARG_HANDLE_CHECKED(Context, context_arg, 0); - Handle context(context_arg->declaration_context()); - CONVERT_ARG_HANDLE_CHECKED(String, name, 1); - CONVERT_SMI_ARG_CHECKED(attr_arg, 2); - PropertyAttributes attr = static_cast(attr_arg); - RUNTIME_ASSERT(attr == READ_ONLY || attr == NONE); - CONVERT_ARG_HANDLE_CHECKED(Object, initial_value, 3); + Handle context_arg(isolate->context(), isolate); + Handle context(context_arg->declaration_context(), isolate); // TODO(verwaest): Unify the encoding indicating "var" with DeclareGlobals. bool is_var = *initial_value == NULL; @@ -294,6 +290,28 @@ RUNTIME_FUNCTION(Runtime_DeclareLookupSlot) { return isolate->heap()->undefined_value(); } +} // namespace + + +RUNTIME_FUNCTION(Runtime_DeclareLookupSlot) { + HandleScope scope(isolate); + DCHECK_EQ(2, args.length()); + CONVERT_ARG_HANDLE_CHECKED(String, name, 0); + CONVERT_ARG_HANDLE_CHECKED(Object, initial_value, 1); + + return DeclareLookupSlot(isolate, name, initial_value, NONE); +} + + +RUNTIME_FUNCTION(Runtime_DeclareReadOnlyLookupSlot) { + HandleScope scope(isolate); + DCHECK_EQ(2, args.length()); + CONVERT_ARG_HANDLE_CHECKED(String, name, 0); + CONVERT_ARG_HANDLE_CHECKED(Object, initial_value, 1); + + return DeclareLookupSlot(isolate, name, initial_value, READ_ONLY); +} + RUNTIME_FUNCTION(Runtime_InitializeLegacyConstLookupSlot) { HandleScope scope(isolate); diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 18e8af7..034fa4e 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -538,10 +538,11 @@ namespace internal { #define FOR_EACH_INTRINSIC_SCOPES(F) \ F(ThrowConstAssignError, 0, 1) \ - F(DeclareGlobals, 3, 1) \ + F(DeclareGlobals, 2, 1) \ F(InitializeVarGlobal, 3, 1) \ F(InitializeConstGlobal, 2, 1) \ - F(DeclareLookupSlot, 4, 1) \ + F(DeclareLookupSlot, 2, 1) \ + F(DeclareReadOnlyLookupSlot, 2, 1) \ F(InitializeLegacyConstLookupSlot, 3, 1) \ F(NewArguments, 1, 1) /* TODO(turbofan): Only temporary */ \ F(NewSloppyArguments, 3, 1) \ diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index fcb470d..dea70b5 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -3494,10 +3494,9 @@ void LCodeGen::DoContext(LContext* instr) { void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { DCHECK(ToRegister(instr->context()).is(rsi)); - __ Push(rsi); // The context is the first argument. __ Push(instr->hydrogen()->pairs()); __ Push(Smi::FromInt(instr->hydrogen()->flags())); - CallRuntime(Runtime::kDeclareGlobals, 3, instr); + CallRuntime(Runtime::kDeclareGlobals, 2, instr); } diff --git a/src/x87/lithium-codegen-x87.cc b/src/x87/lithium-codegen-x87.cc index 1c632ba..b88e29c 100644 --- a/src/x87/lithium-codegen-x87.cc +++ b/src/x87/lithium-codegen-x87.cc @@ -3681,10 +3681,9 @@ void LCodeGen::DoContext(LContext* instr) { void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { DCHECK(ToRegister(instr->context()).is(esi)); - __ push(esi); // The context is the first argument. __ push(Immediate(instr->hydrogen()->pairs())); __ push(Immediate(Smi::FromInt(instr->hydrogen()->flags()))); - CallRuntime(Runtime::kDeclareGlobals, 3, instr); + CallRuntime(Runtime::kDeclareGlobals, 2, instr); } -- 2.7.4