@@ -167,7 +167,6 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, ProgramNode* programNode, UnlinkedP
167
167
, m_lexicalEnvironmentRegister(0 )
168
168
, m_emptyValueRegister(0 )
169
169
, m_globalObjectRegister(0 )
170
- , m_localArgumentsRegister(0 )
171
170
, m_finallyDepth(0 )
172
171
, m_localScopeDepth(0 )
173
172
, m_codeType(GlobalCode)
@@ -212,7 +211,6 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionBodyNode* functionBody, Unl
212
211
, m_lexicalEnvironmentRegister(0 )
213
212
, m_emptyValueRegister(0 )
214
213
, m_globalObjectRegister(0 )
215
- , m_localArgumentsRegister(0 )
216
214
, m_finallyDepth(0 )
217
215
, m_localScopeDepth(0 )
218
216
, m_codeType(FunctionCode)
@@ -252,16 +250,13 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionBodyNode* functionBody, Unl
252
250
emitOpcode (op_create_lexical_environment);
253
251
instructions ().append (m_lexicalEnvironmentRegister->index ());
254
252
}
255
- RegisterID* localArgumentsRegister = nullptr ;
256
253
RegisterID* scratch = addVar ();
257
254
m_symbolTable->setCaptureStart (virtualRegisterForLocal (m_codeBlock->m_numVars ).offset ());
258
255
259
256
if (functionBody->usesArguments () || codeBlock->usesEval ()) { // May reify arguments object.
260
257
RegisterID* unmodifiedArgumentsRegister = addVar (); // Anonymous, so it can't be modified by user code.
261
258
RegisterID* argumentsRegister = addVar (propertyNames ().arguments , IsVariable, NotWatchable); // Can be changed by assigning to 'arguments'.
262
259
263
- localArgumentsRegister = argumentsRegister;
264
-
265
260
// We can save a little space by hard-coding the knowledge that the two
266
261
// 'arguments' values are stored in consecutive registers, and storing
267
262
// only the index of the assignable one.
@@ -279,15 +274,6 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionBodyNode* functionBody, Unl
279
274
initializeCapturedVariable (argumentsRegister, propertyNames ().arguments , argumentsRegister);
280
275
RegisterID* uncheckedArgumentsRegister = ®isterFor (JSC::unmodifiedArgumentsRegister (m_codeBlock->argumentsRegister ()).offset ());
281
276
initializeCapturedVariable (uncheckedArgumentsRegister, propertyNames ().arguments , uncheckedArgumentsRegister);
282
- if (functionBody->modifiesArguments ()) {
283
- emitOpcode (op_mov);
284
- instructions ().append (argumentsRegister->index ());
285
- instructions ().append (addConstantValue (jsUndefined ())->index ());
286
- emitOpcode (op_mov);
287
- instructions ().append (uncheckedArgumentsRegister->index ());
288
- instructions ().append (addConstantValue (jsUndefined ())->index ());
289
- localArgumentsRegister = nullptr ;
290
- }
291
277
}
292
278
}
293
279
}
@@ -400,7 +386,6 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionBodyNode* functionBody, Unl
400
386
int nextParameterIndex = CallFrame::thisArgumentOffset ();
401
387
m_thisRegister.setIndex (nextParameterIndex++);
402
388
m_codeBlock->addParameter ();
403
-
404
389
for (size_t i = 0 ; i < parameters.size (); ++i, ++nextParameterIndex) {
405
390
int index = nextParameterIndex;
406
391
auto pattern = parameters.at (i);
@@ -434,7 +419,6 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionBodyNode* functionBody, Unl
434
419
instructions ().append (0 );
435
420
instructions ().append (0 );
436
421
}
437
- m_localArgumentsRegister = localArgumentsRegister;
438
422
}
439
423
440
424
BytecodeGenerator::BytecodeGenerator (VM& vm, EvalNode* evalNode, UnlinkedEvalCodeBlock* codeBlock, DebuggerMode debuggerMode, ProfilerMode profilerMode)
@@ -447,7 +431,6 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, EvalNode* evalNode, UnlinkedEvalCod
447
431
, m_lexicalEnvironmentRegister(0 )
448
432
, m_emptyValueRegister(0 )
449
433
, m_globalObjectRegister(0 )
450
- , m_localArgumentsRegister(0 )
451
434
, m_finallyDepth(0 )
452
435
, m_localScopeDepth(0 )
453
436
, m_codeType(EvalCode)
@@ -562,17 +545,19 @@ bool BytecodeGenerator::willResolveToArguments(const Identifier& ident)
562
545
if (entry.isNull ())
563
546
return false ;
564
547
565
- if (m_codeBlock->usesArguments () && m_codeType == FunctionCode && m_localArgumentsRegister )
548
+ if (m_codeBlock->usesArguments () && m_codeType == FunctionCode)
566
549
return true ;
567
550
568
551
return false ;
569
552
}
570
553
571
- RegisterID* BytecodeGenerator::uncheckedLocalArgumentsRegister ()
554
+ RegisterID* BytecodeGenerator::uncheckedRegisterForArguments ()
572
555
{
573
556
ASSERT (willResolveToArguments (propertyNames ().arguments ));
574
- ASSERT (m_localArgumentsRegister);
575
- return m_localArgumentsRegister;
557
+
558
+ SymbolTableEntry entry = symbolTable ().get (propertyNames ().arguments .impl ());
559
+ ASSERT (!entry.isNull ());
560
+ return ®isterFor (entry.getIndex ());
576
561
}
577
562
578
563
RegisterID* BytecodeGenerator::createLazyRegisterIfNecessary (RegisterID* reg)
@@ -1843,7 +1828,7 @@ RegisterID* BytecodeGenerator::emitCall(OpcodeID opcodeID, RegisterID* dst, Regi
1843
1828
auto expression = static_cast <SpreadExpressionNode*>(n->m_expr )->expression ();
1844
1829
RefPtr<RegisterID> argumentRegister;
1845
1830
if (expression->isResolveNode () && willResolveToArguments (static_cast <ResolveNode*>(expression)->identifier ()) && !symbolTable ().slowArguments ())
1846
- argumentRegister = uncheckedLocalArgumentsRegister ();
1831
+ argumentRegister = uncheckedRegisterForArguments ();
1847
1832
else
1848
1833
argumentRegister = expression->emitBytecode (*this , callArguments.argumentRegister (0 ));
1849
1834
RefPtr<RegisterID> thisRegister = emitMove (newTemporary (), callArguments.thisRegister ());
@@ -1985,7 +1970,7 @@ RegisterID* BytecodeGenerator::emitConstruct(RegisterID* dst, RegisterID* func,
1985
1970
auto expression = static_cast <SpreadExpressionNode*>(n->m_expr )->expression ();
1986
1971
RefPtr<RegisterID> argumentRegister;
1987
1972
if (expression->isResolveNode () && willResolveToArguments (static_cast <ResolveNode*>(expression)->identifier ()) && !symbolTable ().slowArguments ())
1988
- argumentRegister = uncheckedLocalArgumentsRegister ();
1973
+ argumentRegister = uncheckedRegisterForArguments ();
1989
1974
else
1990
1975
argumentRegister = expression->emitBytecode (*this , callArguments.argumentRegister (0 ));
1991
1976
return emitConstructVarargs (dst, func, argumentRegister.get (), newTemporary (), 0 , callArguments.profileHookRegister (), divot, divotStart, divotEnd);
@@ -2553,13 +2538,13 @@ void BytecodeGenerator::emitEnumeration(ThrowableExpressionData* node, Expressio
2553
2538
emitJump (loopCondition.get ());
2554
2539
emitLabel (loopStart.get ());
2555
2540
emitLoopHint ();
2556
- emitGetArgumentByVal (value.get (), uncheckedLocalArgumentsRegister (), index .get ());
2541
+ emitGetArgumentByVal (value.get (), uncheckedRegisterForArguments (), index .get ());
2557
2542
callBack (*this , value.get ());
2558
2543
2559
2544
emitLabel (scope->continueTarget ());
2560
2545
emitInc (index .get ());
2561
2546
emitLabel (loopCondition.get ());
2562
- RefPtr<RegisterID> length = emitGetArgumentsLength (newTemporary (), uncheckedLocalArgumentsRegister ());
2547
+ RefPtr<RegisterID> length = emitGetArgumentsLength (newTemporary (), uncheckedRegisterForArguments ());
2563
2548
emitJumpIfTrue (emitEqualityOp (op_less, newTemporary (), index .get (), length.get ()), loopStart.get ());
2564
2549
emitLabel (scope->breakTarget ());
2565
2550
return ;
0 commit comments