Ignore:
Timestamp:
Jan 12, 2009, 8:51:16 PM (16 years ago)
Author:
[email protected]
Message:

JavaScriptCore:

2009-01-12 Gavin Barraclough <[email protected]>

Reviewed by Oliver Hunt.

Make the JSImmediate interface private.

All manipulation of JS values should be through the JSValuePtr class, not by using JSImmediate
directly. The key missing methods on JSValuePtr are:

  • isCell() - check for values that are JSCell*s, and as such where asCell() may be used.
  • isInt32Fast() getInt32Fast() - fast check/access for integer immediates.
  • isUInt32Fast() getUInt32Fast() - ditto for unsigned integer immediates.

The JIT is allowed full access to JSImmediate, since it needs to be able to directly
manipulate JSValuePtrs. The Interpreter is provided access to perform operations directly
on JSValuePtrs through the new JSFastMath interface.

No performance impact.

  • API/JSCallbackObjectFunctions.h: (JSC::::toNumber):
  • API/JSValueRef.cpp: (JSValueIsEqual): (JSValueIsStrictEqual):
  • JavaScriptCore.exp:
  • bytecode/CodeBlock.h: (JSC::CodeBlock::isKnownNotImmediate):
  • bytecompiler/BytecodeGenerator.cpp: (JSC::keyForImmediateSwitch):
  • bytecompiler/BytecodeGenerator.h: (JSC::BytecodeGenerator::JSValueHashTraits::constructDeletedValue): (JSC::BytecodeGenerator::JSValueHashTraits::isDeletedValue):
  • interpreter/Interpreter.cpp: (JSC::jsLess): (JSC::jsLessEq): (JSC::jsAdd): (JSC::jsIsObjectType): (JSC::cachePrototypeChain): (JSC::Interpreter::tryCachePutByID): (JSC::Interpreter::tryCacheGetByID): (JSC::Interpreter::privateExecute): (JSC::Interpreter::tryCTICachePutByID): (JSC::Interpreter::tryCTICacheGetByID): (JSC::Interpreter::cti_op_add): (JSC::Interpreter::cti_op_get_by_id_self_fail): (JSC::Interpreter::cti_op_get_by_id_proto_list): (JSC::Interpreter::cti_op_instanceof): (JSC::Interpreter::cti_op_mul): (JSC::Interpreter::cti_op_get_by_val): (JSC::Interpreter::cti_op_get_by_val_byte_array): (JSC::Interpreter::cti_op_sub): (JSC::Interpreter::cti_op_put_by_val): (JSC::Interpreter::cti_op_put_by_val_array): (JSC::Interpreter::cti_op_put_by_val_byte_array): (JSC::Interpreter::cti_op_negate): (JSC::Interpreter::cti_op_div): (JSC::Interpreter::cti_op_eq): (JSC::Interpreter::cti_op_lshift): (JSC::Interpreter::cti_op_bitand): (JSC::Interpreter::cti_op_rshift): (JSC::Interpreter::cti_op_bitnot): (JSC::Interpreter::cti_op_neq): (JSC::Interpreter::cti_op_urshift): (JSC::Interpreter::cti_op_call_eval): (JSC::Interpreter::cti_op_throw): (JSC::Interpreter::cti_op_is_undefined): (JSC::Interpreter::cti_op_stricteq): (JSC::Interpreter::cti_op_nstricteq): (JSC::Interpreter::cti_op_switch_imm): (JSC::Interpreter::cti_vm_throw):
  • interpreter/Interpreter.h: (JSC::Interpreter::isJSArray): (JSC::Interpreter::isJSString): (JSC::Interpreter::isJSByteArray):
  • jit/JIT.cpp: (JSC::JIT::compileOpStrictEq): (JSC::JIT::privateCompileMainPass):
  • jit/JIT.h: (JSC::JIT::isStrictEqCaseHandledInJITCode):
  • jit/JITArithmetic.cpp: (JSC::JIT::compileFastArith_op_rshift): (JSC::JIT::compileFastArith_op_bitand): (JSC::JIT::compileFastArith_op_mod):
  • jit/JITCall.cpp: (JSC::JIT::unlinkCall): (JSC::JIT::compileOpCall):
  • jit/JITInlineMethods.h: (JSC::JIT::getConstantOperandImmediateInt): (JSC::JIT::isOperandConstantImmediateInt):
  • parser/Nodes.cpp: (JSC::processClauseList):
  • runtime/ArrayPrototype.cpp: (JSC::arrayProtoFuncIndexOf): (JSC::arrayProtoFuncLastIndexOf):
  • runtime/BooleanPrototype.cpp: (JSC::booleanProtoFuncValueOf):
  • runtime/Collector.cpp: (JSC::Heap::protect): (JSC::Heap::unprotect): (JSC::Heap::heap):
  • runtime/JSByteArray.cpp: (JSC::JSByteArray::getOwnPropertySlot):
  • runtime/JSByteArray.h: (JSC::JSByteArray::getIndex):
  • runtime/JSCell.cpp:
  • runtime/JSCell.h: (JSC::JSValuePtr::isNumberCell): (JSC::JSValuePtr::asCell): (JSC::JSValuePtr::isNumber):
  • runtime/JSGlobalObjectFunctions.cpp: (JSC::globalFuncParseInt):
  • runtime/JSImmediate.h: (JSC::js0): (JSC::jsImpossibleValue): (JSC::JSValuePtr::toInt32): (JSC::JSValuePtr::toUInt32): (JSC::JSValuePtr::isCell): (JSC::JSValuePtr::isInt32Fast): (JSC::JSValuePtr::getInt32Fast): (JSC::JSValuePtr::isUInt32Fast): (JSC::JSValuePtr::getUInt32Fast): (JSC::JSValuePtr::makeInt32Fast): (JSC::JSValuePtr::areBothInt32Fast): (JSC::JSFastMath::canDoFastBitwiseOperations): (JSC::JSFastMath::equal): (JSC::JSFastMath::notEqual): (JSC::JSFastMath::andImmediateNumbers): (JSC::JSFastMath::xorImmediateNumbers): (JSC::JSFastMath::orImmediateNumbers): (JSC::JSFastMath::canDoFastRshift): (JSC::JSFastMath::canDoFastUrshift): (JSC::JSFastMath::rightShiftImmediateNumbers): (JSC::JSFastMath::canDoFastAdditiveOperations): (JSC::JSFastMath::addImmediateNumbers): (JSC::JSFastMath::subImmediateNumbers): (JSC::JSFastMath::incImmediateNumber): (JSC::JSFastMath::decImmediateNumber):
  • runtime/JSNumberCell.h: (JSC::JSValuePtr::asNumberCell): (JSC::jsNumber): (JSC::JSValuePtr::uncheckedGetNumber): (JSC::JSNumberCell::toInt32): (JSC::JSNumberCell::toUInt32): (JSC::JSValuePtr::toJSNumber): (JSC::JSValuePtr::getNumber): (JSC::JSValuePtr::numberToInt32): (JSC::JSValuePtr::numberToUInt32):
  • runtime/JSObject.h: (JSC::JSValuePtr::isObject): (JSC::JSValuePtr::get): (JSC::JSValuePtr::put):
  • runtime/JSValue.cpp: (JSC::JSValuePtr::toInteger): (JSC::JSValuePtr::toIntegerPreserveNaN):
  • runtime/JSValue.h:
  • runtime/Operations.cpp: (JSC::JSValuePtr::equalSlowCase): (JSC::JSValuePtr::strictEqualSlowCase):
  • runtime/Operations.h: (JSC::JSValuePtr::equal): (JSC::JSValuePtr::equalSlowCaseInline): (JSC::JSValuePtr::strictEqual): (JSC::JSValuePtr::strictEqualSlowCaseInline):
  • runtime/Protect.h: (JSC::gcProtect): (JSC::gcUnprotect):
  • runtime/StringPrototype.cpp: (JSC::stringProtoFuncCharAt): (JSC::stringProtoFuncCharCodeAt):
  • runtime/Structure.cpp: (JSC::Structure::createCachedPrototypeChain):

WebCore:

2009-01-12 Gavin Barraclough <[email protected]>

Reviewed by Oliver Hunt.

Deprecate JSValuePtr::getNumber() - two ways to get a number should be enough.

  • bindings/js/JSSQLTransactionCustom.cpp: (WebCore::JSSQLTransaction::executeSql):
  • bindings/objc/WebScriptObject.mm: (+[WebScriptObject _convertValueToObjcValue:originRootObject:rootObject:]):

WebKit/mac:

2009-01-12 Gavin Barraclough <[email protected]>

Reviewed by Oliver Hunt.

Deprecate JSValuePtr::getNumber() - two ways to get a number should be enough.

  • WebView/WebView.mm: (aeDescFromJSValue):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/runtime/JSImmediate.h

    r39769 r39851  
    3737    class ExecState;
    3838    class JSCell;
     39    class JSFastMath;
     40    class JSGlobalData;
    3941    class JSObject;
    4042    class UString;
     43
     44    JSValuePtr js0();
     45    JSValuePtr jsNull();
     46    JSValuePtr jsBoolean(bool b);
     47    JSValuePtr jsUndefined();
     48    JSValuePtr jsImpossibleValue();
     49    JSValuePtr jsNumber(ExecState* exec, double d);
     50    JSValuePtr jsNumber(ExecState*, char i);
     51    JSValuePtr jsNumber(ExecState*, unsigned char i);
     52    JSValuePtr jsNumber(ExecState*, short i);
     53    JSValuePtr jsNumber(ExecState*, unsigned short i);
     54    JSValuePtr jsNumber(ExecState* exec, int i);
     55    JSValuePtr jsNumber(ExecState* exec, unsigned i);
     56    JSValuePtr jsNumber(ExecState* exec, long i);
     57    JSValuePtr jsNumber(ExecState* exec, unsigned long i);
     58    JSValuePtr jsNumber(ExecState* exec, long long i);
     59    JSValuePtr jsNumber(ExecState* exec, unsigned long long i);
     60    JSValuePtr jsNumber(JSGlobalData* globalData, double d);
     61    JSValuePtr jsNumber(JSGlobalData* globalData, short i);
     62    JSValuePtr jsNumber(JSGlobalData* globalData, unsigned short i);
     63    JSValuePtr jsNumber(JSGlobalData* globalData, int i);
     64    JSValuePtr jsNumber(JSGlobalData* globalData, unsigned i);
     65    JSValuePtr jsNumber(JSGlobalData* globalData, long i);
     66    JSValuePtr jsNumber(JSGlobalData* globalData, unsigned long i);
     67    JSValuePtr jsNumber(JSGlobalData* globalData, long long i);
     68    JSValuePtr jsNumber(JSGlobalData* globalData, unsigned long long i);
    4169
    4270    /*
     
    99127    private:
    100128        friend class JIT;
    101    
     129        friend class JSValuePtr;
     130        friend class JSFastMath;
     131        friend JSValuePtr js0();
     132        friend JSValuePtr jsNull();
     133        friend JSValuePtr jsBoolean(bool b);
     134        friend JSValuePtr jsUndefined();
     135        friend JSValuePtr jsImpossibleValue();
     136        friend JSValuePtr jsNumber(ExecState* exec, double d);
     137        friend JSValuePtr jsNumber(ExecState*, char i);
     138        friend JSValuePtr jsNumber(ExecState*, unsigned char i);
     139        friend JSValuePtr jsNumber(ExecState*, short i);
     140        friend JSValuePtr jsNumber(ExecState*, unsigned short i);
     141        friend JSValuePtr jsNumber(ExecState* exec, int i);
     142        friend JSValuePtr jsNumber(ExecState* exec, unsigned i);
     143        friend JSValuePtr jsNumber(ExecState* exec, long i);
     144        friend JSValuePtr jsNumber(ExecState* exec, unsigned long i);
     145        friend JSValuePtr jsNumber(ExecState* exec, long long i);
     146        friend JSValuePtr jsNumber(ExecState* exec, unsigned long long i);
     147        friend JSValuePtr jsNumber(JSGlobalData* globalData, double d);
     148        friend JSValuePtr jsNumber(JSGlobalData* globalData, short i);
     149        friend JSValuePtr jsNumber(JSGlobalData* globalData, unsigned short i);
     150        friend JSValuePtr jsNumber(JSGlobalData* globalData, int i);
     151        friend JSValuePtr jsNumber(JSGlobalData* globalData, unsigned i);
     152        friend JSValuePtr jsNumber(JSGlobalData* globalData, long i);
     153        friend JSValuePtr jsNumber(JSGlobalData* globalData, unsigned long i);
     154        friend JSValuePtr jsNumber(JSGlobalData* globalData, long long i);
     155        friend JSValuePtr jsNumber(JSGlobalData* globalData, unsigned long long i);
     156
    102157#if USE(ALTERNATE_JSIMMEDIATE)
    103158        static const intptr_t TagTypeInteger = 0xffff000000000000ll; // bottom bit set indicates integer, this dominates the following bit
     
    128183        static const int32_t signBit = 0x80000000;
    129184 
    130     public:
    131185        static ALWAYS_INLINE bool isImmediate(JSValuePtr v)
    132186        {
     
    180234        }
    181235
    182         static ALWAYS_INLINE bool isAnyImmediate(JSValuePtr v1, JSValuePtr v2, JSValuePtr v3)
    183         {
    184             return (rawValue(v1) | rawValue(v2) | rawValue(v3)) & TagMask;
    185         }
    186 
    187236        static ALWAYS_INLINE bool areBothImmediate(JSValuePtr v1, JSValuePtr v2)
    188237        {
     
    193242        {
    194243            return rawValue(v1) & rawValue(v2) & TagTypeInteger;
    195         }
    196 
    197         static ALWAYS_INLINE JSValuePtr andImmediateNumbers(JSValuePtr v1, JSValuePtr v2)
    198         {
    199             ASSERT(areBothImmediateNumbers(v1, v2));
    200             return makeValue(rawValue(v1) & rawValue(v2));
    201         }
    202 
    203         static ALWAYS_INLINE JSValuePtr xorImmediateNumbers(JSValuePtr v1, JSValuePtr v2)
    204         {
    205             ASSERT(areBothImmediateNumbers(v1, v2));
    206             return makeValue((rawValue(v1) ^ rawValue(v2)) | TagTypeInteger);
    207         }
    208 
    209         static ALWAYS_INLINE JSValuePtr orImmediateNumbers(JSValuePtr v1, JSValuePtr v2)
    210         {
    211             ASSERT(areBothImmediateNumbers(v1, v2));
    212             return makeValue(rawValue(v1) | rawValue(v2));
    213         }
    214 
    215         static ALWAYS_INLINE JSValuePtr rightShiftImmediateNumbers(JSValuePtr val, JSValuePtr shift)
    216         {
    217             ASSERT(areBothImmediateNumbers(val, shift));
    218 #if USE(ALTERNATE_JSIMMEDIATE)
    219             return makeValue(static_cast<intptr_t>(static_cast<uint32_t>(static_cast<int32_t>(rawValue(val)) >> ((rawValue(shift) >> IntegerPayloadShift) & 0x1f))) | TagTypeInteger);
    220 #else
    221             return makeValue((rawValue(val) >> ((rawValue(shift) >> IntegerPayloadShift) & 0x1f)) | TagTypeInteger);
    222 #endif
    223         }
    224 
    225         static ALWAYS_INLINE bool canDoFastAdditiveOperations(JSValuePtr v)
    226         {
    227             // Number is non-negative and an operation involving two of these can't overflow.
    228             // Checking for allowed negative numbers takes more time than it's worth on SunSpider.
    229             return (rawValue(v) & (TagTypeInteger + (signBit | (signBit >> 1)))) == TagTypeInteger;
    230         }
    231 
    232         static ALWAYS_INLINE JSValuePtr addImmediateNumbers(JSValuePtr v1, JSValuePtr v2)
    233         {
    234             ASSERT(canDoFastAdditiveOperations(v1));
    235             ASSERT(canDoFastAdditiveOperations(v2));
    236             return makeValue(rawValue(v1) + rawValue(v2) - TagTypeInteger);
    237         }
    238 
    239         static ALWAYS_INLINE JSValuePtr subImmediateNumbers(JSValuePtr v1, JSValuePtr v2)
    240         {
    241             ASSERT(canDoFastAdditiveOperations(v1));
    242             ASSERT(canDoFastAdditiveOperations(v2));
    243             return makeValue(rawValue(v1) - rawValue(v2) + TagTypeInteger);
    244         }
    245 
    246         static ALWAYS_INLINE JSValuePtr incImmediateNumber(JSValuePtr v)
    247         {
    248             ASSERT(canDoFastAdditiveOperations(v));
    249             return makeValue(rawValue(v) + (1 << IntegerPayloadShift));
    250         }
    251 
    252         static ALWAYS_INLINE JSValuePtr decImmediateNumber(JSValuePtr v)
    253         {
    254             ASSERT(canDoFastAdditiveOperations(v));
    255             return makeValue(rawValue(v) - (1 << IntegerPayloadShift));
    256244        }
    257245
     
    484472    }
    485473
     474    inline JSValuePtr js0()
     475    {
     476        return JSImmediate::zeroImmediate();
     477    }
     478
    486479    inline JSValuePtr jsNull()
    487480    {
     
    497490    {
    498491        return JSImmediate::undefinedImmediate();
     492    }
     493
     494    inline JSValuePtr jsImpossibleValue()
     495    {
     496        return JSImmediate::impossibleValue();
    499497    }
    500498
     
    545543        if (getTruncatedInt32(i))
    546544            return i;
    547         bool ok;
    548         return toInt32SlowCase(exec, ok);
     545        bool ignored;
     546        return toInt32SlowCase(toNumber(exec), ignored);
    549547    }
    550548
     
    554552        if (getTruncatedUInt32(i))
    555553            return i;
    556         bool ok;
    557         return toUInt32SlowCase(exec, ok);
     554        bool ignored;
     555        return toUInt32SlowCase(toNumber(exec), ignored);
    558556    }
    559557
     
    583581            return i;
    584582        }
    585         return toInt32SlowCase(exec, ok);
     583        return toInt32SlowCase(toNumber(exec), ok);
    586584    }
    587585
     
    593591            return i;
    594592        }
    595         return toUInt32SlowCase(exec, ok);
    596     }
     593        return toUInt32SlowCase(toNumber(exec), ok);
     594    }
     595
     596    inline bool JSValuePtr::isCell() const
     597    {
     598        return !JSImmediate::isImmediate(asValue());
     599    }
     600
     601    inline bool JSValuePtr::isInt32Fast() const
     602    {
     603        return JSImmediate::isNumber(asValue());
     604    }
     605
     606    inline int32_t JSValuePtr::getInt32Fast() const
     607    {
     608        ASSERT(isInt32Fast());
     609        return JSImmediate::getTruncatedInt32(asValue());
     610    }
     611
     612    inline bool JSValuePtr::isUInt32Fast() const
     613    {
     614        return JSImmediate::isPositiveNumber(asValue());
     615    }
     616
     617    inline uint32_t JSValuePtr::getUInt32Fast() const
     618    {
     619        ASSERT(isUInt32Fast());
     620        return JSImmediate::getTruncatedUInt32(asValue());
     621    }
     622
     623    inline JSValuePtr JSValuePtr::makeInt32Fast(int32_t i)
     624    {
     625        return JSImmediate::from(i);
     626    }
     627
     628    inline bool JSValuePtr::areBothInt32Fast(JSValuePtr v1, JSValuePtr v2)
     629    {
     630        return JSImmediate::areBothImmediateNumbers(v1, v2);
     631    }
     632
     633    class JSFastMath {
     634    public:
     635        static ALWAYS_INLINE bool canDoFastBitwiseOperations(JSValuePtr v1, JSValuePtr v2)
     636        {
     637            return JSImmediate::areBothImmediateNumbers(v1, v2);
     638        }
     639
     640        static ALWAYS_INLINE JSValuePtr equal(JSValuePtr v1, JSValuePtr v2)
     641        {
     642            ASSERT(canDoFastBitwiseOperations(v1, v2));
     643            return jsBoolean(v1 == v2);
     644        }
     645
     646        static ALWAYS_INLINE JSValuePtr notEqual(JSValuePtr v1, JSValuePtr v2)
     647        {
     648            ASSERT(canDoFastBitwiseOperations(v1, v2));
     649            return jsBoolean(v1 != v2);
     650        }
     651
     652        static ALWAYS_INLINE JSValuePtr andImmediateNumbers(JSValuePtr v1, JSValuePtr v2)
     653        {
     654            ASSERT(canDoFastBitwiseOperations(v1, v2));
     655            return JSImmediate::makeValue(JSImmediate::rawValue(v1) & JSImmediate::rawValue(v2));
     656        }
     657
     658        static ALWAYS_INLINE JSValuePtr xorImmediateNumbers(JSValuePtr v1, JSValuePtr v2)
     659        {
     660            ASSERT(canDoFastBitwiseOperations(v1, v2));
     661            return JSImmediate::makeValue((JSImmediate::rawValue(v1) ^ JSImmediate::rawValue(v2)) | JSImmediate::TagTypeInteger);
     662        }
     663
     664        static ALWAYS_INLINE JSValuePtr orImmediateNumbers(JSValuePtr v1, JSValuePtr v2)
     665        {
     666            ASSERT(canDoFastBitwiseOperations(v1, v2));
     667            return JSImmediate::makeValue(JSImmediate::rawValue(v1) | JSImmediate::rawValue(v2));
     668        }
     669
     670        static ALWAYS_INLINE bool canDoFastRshift(JSValuePtr v1, JSValuePtr v2)
     671        {
     672            return JSImmediate::areBothImmediateNumbers(v1, v2);
     673        }
     674
     675        static ALWAYS_INLINE bool canDoFastUrshift(JSValuePtr v1, JSValuePtr v2)
     676        {
     677            return JSImmediate::areBothImmediateNumbers(v1, v2) && !JSImmediate::isNegative(v1);
     678        }
     679
     680        static ALWAYS_INLINE JSValuePtr rightShiftImmediateNumbers(JSValuePtr val, JSValuePtr shift)
     681        {
     682            ASSERT(canDoFastRshift(val, shift) || canDoFastUrshift(val, shift));
     683#if USE(ALTERNATE_JSIMMEDIATE)
     684            return JSImmediate::makeValue(static_cast<intptr_t>(static_cast<uint32_t>(static_cast<int32_t>(JSImmediate::rawValue(val)) >> ((JSImmediate::rawValue(shift) >> JSImmediate::IntegerPayloadShift) & 0x1f))) | JSImmediate::TagTypeInteger);
     685#else
     686            return JSImmediate::makeValue((JSImmediate::rawValue(val) >> ((JSImmediate::rawValue(shift) >> JSImmediate::IntegerPayloadShift) & 0x1f)) | JSImmediate::TagTypeInteger);
     687#endif
     688        }
     689
     690        static ALWAYS_INLINE bool canDoFastAdditiveOperations(JSValuePtr v)
     691        {
     692            // Number is non-negative and an operation involving two of these can't overflow.
     693            // Checking for allowed negative numbers takes more time than it's worth on SunSpider.
     694            return (JSImmediate::rawValue(v) & (JSImmediate::TagTypeInteger + (JSImmediate::signBit | (JSImmediate::signBit >> 1)))) == JSImmediate::TagTypeInteger;
     695        }
     696
     697        static ALWAYS_INLINE bool canDoFastAdditiveOperations(JSValuePtr v1, JSValuePtr v2)
     698        {
     699            // Number is non-negative and an operation involving two of these can't overflow.
     700            // Checking for allowed negative numbers takes more time than it's worth on SunSpider.
     701            return ((JSImmediate::rawValue(v1) | JSImmediate::rawValue(v2)) & (JSImmediate::TagTypeInteger + (JSImmediate::signBit | (JSImmediate::signBit >> 1)))) == JSImmediate::TagTypeInteger;
     702        }
     703
     704        static ALWAYS_INLINE JSValuePtr addImmediateNumbers(JSValuePtr v1, JSValuePtr v2)
     705        {
     706            ASSERT(canDoFastAdditiveOperations(v1, v2));
     707            return JSImmediate::makeValue(JSImmediate::rawValue(v1) + JSImmediate::rawValue(v2) - JSImmediate::TagTypeInteger);
     708        }
     709
     710        static ALWAYS_INLINE JSValuePtr subImmediateNumbers(JSValuePtr v1, JSValuePtr v2)
     711        {
     712            ASSERT(canDoFastAdditiveOperations(v1, v2));
     713            return JSImmediate::makeValue(JSImmediate::rawValue(v1) - JSImmediate::rawValue(v2) + JSImmediate::TagTypeInteger);
     714        }
     715
     716        static ALWAYS_INLINE JSValuePtr incImmediateNumber(JSValuePtr v)
     717        {
     718            ASSERT(canDoFastAdditiveOperations(v));
     719            return JSImmediate::makeValue(JSImmediate::rawValue(v) + (1 << JSImmediate::IntegerPayloadShift));
     720        }
     721
     722        static ALWAYS_INLINE JSValuePtr decImmediateNumber(JSValuePtr v)
     723        {
     724            ASSERT(canDoFastAdditiveOperations(v));
     725            return JSImmediate::makeValue(JSImmediate::rawValue(v) - (1 << JSImmediate::IntegerPayloadShift));
     726        }
     727    };
    597728
    598729} // namespace JSC
Note: See TracChangeset for help on using the changeset viewer.