Changeset 174610 in webkit
- Timestamp:
- Oct 10, 2014, 1:30:32 PM (11 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r174606 r174610 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 1 15 2014-10-10 Oliver Hunt <[email protected]> 2 16 -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r174606 r174610 3888 3888 if (codeBlock->usesArguments() && virtualReg == codeBlock->argumentsRegister()) 3889 3889 return; 3890 if (codeBlock->usesArguments() && virtualReg == unmodifiedArgumentsRegister(codeBlock->argumentsRegister()))3891 return;3892 3890 3893 3891 if (codeBlock->captureCount() && codeBlock->symbolTable()->isCaptured(operand)) { -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r174606 r174610 168 168 , m_emptyValueRegister(0) 169 169 , m_globalObjectRegister(0) 170 , m_localArgumentsRegister(0)171 170 , m_finallyDepth(0) 172 171 , m_localScopeDepth(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) … … 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()); … … 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 263 localArgumentsRegister = argumentsRegister;264 259 265 260 // We can save a little space by hard-coding the knowledge that the two … … 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 } … … 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; … … 435 420 instructions().append(0); 436 421 } 437 m_localArgumentsRegister = localArgumentsRegister;438 422 } 439 423 … … 448 432 , m_emptyValueRegister(0) 449 433 , m_globalObjectRegister(0) 450 , m_localArgumentsRegister(0)451 434 , m_finallyDepth(0) 452 435 , m_localScopeDepth(0) … … 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 … … 569 552 } 570 553 571 RegisterID* BytecodeGenerator::unchecked LocalArgumentsRegister()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 … … 1844 1829 RefPtr<RegisterID> argumentRegister; 1845 1830 if (expression->isResolveNode() && willResolveToArguments(static_cast<ResolveNode*>(expression)->identifier()) && !symbolTable().slowArguments()) 1846 argumentRegister = unchecked LocalArgumentsRegister();1831 argumentRegister = uncheckedRegisterForArguments(); 1847 1832 else 1848 1833 argumentRegister = expression->emitBytecode(*this, callArguments.argumentRegister(0)); … … 1986 1971 RefPtr<RegisterID> argumentRegister; 1987 1972 if (expression->isResolveNode() && willResolveToArguments(static_cast<ResolveNode*>(expression)->identifier()) && !symbolTable().slowArguments()) 1988 argumentRegister = unchecked LocalArgumentsRegister();1973 argumentRegister = uncheckedRegisterForArguments(); 1989 1974 else 1990 1975 argumentRegister = expression->emitBytecode(*this, callArguments.argumentRegister(0)); … … 2554 2539 emitLabel(loopStart.get()); 2555 2540 emitLoopHint(); 2556 emitGetArgumentByVal(value.get(), unchecked LocalArgumentsRegister(), index.get());2541 emitGetArgumentByVal(value.get(), uncheckedRegisterForArguments(), index.get()); 2557 2542 callBack(*this, value.get()); 2558 2543 … … 2560 2545 emitInc(index.get()); 2561 2546 emitLabel(loopCondition.get()); 2562 RefPtr<RegisterID> length = emitGetArgumentsLength(newTemporary(), unchecked LocalArgumentsRegister());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()); -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r174606 r174610 278 278 279 279 bool willResolveToArguments(const Identifier&); 280 281 bool hasSafeLocalArgumentsRegister() { return m_localArgumentsRegister; } 282 RegisterID* uncheckedLocalArgumentsRegister(); 280 RegisterID* uncheckedRegisterForArguments(); 283 281 284 282 bool isCaptured(int operand); … … 755 753 RegisterID* m_emptyValueRegister; 756 754 RegisterID* m_globalObjectRegister; 757 RegisterID* m_localArgumentsRegister;758 759 755 Vector<Identifier, 16> m_watchableVariables; 760 756 SegmentedVector<RegisterID, 32> m_constantPoolRegisters; -
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r174606 r174610 387 387 RegisterID* property = generator.emitNode(m_subscript); 388 388 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 389 return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.unchecked LocalArgumentsRegister(), property);389 return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedRegisterForArguments(), property); 390 390 } 391 391 … … 413 413 goto nonArgumentsPath; 414 414 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 415 return generator.emitGetArgumentsLength(generator.finalDestination(dst), generator.unchecked LocalArgumentsRegister());415 return generator.emitGetArgumentsLength(generator.finalDestination(dst), generator.uncheckedRegisterForArguments()); 416 416 } 417 417 … … 594 594 && !generator.symbolTable().slowArguments()) { 595 595 generator.emitExpressionInfo(divot, divotStart, divotEnd); 596 return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.unchecked LocalArgumentsRegister(), property);596 return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedRegisterForArguments(), property); 597 597 } 598 598 return nullptr; … … 622 622 RefPtr<RegisterID> argumentsRegister; 623 623 if (thisRegister) 624 argumentsRegister = generator.unchecked LocalArgumentsRegister();624 argumentsRegister = generator.uncheckedRegisterForArguments(); 625 625 else { 626 626 argumentsRegister = generator.emitNode(subject); … … 750 750 ArgumentListNode* args = m_args->m_listNode->m_next; 751 751 if (args->m_expr->isResolveNode() && generator.willResolveToArguments(static_cast<ResolveNode*>(args->m_expr)->identifier()) && !generator.symbolTable().slowArguments()) 752 argsRegister = generator.unchecked LocalArgumentsRegister();752 argsRegister = generator.uncheckedRegisterForArguments(); 753 753 else 754 754 argsRegister = generator.emitNode(args->m_expr); … … 2722 2722 if (rhs->isResolveNode() 2723 2723 && generator.willResolveToArguments(static_cast<ResolveNode*>(rhs)->identifier()) 2724 && generator.hasSafeLocalArgumentsRegister()&&!generator.symbolTable().slowArguments()) {2724 && !generator.symbolTable().slowArguments()) { 2725 2725 for (size_t i = 0; i < m_targetPatterns.size(); i++) { 2726 2726 auto target = m_targetPatterns[i]; … … 2730 2730 RefPtr<RegisterID> temp = generator.newTemporary(); 2731 2731 generator.emitLoad(temp.get(), jsNumber(i)); 2732 generator.emitGetArgumentByVal(temp.get(), generator.unchecked LocalArgumentsRegister(), temp.get());2732 generator.emitGetArgumentByVal(temp.get(), generator.uncheckedRegisterForArguments(), temp.get()); 2733 2733 target->bindValue(generator, temp.get()); 2734 2734 } -
trunk/Source/JavaScriptCore/interpreter/StackVisitor.cpp
r174606 r174610 296 296 #endif // ENABLE(DFG_JIT) 297 297 reg = codeBlock()->argumentsRegister(); 298 299 if (codeBlock()->needsActivation())300 return jsCast<Arguments*>(callFrame()->lexicalEnvironment()->registerAt(unmodifiedArgumentsRegister(reg).offset()).get());301 298 302 299 JSValue result = callFrame()->r(unmodifiedArgumentsRegister(reg).offset()).jsValue(); -
trunk/Source/JavaScriptCore/parser/Nodes.h
r174606 r174610 1441 1441 bool usesArguments() const { return (m_features & ArgumentsFeature) && !(m_features & ShadowsArgumentsFeature); } 1442 1442 bool modifiesParameter() const { return m_features & ModifiedParameterFeature; } 1443 bool modifiesArguments() const { return m_features & (EvalFeature | ModifiedArgumentsFeature); }1444 1443 bool isStrictMode() const { return m_features & StrictModeFeature; } 1445 1444 void setUsesArguments() { m_features |= ArgumentsFeature; } -
trunk/Source/JavaScriptCore/parser/Parser.cpp
r174606 r174610 272 272 IdentifierSet capturedVariables; 273 273 bool modifiedParameter = false; 274 bool modifiedArguments = false; 275 scope->getCapturedVariables(capturedVariables, modifiedParameter, modifiedArguments); 274 scope->getCapturedVariables(capturedVariables, modifiedParameter); 276 275 277 276 CodeFeatures features = context.features(); … … 282 281 if (modifiedParameter) 283 282 features |= ModifiedParameterFeature; 284 if (modifiedArguments) 285 features |= ModifiedArgumentsFeature; 283 286 284 Vector<RefPtr<StringImpl>> closedVariables; 287 285 if (m_parsingBuiltin) { … … 295 293 if (scope->hasDeclaredParameter(Identifier(m_vm, variable.get()))) 296 294 continue; 297 298 if (variable == m_vm->propertyNames->arguments.impl())299 continue;300 301 295 closedVariables.append(variable); 302 296 } -
trunk/Source/JavaScriptCore/parser/Parser.h
r174606 r174610 280 280 } 281 281 282 void getCapturedVariables(IdentifierSet& capturedVariables, bool& modifiedParameter , bool& modifiedArguments)282 void getCapturedVariables(IdentifierSet& capturedVariables, bool& modifiedParameter) 283 283 { 284 284 if (m_needsFullActivation || m_usesEval) { … … 293 293 } 294 294 modifiedParameter = false; 295 if (shadowsArguments())296 modifiedArguments = true;297 295 if (m_declaredParameters.size()) { 298 296 IdentifierSet::iterator end = m_writtenVariables.end(); 299 297 for (IdentifierSet::iterator ptr = m_writtenVariables.begin(); ptr != end; ++ptr) { 300 if (*ptr == m_vm->propertyNames->arguments.impl())301 modifiedArguments = true;302 298 if (!m_declaredParameters.contains(*ptr)) 303 299 continue; -
trunk/Source/JavaScriptCore/parser/ParserModes.h
r174606 r174610 76 76 const CodeFeatures ShadowsArgumentsFeature = 1 << 6; 77 77 const CodeFeatures ModifiedParameterFeature = 1 << 7; 78 const CodeFeatures ModifiedArgumentsFeature = 1 << 8;79 78 80 79 const CodeFeatures AllFeatures = EvalFeature | ArgumentsFeature | WithFeature | CatchFeature | ThisFeature | StrictModeFeature | ShadowsArgumentsFeature | ModifiedParameterFeature;
Note:
See TracChangeset
for help on using the changeset viewer.