Changeset 100200 in webkit
- Timestamp:
- Nov 14, 2011, 3:16:27 PM (15 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
bytecompiler/BytecodeGenerator.cpp (modified) (4 diffs)
-
bytecompiler/BytecodeGenerator.h (modified) (3 diffs)
-
bytecompiler/NodesCodegen.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r100198 r100200 1 2011-11-14 Geoffrey Garen <ggaren@apple.com> 2 3 A little bit of function call cleanup 4 https://bugs.webkit.org/show_bug.cgi?id=72314 5 6 Reviewed by Oliver Hunt. 7 8 * bytecompiler/BytecodeGenerator.cpp: 9 (JSC::BytecodeGenerator::emitCall): Renamed callFrame to registerOffset 10 because this value doesn't give you the offset of the callee's call frame. 11 12 (JSC::BytecodeGenerator::emitReturn): Tightened to use equality instead 13 of greater-than. Removed comment since its reasoning was wrong. 14 15 (JSC::BytecodeGenerator::emitConstruct): Updated for rename mentioned above. 16 17 (JSC::BytecodeGenerator::isArgumentNumber): Provided a more precise way 18 to ask this question, giving the bytecode generator more freedom to change 19 internal implementation details. 20 21 * bytecompiler/BytecodeGenerator.h: Reduced default vector capacity because 22 16 was overkill. 23 (JSC::CallArguments::registerOffset): Updated for rename mentioned above. 24 25 * bytecompiler/NodesCodegen.cpp: 26 (JSC::CallArguments::CallArguments): 27 (JSC::CallArguments::newArgument): Factored out argument allocation into 28 a helper function, so I can change it later. 29 30 (JSC::CallFunctionCallDotNode::emitBytecode): 31 (JSC::FunctionBodyNode::emitBytecode): Use helper function mentioned above. 32 1 33 2011-11-14 Tony Chang <tony@chromium.org> 2 34 -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r100165 r100200 1822 1822 instructions().append(func->index()); // func 1823 1823 instructions().append(callArguments.count()); // argCount 1824 instructions().append(callArguments. callFrame()); // registerOffset1824 instructions().append(callArguments.registerOffset()); // registerOffset 1825 1825 if (dst != ignoredResult()) { 1826 1826 emitOpcode(op_call_put_result); … … 1869 1869 instructions().append(m_activationRegister->index()); 1870 1870 instructions().append(m_codeBlock->argumentsRegister()); 1871 } else if (m_codeBlock->usesArguments() && m_codeBlock->m_numParameters > 1 1872 && !m_codeBlock->isStrictMode()) { // If there are no named parameters, there's nothing to tear off, since extra / unnamed parameters get copied to the arguments object at construct time. 1871 } else if (m_codeBlock->usesArguments() && m_codeBlock->m_numParameters != 1 && !m_codeBlock->isStrictMode()) { 1873 1872 emitOpcode(op_tear_off_arguments); 1874 1873 instructions().append(m_codeBlock->argumentsRegister()); … … 1923 1922 instructions().append(func->index()); // func 1924 1923 instructions().append(callArguments.count()); // argCount 1925 instructions().append(callArguments. callFrame()); // registerOffset1924 instructions().append(callArguments.registerOffset()); // registerOffset 1926 1925 if (dst != ignoredResult()) { 1927 1926 emitOpcode(op_call_put_result); … … 2359 2358 } 2360 2359 2361 int BytecodeGenerator::argumentNumberFor(const Identifier& ident) 2362 { 2363 int parameterCount = m_parameters.size(); // includes 'this' 2360 bool BytecodeGenerator::isArgumentNumber(const Identifier& ident, int argumentNumber) 2361 { 2364 2362 RegisterID* registerID = registerFor(ident); 2365 if (!registerID) 2366 return 0; 2367 int index = registerID->index() + RegisterFile::CallFrameHeaderSize + parameterCount; 2368 return (index > 0 && index < parameterCount) ? index : 0; 2363 if (!registerID || registerID->index() >= 0) 2364 return 0; 2365 return registerID->index() - m_thisRegister.index() - 1 == argumentNumber; 2369 2366 } 2370 2367 -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r100165 r100200 56 56 RegisterID* thisRegister() { return m_argv[0].get(); } 57 57 RegisterID* argumentRegister(unsigned i) { return m_argv[i + 1].get(); } 58 unsigned callFrame() { return thisRegister()->index() + count() + RegisterFile::CallFrameHeaderSize; }58 unsigned registerOffset() { return thisRegister()->index() + count() + RegisterFile::CallFrameHeaderSize; } 59 59 unsigned count() { return m_argv.size(); } 60 60 RegisterID* profileHookRegister() { return m_profileHookRegister.get(); } … … 62 62 63 63 private: 64 void newArgument(BytecodeGenerator&); 65 64 66 RefPtr<RegisterID> m_profileHookRegister; 65 67 ArgumentsNode* m_argumentsNode; 66 Vector<RefPtr<RegisterID>, 16> m_argv;68 Vector<RefPtr<RegisterID>, 8> m_argv; 67 69 }; 68 70 … … 111 113 RegisterID* registerFor(const Identifier&); 112 114 113 // Returns the agument number if this is an argument, or 0 if not. 114 int argumentNumberFor(const Identifier&); 115 bool isArgumentNumber(const Identifier&, int); 115 116 116 117 void setIsNumericCompareFunction(bool isNumericCompareFunction); -
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r100165 r100200 314 314 } 315 315 316 CallArguments::CallArguments(BytecodeGenerator& generator, ArgumentsNode* argumentsNode)316 inline CallArguments::CallArguments(BytecodeGenerator& generator, ArgumentsNode* argumentsNode) 317 317 : m_argumentsNode(argumentsNode) 318 318 { 319 319 if (generator.shouldEmitProfileHooks()) 320 320 m_profileHookRegister = generator.newTemporary(); 321 m_argv.append(generator.newTemporary()); 322 if (argumentsNode) { 323 for (ArgumentListNode* n = argumentsNode->m_listNode; n; n = n->m_next) { 324 m_argv.append(generator.newTemporary()); 325 // op_call requires the arguments to be a sequential range of registers 326 ASSERT(m_argv[m_argv.size() - 1]->index() == m_argv[m_argv.size() - 2]->index() + 1); 327 } 328 } 321 322 newArgument(generator); // 'this' register. 323 if (!argumentsNode) 324 return; 325 for (ArgumentListNode* n = argumentsNode->m_listNode; n; n = n->m_next) 326 newArgument(generator); 327 } 328 329 inline void CallArguments::newArgument(BytecodeGenerator& generator) 330 { 331 RefPtr<RegisterID> tmp = generator.newTemporary(); 332 ASSERT(m_argv.isEmpty() || tmp->index() == m_argv.last()->index() + 1); // Calling convention assumes that all arguments are contiguous. 333 m_argv.append(tmp.release()); 329 334 } 330 335 … … 426 431 427 432 m_args->m_listNode = oldList; 428 429 433 } else { 430 434 RefPtr<RegisterID> realFunction = generator.emitMove(generator.tempDestination(dst), base.get()); … … 2032 2036 ExpressionNode* lhsExpression = static_cast<SubNode*>(returnValueExpression)->lhs(); 2033 2037 ExpressionNode* rhsExpression = static_cast<SubNode*>(returnValueExpression)->rhs(); 2034 if (lhsExpression->isResolveNode() && rhsExpression->isResolveNode()) { 2035 generator.setIsNumericCompareFunction(generator.argumentNumberFor(static_cast<ResolveNode*>(lhsExpression)->identifier()) == 1 2036 && generator.argumentNumberFor(static_cast<ResolveNode*>(rhsExpression)->identifier()) == 2); 2038 if (lhsExpression->isResolveNode() 2039 && rhsExpression->isResolveNode() 2040 && generator.isArgumentNumber(static_cast<ResolveNode*>(lhsExpression)->identifier(), 0) 2041 && generator.isArgumentNumber(static_cast<ResolveNode*>(rhsExpression)->identifier(), 1)) { 2042 2043 generator.setIsNumericCompareFunction(true); 2037 2044 } 2038 2045 }
Note:
See TracChangeset
for help on using the changeset viewer.