Ignore:
Timestamp:
Aug 20, 2009, 7:57:10 PM (16 years ago)
Author:
[email protected]
Message:

Numbering of arguments to emitGetJITStubArg/emitPutJITStubArg incorrect
https://bugs.webkit.org/show_bug.cgi?id=28513

Reviewed by Oliver Hunt.

The argumentNumber argument to emitGetJITStubArg/emitPutJITStubArg should match
the argument number used within the stub functions in JITStubs.cpp, but it doesn't.

Firstly, all the numbers changed when we added a void* 'reserved' as the first slot
(rather than leaving argument 0 unused), and secondly in 32_64 builds the index to
peek/poke needs to be multiplies by 2 (since the argument to peek/poke is a number
of machine words, and on 32_64 build the argument slots to stub functions are two
words wide).

  • jit/JIT.h:
  • jit/JITCall.cpp:

(JSC::JIT::compileOpCallSetupArgs):
(JSC::JIT::compileOpConstructSetupArgs):
(JSC::JIT::compileOpCallVarargsSetupArgs):
(JSC::JIT::compileOpCall):

  • jit/JITInlineMethods.h:

(JSC::JIT::emitPutJITStubArg):
(JSC::JIT::emitPutJITStubArgConstant):
(JSC::JIT::emitGetJITStubArg):
(JSC::JIT::emitPutJITStubArgFromVirtualRegister):

  • jit/JITOpcodes.cpp:

(JSC::JIT::privateCompileCTIMachineTrampolines):

  • jit/JITPropertyAccess.cpp:

(JSC::JIT::privateCompilePutByIdTransition):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/jit/JITCall.cpp

    r47597 r47614  
    6565    int registerOffset = instruction[4].u.operand;
    6666
    67     emitPutJITStubArg(regT0, 1);
    68     emitPutJITStubArg(regT1, 2);
    69     emitPutJITStubArgConstant(registerOffset, 3);
    70     emitPutJITStubArgConstant(argCount, 5);
     67    emitPutJITStubArg(regT1, regT0, 0);
     68    emitPutJITStubArgConstant(registerOffset, 1);
     69    emitPutJITStubArgConstant(argCount, 2);
    7170}
    7271         
     
    7877    int thisRegister = instruction[6].u.operand;
    7978
    80     emitPutJITStubArg(regT0, 1);
    81     emitPutJITStubArg(regT1, 2);
    82     emitPutJITStubArgConstant(registerOffset, 3);
    83     emitPutJITStubArgConstant(argCount, 5);
    84     emitPutJITStubArgFromVirtualRegister(proto, 7, regT2, regT3);
    85     emitPutJITStubArgConstant(thisRegister, 9);
     79    emitPutJITStubArg(regT1, regT0, 0);
     80    emitPutJITStubArgConstant(registerOffset, 1);
     81    emitPutJITStubArgConstant(argCount, 2);
     82    emitPutJITStubArgFromVirtualRegister(proto, 3, regT2, regT3);
     83    emitPutJITStubArgConstant(thisRegister, 4);
    8684}
    8785
    8886void JIT::compileOpCallVarargsSetupArgs(Instruction*)
    8987{
    90     emitPutJITStubArg(regT0, 1);
    91     emitPutJITStubArg(regT1, 2);
    92     emitPutJITStubArg(regT3, 3); // registerOffset
    93     emitPutJITStubArg(regT2, 5); // argCount
     88    emitPutJITStubArg(regT1, regT0, 0);
     89    emitPutJITStubArg(regT3, 1); // registerOffset
     90    emitPutJITStubArg(regT2, 2); // argCount
    9491}
    9592
     
    453450
    454451    // ecx holds func
    455     emitPutJITStubArg(regT0, 1);
    456     emitPutJITStubArgConstant(argCount, 3);
    457     emitPutJITStubArgConstant(registerOffset, 2);
     452    emitPutJITStubArg(regT0, 0);
     453    emitPutJITStubArgConstant(argCount, 2);
     454    emitPutJITStubArgConstant(registerOffset, 1);
    458455}
    459456         
     
    463460   
    464461    // ecx holds func
    465     emitPutJITStubArg(regT0, 1);
    466     emitPutJITStubArg(regT1, 3);
     462    emitPutJITStubArg(regT0, 0);
     463    emitPutJITStubArg(regT1, 2);
    467464    addPtr(Imm32(registerOffset), regT1, regT2);
    468     emitPutJITStubArg(regT2, 2);
     465    emitPutJITStubArg(regT2, 1);
    469466}
    470467
     
    477474
    478475    // ecx holds func
    479     emitPutJITStubArg(regT0, 1);
    480     emitPutJITStubArgConstant(registerOffset, 2);
    481     emitPutJITStubArgConstant(argCount, 3);
    482     emitPutJITStubArgFromVirtualRegister(proto, 4, regT2);
    483     emitPutJITStubArgConstant(thisRegister, 5);
     476    emitPutJITStubArg(regT0, 0);
     477    emitPutJITStubArgConstant(registerOffset, 1);
     478    emitPutJITStubArgConstant(argCount, 2);
     479    emitPutJITStubArgFromVirtualRegister(proto, 3, regT2);
     480    emitPutJITStubArgConstant(thisRegister, 4);
    484481}
    485482
     
    636633        int thisRegister = instruction[6].u.operand;
    637634
    638         emitPutJITStubArg(regT0, 1);
    639         emitPutJITStubArgFromVirtualRegister(proto, 4, regT2);
     635        emitPutJITStubArg(regT0, 0);
     636        emitPutJITStubArgFromVirtualRegister(proto, 3, regT2);
    640637        JITStubCall stubCall(this, cti_op_construct_JSConstruct);
    641638        stubCall.call(thisRegister);
Note: See TracChangeset for help on using the changeset viewer.