⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 100200 in webkit


Ignore:
Timestamp:
Nov 14, 2011, 3:16:27 PM (15 years ago)
Author:
ggaren@apple.com
Message:

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.

Location:
trunk/Source/JavaScriptCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r100198 r100200  
     12011-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
    1332011-11-14  Tony Chang  <tony@chromium.org>
    234
  • trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp

    r100165 r100200  
    18221822    instructions().append(func->index()); // func
    18231823    instructions().append(callArguments.count()); // argCount
    1824     instructions().append(callArguments.callFrame()); // registerOffset
     1824    instructions().append(callArguments.registerOffset()); // registerOffset
    18251825    if (dst != ignoredResult()) {
    18261826        emitOpcode(op_call_put_result);
     
    18691869        instructions().append(m_activationRegister->index());
    18701870        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()) {
    18731872        emitOpcode(op_tear_off_arguments);
    18741873        instructions().append(m_codeBlock->argumentsRegister());
     
    19231922    instructions().append(func->index()); // func
    19241923    instructions().append(callArguments.count()); // argCount
    1925     instructions().append(callArguments.callFrame()); // registerOffset
     1924    instructions().append(callArguments.registerOffset()); // registerOffset
    19261925    if (dst != ignoredResult()) {
    19271926        emitOpcode(op_call_put_result);
     
    23592358}
    23602359
    2361 int BytecodeGenerator::argumentNumberFor(const Identifier& ident)
    2362 {
    2363     int parameterCount = m_parameters.size(); // includes 'this'
     2360bool BytecodeGenerator::isArgumentNumber(const Identifier& ident, int argumentNumber)
     2361{
    23642362    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;
    23692366}
    23702367
  • trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h

    r100165 r100200  
    5656        RegisterID* thisRegister() { return m_argv[0].get(); }
    5757        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; }
    5959        unsigned count() { return m_argv.size(); }
    6060        RegisterID* profileHookRegister() { return m_profileHookRegister.get(); }
     
    6262
    6363    private:
     64        void newArgument(BytecodeGenerator&);
     65
    6466        RefPtr<RegisterID> m_profileHookRegister;
    6567        ArgumentsNode* m_argumentsNode;
    66         Vector<RefPtr<RegisterID>, 16> m_argv;
     68        Vector<RefPtr<RegisterID>, 8> m_argv;
    6769    };
    6870
     
    111113        RegisterID* registerFor(const Identifier&);
    112114
    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);
    115116
    116117        void setIsNumericCompareFunction(bool isNumericCompareFunction);
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r100165 r100200  
    314314}
    315315
    316 CallArguments::CallArguments(BytecodeGenerator& generator, ArgumentsNode* argumentsNode)
     316inline CallArguments::CallArguments(BytecodeGenerator& generator, ArgumentsNode* argumentsNode)
    317317    : m_argumentsNode(argumentsNode)
    318318{
    319319    if (generator.shouldEmitProfileHooks())
    320320        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
     329inline 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());
    329334}
    330335
     
    426431
    427432            m_args->m_listNode = oldList;
    428 
    429433        } else {
    430434            RefPtr<RegisterID> realFunction = generator.emitMove(generator.tempDestination(dst), base.get());
     
    20322036            ExpressionNode* lhsExpression = static_cast<SubNode*>(returnValueExpression)->lhs();
    20332037            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);
    20372044            }
    20382045        }
Note: See TracChangeset for help on using the changeset viewer.