Changeset 51975 in webkit for trunk/JavaScriptCore/runtime/Operations.h
- Timestamp:
- Dec 10, 2009, 6:07:42 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/Operations.h
r51964 r51975 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 40 45 unsigned ropeLength = s1->ropeLength() + s2->ropeLength(); 41 46 JSGlobalData* globalData = &exec->globalData(); … … 50 55 rope->append(index, s1); 51 56 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); 52 93 ASSERT(index == ropeLength); 53 94 return new (globalData) JSString(globalData, rope.release()); … … 248 289 ALWAYS_INLINE JSValue jsAdd(CallFrame* callFrame, JSValue v1, JSValue v2) 249 290 { 250 double left; 251 double right = 0.0; 252 253 bool rightIsNumber = v2.getNumber(right); 254 if (rightIsNumber && v1.getNumber(left)) 291 double left = 0.0, right; 292 if (v1.getNumber(left), v2.getNumber(right)) 255 293 return jsNumber(callFrame, left + right); 256 294 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()); 295 if (v1.isString()) { 296 return v2.isString() 297 ? jsString(callFrame, asString(v1), asString(v2)) 298 : jsString(callFrame, asString(v1), v2.toString(callFrame)); 274 299 } 275 300
Note:
See TracChangeset
for help on using the changeset viewer.