Skip to content

Commit 34dc0ee

Browse files
Unreviewed, rolling out r174606.
https://bugs.webkit.org/show_bug.cgi?id=137621 broke a JSC test (Requested by estes on #webkit). Reverted changeset: "Various arguments optimisations in codegen fail to account for arguments being in lexical record" https://bugs.webkit.org/show_bug.cgi?id=137617 http://trac.webkit.org/changeset/174606 git-svn-id: http://svn.webkit.org/repository/webkit/trunk@174610 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent b2d982e commit 34dc0ee

File tree

10 files changed

+35
-57
lines changed

10 files changed

+35
-57
lines changed

Source/JavaScriptCore/ChangeLog

+14
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
2014-10-10 Commit Queue <[email protected]>
2+
3+
Unreviewed, rolling out r174606.
4+
https://bugs.webkit.org/show_bug.cgi?id=137621
5+
6+
broke a JSC test (Requested by estes on #webkit).
7+
8+
Reverted changeset:
9+
10+
"Various arguments optimisations in codegen fail to account
11+
for arguments being in lexical record"
12+
https://bugs.webkit.org/show_bug.cgi?id=137617
13+
http://trac.webkit.org/changeset/174606
14+
115
2014-10-10 Oliver Hunt <[email protected]>
216

317
Various arguments optimisations in codegen fail to account for arguments being in lexical record

Source/JavaScriptCore/bytecode/CodeBlock.cpp

-2
Original file line numberDiff line numberDiff line change
@@ -3887,8 +3887,6 @@ struct VerifyCapturedDef {
38873887

38883888
if (codeBlock->usesArguments() && virtualReg == codeBlock->argumentsRegister())
38893889
return;
3890-
if (codeBlock->usesArguments() && virtualReg == unmodifiedArgumentsRegister(codeBlock->argumentsRegister()))
3891-
return;
38923890

38933891
if (codeBlock->captureCount() && codeBlock->symbolTable()->isCaptured(operand)) {
38943892
codeBlock->beginValidationDidFail();

Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp

+10-25
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, ProgramNode* programNode, UnlinkedP
167167
, m_lexicalEnvironmentRegister(0)
168168
, m_emptyValueRegister(0)
169169
, m_globalObjectRegister(0)
170-
, m_localArgumentsRegister(0)
171170
, m_finallyDepth(0)
172171
, m_localScopeDepth(0)
173172
, m_codeType(GlobalCode)
@@ -212,7 +211,6 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionBodyNode* functionBody, Unl
212211
, m_lexicalEnvironmentRegister(0)
213212
, m_emptyValueRegister(0)
214213
, m_globalObjectRegister(0)
215-
, m_localArgumentsRegister(0)
216214
, m_finallyDepth(0)
217215
, m_localScopeDepth(0)
218216
, m_codeType(FunctionCode)
@@ -252,16 +250,13 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionBodyNode* functionBody, Unl
252250
emitOpcode(op_create_lexical_environment);
253251
instructions().append(m_lexicalEnvironmentRegister->index());
254252
}
255-
RegisterID* localArgumentsRegister = nullptr;
256253
RegisterID* scratch = addVar();
257254
m_symbolTable->setCaptureStart(virtualRegisterForLocal(m_codeBlock->m_numVars).offset());
258255

259256
if (functionBody->usesArguments() || codeBlock->usesEval()) { // May reify arguments object.
260257
RegisterID* unmodifiedArgumentsRegister = addVar(); // Anonymous, so it can't be modified by user code.
261258
RegisterID* argumentsRegister = addVar(propertyNames().arguments, IsVariable, NotWatchable); // Can be changed by assigning to 'arguments'.
262259

263-
localArgumentsRegister = argumentsRegister;
264-
265260
// We can save a little space by hard-coding the knowledge that the two
266261
// 'arguments' values are stored in consecutive registers, and storing
267262
// only the index of the assignable one.
@@ -279,15 +274,6 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionBodyNode* functionBody, Unl
279274
initializeCapturedVariable(argumentsRegister, propertyNames().arguments, argumentsRegister);
280275
RegisterID* uncheckedArgumentsRegister = &registerFor(JSC::unmodifiedArgumentsRegister(m_codeBlock->argumentsRegister()).offset());
281276
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-
}
291277
}
292278
}
293279
}
@@ -400,7 +386,6 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionBodyNode* functionBody, Unl
400386
int nextParameterIndex = CallFrame::thisArgumentOffset();
401387
m_thisRegister.setIndex(nextParameterIndex++);
402388
m_codeBlock->addParameter();
403-
404389
for (size_t i = 0; i < parameters.size(); ++i, ++nextParameterIndex) {
405390
int index = nextParameterIndex;
406391
auto pattern = parameters.at(i);
@@ -434,7 +419,6 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionBodyNode* functionBody, Unl
434419
instructions().append(0);
435420
instructions().append(0);
436421
}
437-
m_localArgumentsRegister = localArgumentsRegister;
438422
}
439423

440424
BytecodeGenerator::BytecodeGenerator(VM& vm, EvalNode* evalNode, UnlinkedEvalCodeBlock* codeBlock, DebuggerMode debuggerMode, ProfilerMode profilerMode)
@@ -447,7 +431,6 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, EvalNode* evalNode, UnlinkedEvalCod
447431
, m_lexicalEnvironmentRegister(0)
448432
, m_emptyValueRegister(0)
449433
, m_globalObjectRegister(0)
450-
, m_localArgumentsRegister(0)
451434
, m_finallyDepth(0)
452435
, m_localScopeDepth(0)
453436
, m_codeType(EvalCode)
@@ -562,17 +545,19 @@ bool BytecodeGenerator::willResolveToArguments(const Identifier& ident)
562545
if (entry.isNull())
563546
return false;
564547

565-
if (m_codeBlock->usesArguments() && m_codeType == FunctionCode && m_localArgumentsRegister)
548+
if (m_codeBlock->usesArguments() && m_codeType == FunctionCode)
566549
return true;
567550

568551
return false;
569552
}
570553

571-
RegisterID* BytecodeGenerator::uncheckedLocalArgumentsRegister()
554+
RegisterID* BytecodeGenerator::uncheckedRegisterForArguments()
572555
{
573556
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 &registerFor(entry.getIndex());
576561
}
577562

578563
RegisterID* BytecodeGenerator::createLazyRegisterIfNecessary(RegisterID* reg)
@@ -1843,7 +1828,7 @@ RegisterID* BytecodeGenerator::emitCall(OpcodeID opcodeID, RegisterID* dst, Regi
18431828
auto expression = static_cast<SpreadExpressionNode*>(n->m_expr)->expression();
18441829
RefPtr<RegisterID> argumentRegister;
18451830
if (expression->isResolveNode() && willResolveToArguments(static_cast<ResolveNode*>(expression)->identifier()) && !symbolTable().slowArguments())
1846-
argumentRegister = uncheckedLocalArgumentsRegister();
1831+
argumentRegister = uncheckedRegisterForArguments();
18471832
else
18481833
argumentRegister = expression->emitBytecode(*this, callArguments.argumentRegister(0));
18491834
RefPtr<RegisterID> thisRegister = emitMove(newTemporary(), callArguments.thisRegister());
@@ -1985,7 +1970,7 @@ RegisterID* BytecodeGenerator::emitConstruct(RegisterID* dst, RegisterID* func,
19851970
auto expression = static_cast<SpreadExpressionNode*>(n->m_expr)->expression();
19861971
RefPtr<RegisterID> argumentRegister;
19871972
if (expression->isResolveNode() && willResolveToArguments(static_cast<ResolveNode*>(expression)->identifier()) && !symbolTable().slowArguments())
1988-
argumentRegister = uncheckedLocalArgumentsRegister();
1973+
argumentRegister = uncheckedRegisterForArguments();
19891974
else
19901975
argumentRegister = expression->emitBytecode(*this, callArguments.argumentRegister(0));
19911976
return emitConstructVarargs(dst, func, argumentRegister.get(), newTemporary(), 0, callArguments.profileHookRegister(), divot, divotStart, divotEnd);
@@ -2553,13 +2538,13 @@ void BytecodeGenerator::emitEnumeration(ThrowableExpressionData* node, Expressio
25532538
emitJump(loopCondition.get());
25542539
emitLabel(loopStart.get());
25552540
emitLoopHint();
2556-
emitGetArgumentByVal(value.get(), uncheckedLocalArgumentsRegister(), index.get());
2541+
emitGetArgumentByVal(value.get(), uncheckedRegisterForArguments(), index.get());
25572542
callBack(*this, value.get());
25582543

25592544
emitLabel(scope->continueTarget());
25602545
emitInc(index.get());
25612546
emitLabel(loopCondition.get());
2562-
RefPtr<RegisterID> length = emitGetArgumentsLength(newTemporary(), uncheckedLocalArgumentsRegister());
2547+
RefPtr<RegisterID> length = emitGetArgumentsLength(newTemporary(), uncheckedRegisterForArguments());
25632548
emitJumpIfTrue(emitEqualityOp(op_less, newTemporary(), index.get(), length.get()), loopStart.get());
25642549
emitLabel(scope->breakTarget());
25652550
return;

Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h

+1-5
Original file line numberDiff line numberDiff line change
@@ -277,9 +277,7 @@ namespace JSC {
277277
void setIsNumericCompareFunction(bool isNumericCompareFunction);
278278

279279
bool willResolveToArguments(const Identifier&);
280-
281-
bool hasSafeLocalArgumentsRegister() { return m_localArgumentsRegister; }
282-
RegisterID* uncheckedLocalArgumentsRegister();
280+
RegisterID* uncheckedRegisterForArguments();
283281

284282
bool isCaptured(int operand);
285283
CaptureMode captureMode(int operand) { return isCaptured(operand) ? IsCaptured : NotCaptured; }
@@ -754,8 +752,6 @@ namespace JSC {
754752
RegisterID* m_lexicalEnvironmentRegister;
755753
RegisterID* m_emptyValueRegister;
756754
RegisterID* m_globalObjectRegister;
757-
RegisterID* m_localArgumentsRegister;
758-
759755
Vector<Identifier, 16> m_watchableVariables;
760756
SegmentedVector<RegisterID, 32> m_constantPoolRegisters;
761757
SegmentedVector<RegisterID, 32> m_calleeRegisters;

Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ RegisterID* BracketAccessorNode::emitBytecode(BytecodeGenerator& generator, Regi
386386
&& !generator.symbolTable().slowArguments()) {
387387
RegisterID* property = generator.emitNode(m_subscript);
388388
generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
389-
return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedLocalArgumentsRegister(), property);
389+
return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedRegisterForArguments(), property);
390390
}
391391

392392
RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base, m_subscriptHasAssignments, m_subscript->isPure(generator));
@@ -412,7 +412,7 @@ RegisterID* DotAccessorNode::emitBytecode(BytecodeGenerator& generator, Register
412412
if (!generator.willResolveToArguments(resolveNode->identifier()))
413413
goto nonArgumentsPath;
414414
generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
415-
return generator.emitGetArgumentsLength(generator.finalDestination(dst), generator.uncheckedLocalArgumentsRegister());
415+
return generator.emitGetArgumentsLength(generator.finalDestination(dst), generator.uncheckedRegisterForArguments());
416416
}
417417

418418
nonArgumentsPath:
@@ -593,7 +593,7 @@ static RegisterID* getArgumentByVal(BytecodeGenerator& generator, ExpressionNode
593593
&& generator.willResolveToArguments(static_cast<ResolveNode*>(base)->identifier())
594594
&& !generator.symbolTable().slowArguments()) {
595595
generator.emitExpressionInfo(divot, divotStart, divotEnd);
596-
return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedLocalArgumentsRegister(), property);
596+
return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedRegisterForArguments(), property);
597597
}
598598
return nullptr;
599599
}
@@ -621,7 +621,7 @@ RegisterID* CallFunctionCallDotNode::emitBytecode(BytecodeGenerator& generator,
621621
RefPtr<RegisterID> thisRegister = getArgumentByVal(generator, subject, generator.emitLoad(0, jsNumber(0)), 0, spread->divot(), spread->divotStart(), spread->divotEnd());
622622
RefPtr<RegisterID> argumentsRegister;
623623
if (thisRegister)
624-
argumentsRegister = generator.uncheckedLocalArgumentsRegister();
624+
argumentsRegister = generator.uncheckedRegisterForArguments();
625625
else {
626626
argumentsRegister = generator.emitNode(subject);
627627
generator.emitExpressionInfo(spread->divot(), spread->divotStart(), spread->divotEnd());
@@ -749,7 +749,7 @@ RegisterID* ApplyFunctionCallDotNode::emitBytecode(BytecodeGenerator& generator,
749749
RefPtr<RegisterID> argsRegister;
750750
ArgumentListNode* args = m_args->m_listNode->m_next;
751751
if (args->m_expr->isResolveNode() && generator.willResolveToArguments(static_cast<ResolveNode*>(args->m_expr)->identifier()) && !generator.symbolTable().slowArguments())
752-
argsRegister = generator.uncheckedLocalArgumentsRegister();
752+
argsRegister = generator.uncheckedRegisterForArguments();
753753
else
754754
argsRegister = generator.emitNode(args->m_expr);
755755

@@ -2721,15 +2721,15 @@ RegisterID* ArrayPatternNode::emitDirectBinding(BytecodeGenerator& generator, Re
27212721
{
27222722
if (rhs->isResolveNode()
27232723
&& generator.willResolveToArguments(static_cast<ResolveNode*>(rhs)->identifier())
2724-
&& generator.hasSafeLocalArgumentsRegister()&& !generator.symbolTable().slowArguments()) {
2724+
&& !generator.symbolTable().slowArguments()) {
27252725
for (size_t i = 0; i < m_targetPatterns.size(); i++) {
27262726
auto target = m_targetPatterns[i];
27272727
if (!target)
27282728
continue;
27292729

27302730
RefPtr<RegisterID> temp = generator.newTemporary();
27312731
generator.emitLoad(temp.get(), jsNumber(i));
2732-
generator.emitGetArgumentByVal(temp.get(), generator.uncheckedLocalArgumentsRegister(), temp.get());
2732+
generator.emitGetArgumentByVal(temp.get(), generator.uncheckedRegisterForArguments(), temp.get());
27332733
target->bindValue(generator, temp.get());
27342734
}
27352735
if (dst == generator.ignoredResult() || !dst)

Source/JavaScriptCore/interpreter/StackVisitor.cpp

-3
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,6 @@ Arguments* StackVisitor::Frame::existingArguments()
295295
else
296296
#endif // ENABLE(DFG_JIT)
297297
reg = codeBlock()->argumentsRegister();
298-
299-
if (codeBlock()->needsActivation())
300-
return jsCast<Arguments*>(callFrame()->lexicalEnvironment()->registerAt(unmodifiedArgumentsRegister(reg).offset()).get());
301298

302299
JSValue result = callFrame()->r(unmodifiedArgumentsRegister(reg).offset()).jsValue();
303300
if (!result || !result.isCell()) // Protect against Undefined in case we throw in op_enter.

Source/JavaScriptCore/parser/Nodes.h

-1
Original file line numberDiff line numberDiff line change
@@ -1440,7 +1440,6 @@ namespace JSC {
14401440
bool usesEval() const { return m_features & EvalFeature; }
14411441
bool usesArguments() const { return (m_features & ArgumentsFeature) && !(m_features & ShadowsArgumentsFeature); }
14421442
bool modifiesParameter() const { return m_features & ModifiedParameterFeature; }
1443-
bool modifiesArguments() const { return m_features & (EvalFeature | ModifiedArgumentsFeature); }
14441443
bool isStrictMode() const { return m_features & StrictModeFeature; }
14451444
void setUsesArguments() { m_features |= ArgumentsFeature; }
14461445
bool usesThis() const { return m_features & ThisFeature; }

Source/JavaScriptCore/parser/Parser.cpp

+2-8
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,7 @@ String Parser<LexerType>::parseInner()
271271

272272
IdentifierSet capturedVariables;
273273
bool modifiedParameter = false;
274-
bool modifiedArguments = false;
275-
scope->getCapturedVariables(capturedVariables, modifiedParameter, modifiedArguments);
274+
scope->getCapturedVariables(capturedVariables, modifiedParameter);
276275

277276
CodeFeatures features = context.features();
278277
if (scope->strictMode())
@@ -281,8 +280,7 @@ String Parser<LexerType>::parseInner()
281280
features |= ShadowsArgumentsFeature;
282281
if (modifiedParameter)
283282
features |= ModifiedParameterFeature;
284-
if (modifiedArguments)
285-
features |= ModifiedArgumentsFeature;
283+
286284
Vector<RefPtr<StringImpl>> closedVariables;
287285
if (m_parsingBuiltin) {
288286
RELEASE_ASSERT(!capturedVariables.size());
@@ -294,10 +292,6 @@ String Parser<LexerType>::parseInner()
294292

295293
if (scope->hasDeclaredParameter(Identifier(m_vm, variable.get())))
296294
continue;
297-
298-
if (variable == m_vm->propertyNames->arguments.impl())
299-
continue;
300-
301295
closedVariables.append(variable);
302296
}
303297
}

Source/JavaScriptCore/parser/Parser.h

+1-5
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ struct Scope {
279279
return true;
280280
}
281281

282-
void getCapturedVariables(IdentifierSet& capturedVariables, bool& modifiedParameter, bool& modifiedArguments)
282+
void getCapturedVariables(IdentifierSet& capturedVariables, bool& modifiedParameter)
283283
{
284284
if (m_needsFullActivation || m_usesEval) {
285285
modifiedParameter = true;
@@ -292,13 +292,9 @@ struct Scope {
292292
capturedVariables.add(*ptr);
293293
}
294294
modifiedParameter = false;
295-
if (shadowsArguments())
296-
modifiedArguments = true;
297295
if (m_declaredParameters.size()) {
298296
IdentifierSet::iterator end = m_writtenVariables.end();
299297
for (IdentifierSet::iterator ptr = m_writtenVariables.begin(); ptr != end; ++ptr) {
300-
if (*ptr == m_vm->propertyNames->arguments.impl())
301-
modifiedArguments = true;
302298
if (!m_declaredParameters.contains(*ptr))
303299
continue;
304300
modifiedParameter = true;

Source/JavaScriptCore/parser/ParserModes.h

-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ const CodeFeatures ThisFeature = 1 << 4;
7575
const CodeFeatures StrictModeFeature = 1 << 5;
7676
const CodeFeatures ShadowsArgumentsFeature = 1 << 6;
7777
const CodeFeatures ModifiedParameterFeature = 1 << 7;
78-
const CodeFeatures ModifiedArgumentsFeature = 1 << 8;
7978

8079
const CodeFeatures AllFeatures = EvalFeature | ArgumentsFeature | WithFeature | CatchFeature | ThisFeature | StrictModeFeature | ShadowsArgumentsFeature | ModifiedParameterFeature;
8180

0 commit comments

Comments
 (0)