Changeset 51978 in webkit
- Timestamp:
- Dec 10, 2009 7:42:33 PM (14 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r51976 r51978 1 2009-12-10 Adam Barth <abarth@webkit.org> 2 3 No review, rolling out r51975. 4 http://trac.webkit.org/changeset/51975 5 6 * jit/JITStubs.cpp: 7 (JSC::DEFINE_STUB_FUNCTION): 8 * runtime/JSString.h: 9 (JSC::JSString::JSString): 10 (JSC::JSString::appendStringInConstruct): 11 * runtime/Operations.cpp: 12 (JSC::jsAddSlowCase): 13 * runtime/Operations.h: 14 (JSC::jsString): 15 (JSC::jsAdd): 16 1 17 2009-12-10 Oliver Hunt <oliver@apple.com> 2 18 -
trunk/JavaScriptCore/jit/JITStubs.cpp
r51976 r51978 1034 1034 JSValue v1 = stackFrame.args[0].jsValue(); 1035 1035 JSValue v2 = stackFrame.args[1].jsValue(); 1036 CallFrame* callFrame = stackFrame.callFrame; 1037 1038 if (v1.isString()) { 1039 JSValue result = v2.isString() 1040 ? jsString(callFrame, asString(v1), asString(v2)) 1041 : jsString(callFrame, asString(v1), v2.toString(callFrame)); 1036 1037 double left; 1038 double right = 0.0; 1039 1040 bool rightIsNumber = v2.getNumber(right); 1041 if (rightIsNumber && v1.getNumber(left)) 1042 return JSValue::encode(jsNumber(stackFrame.globalData, left + right)); 1043 1044 CallFrame* callFrame = stackFrame.callFrame; 1045 1046 bool leftIsString = v1.isString(); 1047 if (leftIsString && v2.isString()) { 1048 JSValue result = jsString(callFrame, asString(v1), asString(v2)); 1042 1049 CHECK_FOR_EXCEPTION_AT_END(); 1043 1050 return JSValue::encode(result); 1044 1051 } 1045 1052 1046 double left = 0.0, right; 1047 if (v1.getNumber(left) && v2.getNumber(right)) 1048 return JSValue::encode(jsNumber(stackFrame.globalData, left + right)); 1053 if (rightIsNumber & leftIsString) { 1054 RefPtr<UString::Rep> value = v2.isInt32() ? 1055 concatenate(asString(v1)->value(callFrame).rep(), v2.asInt32()) : 1056 concatenate(asString(v1)->value(callFrame).rep(), right); 1057 1058 if (UNLIKELY(!value)) { 1059 throwOutOfMemoryError(callFrame); 1060 VM_THROW_EXCEPTION(); 1061 } 1062 return JSValue::encode(jsString(stackFrame.globalData, value.release())); 1063 } 1049 1064 1050 1065 // All other cases are pretty uncommon -
trunk/JavaScriptCore/runtime/JSString.h
r51975 r51978 204 204 ASSERT(ropeLength == index); 205 205 } 206 // This constructor constructs a new string by concatenating s1 & s2.207 // This should only be called with ropeLength <= 3.208 JSString(JSGlobalData* globalData, unsigned ropeLength, JSString* s1, const UString& u2)209 : JSCell(globalData->stringStructure.get())210 , m_stringLength(s1->length() + u2.size())211 , m_ropeLength(ropeLength)212 {213 ASSERT(ropeLength <= s_maxInternalRopeLength);214 unsigned index = 0;215 appendStringInConstruct(index, s1);216 appendStringInConstruct(index, u2);217 ASSERT(ropeLength == index);218 }219 // This constructor constructs a new string by concatenating s1 & s2.220 // This should only be called with ropeLength <= 3.221 JSString(JSGlobalData* globalData, unsigned ropeLength, const UString& u1, JSString* s2)222 : JSCell(globalData->stringStructure.get())223 , m_stringLength(u1.size() + s2->length())224 , m_ropeLength(ropeLength)225 {226 ASSERT(ropeLength <= s_maxInternalRopeLength);227 unsigned index = 0;228 appendStringInConstruct(index, u1);229 appendStringInConstruct(index, s2);230 ASSERT(ropeLength == index);231 }232 206 // This constructor constructs a new string by concatenating v1, v2 & v3. 233 207 // This should only be called with ropeLength <= 3 ... which since every … … 285 259 void resolveRope(ExecState*) const; 286 260 287 void appendStringInConstruct(unsigned& index, const UString& string)288 {289 m_fibers[index++] = Rope::Fiber(string.rep()->ref());290 }291 292 261 void appendStringInConstruct(unsigned& index, JSString* jsString) 293 262 { … … 296 265 m_fibers[index++] = jsString->m_fibers[i].ref(); 297 266 } else 298 appendStringInConstruct(index, jsString->string());267 m_fibers[index++] = Rope::Fiber(jsString->string().rep()->ref()); 299 268 } 300 269 … … 343 312 344 313 friend JSValue jsString(ExecState* exec, JSString* s1, JSString* s2); 345 friend JSValue jsString(ExecState* exec, const UString& u1, JSString* s2);346 friend JSValue jsString(ExecState* exec, JSString* s1, const UString& u2);347 314 friend JSValue jsString(ExecState* exec, Register* strings, unsigned count); 348 315 }; -
trunk/JavaScriptCore/runtime/Operations.cpp
r51975 r51978 55 55 JSValue p2 = v2.toPrimitive(callFrame); 56 56 57 if (p1.isString()) { 58 return p2.isString() 59 ? jsString(callFrame, asString(p1), asString(p2)) 60 : jsString(callFrame, asString(p1), p2.toString(callFrame)); 57 if (p1.isString() || p2.isString()) { 58 RefPtr<UString::Rep> value = concatenate(p1.toString(callFrame).rep(), p2.toString(callFrame).rep()); 59 if (!value) 60 return throwOutOfMemoryError(callFrame); 61 return jsString(callFrame, value.release()); 61 62 } 62 if (p2.isString())63 return jsString(callFrame, p1.toString(callFrame), asString(p2));64 63 65 64 return jsNumber(callFrame, p1.toNumber(callFrame) + p2.toNumber(callFrame)); -
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.