Changeset 63244 in webkit for trunk/JavaScriptCore/bytecompiler
- Timestamp:
- Jul 13, 2010, 1:34:11 PM (15 years ago)
- Location:
- trunk/JavaScriptCore/bytecompiler
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r62896 r63244 153 153 if ((m_codeType == FunctionCode && !m_codeBlock->needsFullScopeChain() && !m_codeBlock->usesArguments()) || m_codeType == EvalCode) 154 154 symbolTable().clear(); 155 156 m_codeBlock->setIsNumericCompareFunction(instructions() == m_globalData->numericCompareFunction(m_scopeChain->globalObject()->globalExec()));157 155 158 156 #if !ENABLE(OPCODE_SAMPLING) … … 2046 2044 } 2047 2045 2046 void BytecodeGenerator::setIsNumericCompareFunction(bool isNumericCompareFunction) 2047 { 2048 m_codeBlock->setIsNumericCompareFunction(isNumericCompareFunction); 2049 } 2050 2051 int BytecodeGenerator::argumentNumberFor(const Identifier& ident) 2052 { 2053 int parameterCount = m_parameters.size(); // includes 'this' 2054 int index = registerFor(ident)->index() + RegisterFile::CallFrameHeaderSize + parameterCount; 2055 return (index > 0 && index < parameterCount) ? index : 0; 2056 } 2057 2048 2058 } // namespace JSC -
trunk/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r62896 r63244 109 109 // require explicit reference counting. 110 110 RegisterID* registerFor(const Identifier&); 111 111 112 // Returns the agument number if this is an argument, or 0 if not. 113 int argumentNumberFor(const Identifier&); 114 115 void setIsNumericCompareFunction(bool isNumericCompareFunction); 116 112 117 bool willResolveToArguments(const Identifier&); 113 118 RegisterID* uncheckedRegisterForArguments(); -
trunk/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r62896 r63244 1360 1360 } 1361 1361 1362 inline StatementNode* BlockNode::singleStatement() const 1363 { 1364 return m_statements ? m_statements->singleStatement() : 0; 1365 } 1366 1362 1367 RegisterID* BlockNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1363 1368 { … … 2012 2017 generator.emitDebugHook(DidEnterCallFrame, firstLine(), lastLine()); 2013 2018 emitStatementsBytecode(generator, generator.ignoredResult()); 2019 2014 2020 StatementNode* singleStatement = this->singleStatement(); 2021 ReturnNode* returnNode = 0; 2022 2023 // Check for a return statement at the end of a function composed of a single block. 2015 2024 if (singleStatement && singleStatement->isBlock()) { 2016 2025 StatementNode* lastStatementInBlock = static_cast<BlockNode*>(singleStatement)->lastStatement(); 2017 2026 if (lastStatementInBlock && lastStatementInBlock->isReturnNode()) 2018 return 0; 2019 } 2020 2021 RegisterID* r0 = generator.isConstructor() ? generator.thisRegister() : generator.emitLoad(0, jsUndefined()); 2022 generator.emitDebugHook(WillLeaveCallFrame, firstLine(), lastLine()); 2023 generator.emitReturn(r0); 2027 returnNode = static_cast<ReturnNode*>(lastStatementInBlock); 2028 } 2029 2030 // If there is no return we must automatically insert one. 2031 if (!returnNode) { 2032 RegisterID* r0 = generator.isConstructor() ? generator.thisRegister() : generator.emitLoad(0, jsUndefined()); 2033 generator.emitDebugHook(WillLeaveCallFrame, firstLine(), lastLine()); 2034 generator.emitReturn(r0); 2035 return 0; 2036 } 2037 2038 // If there is a return statment, and it is the only statement in the function, check if this is a numeric compare. 2039 if (returnNode && static_cast<BlockNode*>(singleStatement)->singleStatement()) { 2040 ExpressionNode* returnValueExpression = returnNode->value(); 2041 if (returnValueExpression && returnValueExpression->isSubtract()) { 2042 ExpressionNode* lhsExpression = static_cast<SubNode*>(returnValueExpression)->lhs(); 2043 ExpressionNode* rhsExpression = static_cast<SubNode*>(returnValueExpression)->rhs(); 2044 if (lhsExpression->isResolveNode() && rhsExpression->isResolveNode()) { 2045 generator.setIsNumericCompareFunction(generator.argumentNumberFor(static_cast<ResolveNode*>(lhsExpression)->identifier()) == 1 2046 && generator.argumentNumberFor(static_cast<ResolveNode*>(rhsExpression)->identifier()) == 2); 2047 } 2048 } 2049 } 2050 2024 2051 return 0; 2025 2052 }
Note:
See TracChangeset
for help on using the changeset viewer.