Changeset 37995 in webkit for trunk/JavaScriptCore/VM


Ignore:
Timestamp:
Oct 30, 2008, 2:35:24 AM (17 years ago)
Author:
[email protected]
Message:

2008-10-30 Alp Toker <[email protected]>

Reviewed by Alexey Proskuryakov.

https://bugs.webkit.org/show_bug.cgi?id=21571
VoidPtrPair breaks CTI on Linux

The VoidPtrPair return change made in r37457 does not work on Linux
since POD structs aren't passed in registers.

This patch uses a union to vectorize VoidPtrPair to a uint64_t and
matches Darwin/MSVC fixing CTI/WREC on Linux.

Alexey reports no measurable change in Mac performance with this fix.

  • VM/Machine.cpp: (JSC::Machine::cti_op_call_JSFunction): (JSC::Machine::cti_op_construct_JSConstruct): (JSC::Machine::cti_op_resolve_func): (JSC::Machine::cti_op_post_inc): (JSC::Machine::cti_op_resolve_with_base): (JSC::Machine::cti_op_post_dec):
  • VM/Machine.h: (JSC::):
Location:
trunk/JavaScriptCore/VM
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/VM/Machine.cpp

    r37991 r37995  
    43504350    do { \
    43514351        VM_THROW_EXCEPTION_AT_END(); \
    4352         VoidPtrPair pair = { 0, 0 }; \
    4353         return pair; \
     4352        VoidPtrPairValue pair = {{ 0, 0 }}; \
     4353        return pair.i; \
    43544354    } while (0)
    43554355#define VM_THROW_EXCEPTION_AT_END() \
     
    47254725
    47264726    if (LIKELY(argCount == newCodeBlock->numParameters)) {
    4727         VoidPtrPair pair = { newCodeBlock, CallFrame::create(callFrame->registers() + registerOffset) };
    4728         return pair;
     4727        VoidPtrPairValue pair = {{ newCodeBlock, CallFrame::create(callFrame->registers() + registerOffset) }};
     4728        return pair.i;
    47294729    }
    47304730
     
    47374737            argv[i + argCount] = argv[i];
    47384738
    4739         VoidPtrPair pair = { newCodeBlock, CallFrame::create(r) };
    4740         return pair;
     4739        VoidPtrPairValue pair = {{ newCodeBlock, CallFrame::create(r) }};
     4740        return pair.i;
    47414741    }
    47424742
     
    47534753        argv[i] = jsUndefined();
    47544754
    4755     VoidPtrPair pair = { newCodeBlock, CallFrame::create(r) };
    4756     return pair;
     4755    VoidPtrPairValue pair = {{ newCodeBlock, CallFrame::create(r) }};
     4756    return pair.i;
    47574757}
    47584758
     
    49754975
    49764976    if (LIKELY(argCount == newCodeBlock->numParameters)) {
    4977         VoidPtrPair pair = { newCodeBlock, CallFrame::create(callFrame->registers() + registerOffset) };
    4978         return pair;
     4977        VoidPtrPairValue pair = {{ newCodeBlock, CallFrame::create(callFrame->registers() + registerOffset) }};
     4978        return pair.i;
    49794979    }
    49804980
     
    49874987            argv[i + argCount] = argv[i];
    49884988
    4989         VoidPtrPair pair = { newCodeBlock, CallFrame::create(r) };
    4990         return pair;
     4989        VoidPtrPairValue pair = {{ newCodeBlock, CallFrame::create(r) }};
     4990        return pair.i;
    49914991    }
    49924992
     
    50035003        argv[i] = jsUndefined();
    50045004
    5005     VoidPtrPair pair = { newCodeBlock, CallFrame::create(r) };
    5006     return pair;
     5005    VoidPtrPairValue pair = {{ newCodeBlock, CallFrame::create(r) }};
     5006    return pair.i;
    50075007}
    50085008
     
    51045104            VM_CHECK_EXCEPTION_AT_END();
    51055105
    5106             VoidPtrPair pair = { thisObj, asPointer(result) };
    5107             return pair;
     5106            VoidPtrPairValue pair = {{ thisObj, asPointer(result) }};
     5107            return pair.i;
    51085108        }
    51095109        ++iter;
     
    53855385    VM_CHECK_EXCEPTION_AT_END();
    53865386
    5387     VoidPtrPair pair = { asPointer(number), asPointer(jsNumber(ARG_globalData, number->uncheckedGetNumber() + 1)) };
    5388     return pair;
     5387    VoidPtrPairValue pair = {{ asPointer(number), asPointer(jsNumber(ARG_globalData, number->uncheckedGetNumber() + 1)) }};
     5388    return pair.i;
    53895389}
    53905390
     
    55015501            VM_CHECK_EXCEPTION_AT_END();
    55025502
    5503             VoidPtrPair pair = { base, asPointer(result) };
    5504             return pair;
     5503            VoidPtrPairValue pair = {{ base, asPointer(result) }};
     5504            return pair.i;
    55055505        }
    55065506        ++iter;
     
    55715571    VM_CHECK_EXCEPTION_AT_END();
    55725572
    5573     VoidPtrPair pair = { asPointer(number), asPointer(jsNumber(ARG_globalData, number->uncheckedGetNumber() - 1)) };
    5574     return pair;
     5573    VoidPtrPairValue pair = {{ asPointer(number), asPointer(jsNumber(ARG_globalData, number->uncheckedGetNumber() - 1)) }};
     5574    return pair.i;
    55755575}
    55765576
  • trunk/JavaScriptCore/VM/Machine.h

    r37991 r37995  
    8282#endif
    8383
    84     struct VoidPtrPair { void* first; void* second; };
     84    typedef uint64_t VoidPtrPair;
     85
     86    typedef union
     87    {
     88        struct { void* first; void* second; };
     89        VoidPtrPair i;
     90    } VoidPtrPairValue;
    8591#endif
    8692
Note: See TracChangeset for help on using the changeset viewer.