Ignore:
Timestamp:
Jun 1, 2010, 4:13:23 PM (15 years ago)
Author:
[email protected]
Message:

Bug 40021 - Refactor bytecode generation for calls so that register for this & args are allocated together

Reviewed by Sam Weinig.

This is a useful stepping stone towards reversing argument order.

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::BytecodeGenerator):
(JSC::BytecodeGenerator::addParameter):
(JSC::BytecodeGenerator::emitCall):
(JSC::BytecodeGenerator::emitCallEval):
(JSC::BytecodeGenerator::emitConstruct):

  • bytecompiler/BytecodeGenerator.h:

(JSC::CallArguments::thisRegister):
(JSC::CallArguments::argumentRegister):
(JSC::CallArguments::callFrame):
(JSC::CallArguments::count):
(JSC::BytecodeGenerator::shouldEmitProfileHooks):

  • bytecompiler/NodesCodegen.cpp:

(JSC::NewExprNode::emitBytecode):
(JSC::CallArguments::CallArguments):
(JSC::EvalFunctionCallNode::emitBytecode):
(JSC::FunctionCallValueNode::emitBytecode):
(JSC::FunctionCallResolveNode::emitBytecode):
(JSC::FunctionCallBracketNode::emitBytecode):
(JSC::FunctionCallDotNode::emitBytecode):
(JSC::CallFunctionCallDotNode::emitBytecode):
(JSC::ApplyFunctionCallDotNode::emitBytecode):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/bytecompiler/BytecodeGenerator.h

    r60117 r60512  
    5252    class ScopeNode;
    5353
     54    class CallArguments {
     55    public:
     56        CallArguments(BytecodeGenerator& generator, ArgumentsNode* argumentsNode);
     57
     58        RegisterID* thisRegister() { return m_argv[0].get(); }
     59        RegisterID* argumentRegister(unsigned i) { return m_argv[i + 1].get(); }
     60        unsigned callFrame() { return thisRegister()->index() + count() + RegisterFile::CallFrameHeaderSize; }
     61        unsigned count() { return m_argv.size(); }
     62        RegisterID* profileHookRegister() { return m_profileHookRegister.get(); }
     63        ArgumentsNode* argumentsNode() { return m_argumentsNode; }
     64
     65    private:
     66        RefPtr<RegisterID> m_profileHookRegister;
     67        ArgumentsNode* m_argumentsNode;
     68        Vector<RefPtr<RegisterID>, 16> m_argv;
     69    };
     70
    5471    struct FinallyContext {
    5572        Label* finallyAddr;
     
    320337        RegisterID* emitPutSetter(RegisterID* base, const Identifier& property, RegisterID* value);
    321338
    322         RegisterID* emitCall(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
    323         RegisterID* emitCallEval(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
     339        RegisterID* emitCall(RegisterID* dst, RegisterID* func, CallArguments&, unsigned divot, unsigned startOffset, unsigned endOffset);
     340        RegisterID* emitCallEval(RegisterID* dst, RegisterID* func, CallArguments&, unsigned divot, unsigned startOffset, unsigned endOffset);
    324341        RegisterID* emitCallVarargs(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* argCount, unsigned divot, unsigned startOffset, unsigned endOffset);
    325342        RegisterID* emitLoadVarargs(RegisterID* argCountDst, RegisterID* args);
     
    328345        RegisterID* emitEnd(RegisterID* src) { return emitUnaryNoDstOp(op_end, src); }
    329346
    330         RegisterID* emitConstruct(RegisterID* dst, RegisterID* func, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
     347        RegisterID* emitConstruct(RegisterID* dst, RegisterID* func, CallArguments&, unsigned divot, unsigned startOffset, unsigned endOffset);
    331348        RegisterID* emitStrcat(RegisterID* dst, RegisterID* src, int count);
    332349        void emitToPrimitive(RegisterID* dst, RegisterID* src);
     
    386403            m_codeBlockBeingRegeneratedFrom = originalCodeBlock;
    387404        }
     405
     406        bool shouldEmitProfileHooks() { return m_shouldEmitProfileHooks; }
    388407
    389408    private:
     
    411430        typedef HashMap<UString::Rep*, JSString*, IdentifierRepHash> IdentifierStringMap;
    412431       
    413         RegisterID* emitCall(OpcodeID, RegisterID* dst, RegisterID* func, RegisterID* thisRegister, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
     432        RegisterID* emitCall(OpcodeID, RegisterID* dst, RegisterID* func, CallArguments&, unsigned divot, unsigned startOffset, unsigned endOffset);
    414433       
    415434        RegisterID* newRegister();
     
    443462        bool addGlobalVar(const Identifier&, bool isConstant, RegisterID*&);
    444463
    445         RegisterID* addParameter(const Identifier&);
     464        void addParameter(const Identifier&, int parameterIndex);
    446465       
    447466        void preserveLastVar();
     
    516535
    517536        int m_nextGlobalIndex;
    518         int m_nextParameterIndex;
    519537        int m_firstConstantIndex;
    520538        int m_nextConstantOffset;
Note: See TracChangeset for help on using the changeset viewer.