Changeset 51978 in webkit for trunk/JavaScriptCore/runtime/Operations.h
- Timestamp:
- Dec 10, 2009, 7:42:33 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/Operations.h
r51975 r51978 38 38 ALWAYS_INLINE JSValue jsString(ExecState* exec, JSString* s1, JSString* s2) 39 39 { 40 if (!s1->length())41 return s2;42 if (!s2->length())43 return s1;44 45 40 unsigned ropeLength = s1->ropeLength() + s2->ropeLength(); 46 41 JSGlobalData* globalData = &exec->globalData(); … … 55 50 rope->append(index, s1); 56 51 rope->append(index, s2); 57 ASSERT(index == ropeLength);58 return new (globalData) JSString(globalData, rope.release());59 }60 61 ALWAYS_INLINE JSValue jsString(ExecState* exec, const UString& u1, JSString* s2)62 {63 unsigned ropeLength = 1 + s2->ropeLength();64 JSGlobalData* globalData = &exec->globalData();65 66 if (ropeLength <= JSString::s_maxInternalRopeLength)67 return new (globalData) JSString(globalData, ropeLength, u1, s2);68 69 unsigned index = 0;70 RefPtr<JSString::Rope> rope = JSString::Rope::createOrNull(ropeLength);71 if (UNLIKELY(!rope))72 return throwOutOfMemoryError(exec);73 rope->append(index, u1);74 rope->append(index, s2);75 ASSERT(index == ropeLength);76 return new (globalData) JSString(globalData, rope.release());77 }78 79 ALWAYS_INLINE JSValue jsString(ExecState* exec, JSString* s1, const UString& u2)80 {81 unsigned ropeLength = s1->ropeLength() + 1;82 JSGlobalData* globalData = &exec->globalData();83 84 if (ropeLength <= JSString::s_maxInternalRopeLength)85 return new (globalData) JSString(globalData, ropeLength, s1, u2);86 87 unsigned index = 0;88 RefPtr<JSString::Rope> rope = JSString::Rope::createOrNull(ropeLength);89 if (UNLIKELY(!rope))90 return throwOutOfMemoryError(exec);91 rope->append(index, s1);92 rope->append(index, u2);93 52 ASSERT(index == ropeLength); 94 53 return new (globalData) JSString(globalData, rope.release()); … … 289 248 ALWAYS_INLINE JSValue jsAdd(CallFrame* callFrame, JSValue v1, JSValue v2) 290 249 { 291 double left = 0.0, right; 292 if (v1.getNumber(left), v2.getNumber(right)) 250 double left; 251 double right = 0.0; 252 253 bool rightIsNumber = v2.getNumber(right); 254 if (rightIsNumber && v1.getNumber(left)) 293 255 return jsNumber(callFrame, left + right); 294 256 295 if (v1.isString()) { 296 return v2.isString() 297 ? jsString(callFrame, asString(v1), asString(v2)) 298 : jsString(callFrame, asString(v1), v2.toString(callFrame)); 257 bool leftIsString = v1.isString(); 258 if (leftIsString && v2.isString()) { 259 if (!asString(v1)->length()) 260 return asString(v2); 261 if (!asString(v2)->length()) 262 return asString(v1); 263 return jsString(callFrame, asString(v1), asString(v2)); 264 } 265 266 if (rightIsNumber & leftIsString) { 267 RefPtr<UString::Rep> value = v2.isInt32() ? 268 concatenate(asString(v1)->value(callFrame).rep(), v2.asInt32()) : 269 concatenate(asString(v1)->value(callFrame).rep(), right); 270 271 if (!value) 272 return throwOutOfMemoryError(callFrame); 273 return jsString(callFrame, value.release()); 299 274 } 300 275
Note:
See TracChangeset
for help on using the changeset viewer.