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);
             }
         }
     }