Show
Ignore:
Timestamp:
08/20/08 13:23:52 (5 months ago)
Author:
mbensi
Message:

merge with webkit revision 35853

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/JavaScriptCore/VM/Machine.cpp

    r440 r447  
    9999} 
    100100 
    101 static bool fastIsNumber(JSValue* value, double& arg) { 
     101// FIXME: This operation should be called "getNumber", not "isNumber" (as it is in JSValue.h). 
     102// FIXME: There's no need to have a "slow" version of this. All versions should be fast. 
     103static bool fastIsNumber(JSValue* value, double& arg) 
     104
    102105    if (JSImmediate::isNumber(value)) 
    103106        arg = JSImmediate::getTruncatedInt32(value); 
    104     else if (Heap::fastIsNumber(static_cast<JSCell*>(value))) 
     107    else if (Heap::isNumber(static_cast<JSCell*>(value))) 
    105108        arg = static_cast<JSNumberCell*>(value)->value(); 
    106109    else 
     
    109112} 
    110113 
    111 static bool fastToInt32(JSValue* value, int32_t& arg) { 
     114// FIXME: Why doesn't JSValue::toInt32 have the Heap::isNumber optimization? 
     115static bool fastToInt32(JSValue* value, int32_t& arg) 
     116
    112117    if (JSImmediate::isNumber(value)) 
    113118        arg = JSImmediate::getTruncatedInt32(value); 
    114     else if (Heap::fastIsNumber(static_cast<JSCell*>(value))) 
    115         arg = static_cast<JSNumberCell*>(value)->fastToInt32(); 
     119    else if (Heap::isNumber(static_cast<JSCell*>(value))) 
     120        arg = static_cast<JSNumberCell*>(value)->toInt32(); 
    116121    else 
    117122        return false; 
     
    119124} 
    120125 
    121 static ALWAYS_INLINE bool fastToUInt32(JSValue* value, uint32_t& arg) { 
     126static ALWAYS_INLINE bool fastToUInt32(JSValue* value, uint32_t& arg) 
     127
    122128    if (JSImmediate::isNumber(value)) { 
    123129        if (JSImmediate::getTruncatedUInt32(value, arg)) 
     
    126132        arg = JSValue::toUInt32SlowCase(JSImmediate::getTruncatedInt32(value), scratch); 
    127133        return true; 
    128     } else if (Heap::fastIsNumber(static_cast<JSCell*>(value))) 
    129         arg = static_cast<JSNumberCell*>(value)->fastToUInt32(); 
     134    } else if (Heap::isNumber(static_cast<JSCell*>(value))) 
     135        arg = static_cast<JSNumberCell*>(value)->toUInt32(); 
    130136    else 
    131137        return false; 
     
    178184{ 
    179185    // exception for the Date exception in defaultValue() 
    180     JSValue* p1 = v1->toPrimitive(exec, UnspecifiedType); 
    181     JSValue* p2 = v2->toPrimitive(exec, UnspecifiedType); 
     186    JSValue* p1 = v1->toPrimitive(exec); 
     187    JSValue* p2 = v2->toPrimitive(exec); 
    182188 
    183189    if (p1->isString() || p2->isString()) { 
     
    204210    double left; 
    205211    double right; 
    206      
    207212    if (fastIsNumber(v1, left) && fastIsNumber(v2, right)) 
    208213        return jsNumber(exec, left + right); 
    209214     
    210     JSType t1 = v1->type(); 
    211     JSType t2 = v2->type(); 
    212     const unsigned bothTypes = (t1 << 3) | t2; 
    213     ASSERT(bothTypes != ((NumberType << 3) | NumberType)); 
    214     if (bothTypes == ((StringType << 3) | StringType)) { 
     215    if (v1->isString() && v2->isString()) { 
    215216        UString value = static_cast<JSString*>(v1)->value() + static_cast<JSString*>(v2)->value(); 
    216217        if (value.isNull()) 
     
    225226static JSValue* jsTypeStringForValue(ExecState* exec, JSValue* v) 
    226227{ 
    227     switch (v->type()) { 
    228         case UndefinedType: 
     228    if (v->isUndefined()) 
     229        return jsString(exec, "undefined"); 
     230    if (v->isBoolean()) 
     231        return jsString(exec, "boolean"); 
     232    if (v->isNumber()) 
     233        return jsString(exec, "number"); 
     234    if (v->isString()) 
     235        return jsString(exec, "string"); 
     236    if (v->isObject()) { 
     237        // Return "undefined" for objects that should be treated 
     238        // as null when doing comparisons. 
     239        if (static_cast<JSObject*>(v)->masqueradeAsUndefined()) 
    229240            return jsString(exec, "undefined"); 
    230         case NullType: 
    231             return jsString(exec, "object"); 
    232         case BooleanType: 
    233             return jsString(exec, "boolean"); 
    234         case NumberType: 
    235             return jsString(exec, "number"); 
    236         case StringType: 
    237             return jsString(exec, "string"); 
    238         default: 
    239             if (v->isObject()) { 
    240                 // Return "undefined" for objects that should be treated 
    241                 // as null when doing comparisons. 
    242                 if (static_cast<JSObject*>(v)->masqueradeAsUndefined()) 
    243                     return jsString(exec, "undefined"); 
    244                 CallData callData; 
    245                 if (static_cast<JSObject*>(v)->getCallData(callData) != CallTypeNone) 
    246                     return jsString(exec, "function"); 
    247             } 
    248  
    249             return jsString(exec, "object"); 
    250     } 
     241        CallData callData; 
     242        if (static_cast<JSObject*>(v)->getCallData(callData) != CallTypeNone) 
     243            return jsString(exec, "function"); 
     244    } 
     245    return jsString(exec, "object"); 
    251246} 
    252247 
     
    15541549        uint32_t right; 
    15551550        if (JSImmediate::areBothImmediateNumbers(val, shift)) 
    1556             r[dst] = jsNumber(exec, JSImmediate::getTruncatedInt32(val) << (JSImmediate::toTruncatedUInt32(shift) & 0x1f)); 
     1551            r[dst] = jsNumber(exec, JSImmediate::getTruncatedInt32(val) << (JSImmediate::getTruncatedUInt32(shift) & 0x1f)); 
    15571552        else if (fastToInt32(val, left) && fastToUInt32(shift, right)) 
    15581553            r[dst] = jsNumber(exec, left << (right & 0x1f)); 
     
    22722267        int defaultOffset = (++vPC)->u.operand; 
    22732268        JSValue* scrutinee = r[(++vPC)->u.operand].jsValue(exec); 
    2274         if (scrutinee->type() != StringType
     2269        if (!scrutinee->isString()
    22752270            vPC += defaultOffset; 
    22762271        else { 
     
    22952290        int defaultOffset = (++vPC)->u.operand; 
    22962291        JSValue* scrutinee = r[(++vPC)->u.operand].jsValue(exec); 
    2297         if (scrutinee->type() != StringType
     2292        if (!scrutinee->isString()
    22982293            vPC += defaultOffset; 
    22992294        else