A little bit of function call cleanup
https://bugs.webkit.org/show_bug.cgi?id=72314
Reviewed by Oliver Hunt.
* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::emitCall): Renamed callFrame to registerOffset
because this value doesn't give you the offset of the callee's call frame.
(JSC::BytecodeGenerator::emitReturn): Tightened to use equality instead
of greater-than. Removed comment since its reasoning was wrong.
(JSC::BytecodeGenerator::emitConstruct): Updated for rename mentioned above.
(JSC::BytecodeGenerator::isArgumentNumber): Provided a more precise way
to ask this question, giving the bytecode generator more freedom to change
internal implementation details.
* bytecompiler/BytecodeGenerator.h: Reduced default vector capacity because
16 was overkill.
(JSC::CallArguments::registerOffset): Updated for rename mentioned above.
* bytecompiler/NodesCodegen.cpp:
(JSC::CallArguments::CallArguments):
(JSC::CallArguments::newArgument): Factored out argument allocation into
a helper function, so I can change it later.
(JSC::CallFunctionCallDotNode::emitBytecode):
(JSC::FunctionBodyNode::emitBytecode): Use helper function mentioned above.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@100200 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp b/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
index 72ee3de..fe8efcf 100644
--- a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
+++ b/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
@@ -313,19 +313,24 @@
return generator.emitConstruct(generator.finalDestinationOrIgnored(dst), func.get(), callArguments, divot(), startOffset(), endOffset());
}
-CallArguments::CallArguments(BytecodeGenerator& generator, ArgumentsNode* argumentsNode)
+inline CallArguments::CallArguments(BytecodeGenerator& generator, ArgumentsNode* argumentsNode)
: m_argumentsNode(argumentsNode)
{
if (generator.shouldEmitProfileHooks())
m_profileHookRegister = generator.newTemporary();
- m_argv.append(generator.newTemporary());
- if (argumentsNode) {
- for (ArgumentListNode* n = argumentsNode->m_listNode; n; n = n->m_next) {
- m_argv.append(generator.newTemporary());
- // op_call requires the arguments to be a sequential range of registers
- ASSERT(m_argv[m_argv.size() - 1]->index() == m_argv[m_argv.size() - 2]->index() + 1);
- }
- }
+
+ newArgument(generator); // 'this' register.
+ if (!argumentsNode)
+ return;
+ for (ArgumentListNode* n = argumentsNode->m_listNode; n; n = n->m_next)
+ newArgument(generator);
+}
+
+inline void CallArguments::newArgument(BytecodeGenerator& generator)
+{
+ RefPtr<RegisterID> tmp = generator.newTemporary();
+ ASSERT(m_argv.isEmpty() || tmp->index() == m_argv.last()->index() + 1); // Calling convention assumes that all arguments are contiguous.
+ m_argv.append(tmp.release());
}
// ------------------------------ EvalFunctionCallNode ----------------------------------
@@ -425,7 +430,6 @@
generator.emitJump(end.get());
m_args->m_listNode = oldList;
-
} else {
RefPtr<RegisterID> realFunction = generator.emitMove(generator.tempDestination(dst), base.get());
CallArguments callArguments(generator, m_args);
@@ -2031,9 +2035,12 @@
if (returnValueExpression && returnValueExpression->isSubtract()) {
ExpressionNode* lhsExpression = static_cast<SubNode*>(returnValueExpression)->lhs();
ExpressionNode* rhsExpression = static_cast<SubNode*>(returnValueExpression)->rhs();
- if (lhsExpression->isResolveNode() && rhsExpression->isResolveNode()) {
- generator.setIsNumericCompareFunction(generator.argumentNumberFor(static_cast<ResolveNode*>(lhsExpression)->identifier()) == 1
- && generator.argumentNumberFor(static_cast<ResolveNode*>(rhsExpression)->identifier()) == 2);
+ if (lhsExpression->isResolveNode()
+ && rhsExpression->isResolveNode()
+ && generator.isArgumentNumber(static_cast<ResolveNode*>(lhsExpression)->identifier(), 0)
+ && generator.isArgumentNumber(static_cast<ResolveNode*>(rhsExpression)->identifier(), 1)) {
+
+ generator.setIsNumericCompareFunction(true);
}
}
}