diff options
Diffstat (limited to 'JavaScriptCore/runtime/Operations.h')
-rw-r--r-- | JavaScriptCore/runtime/Operations.h | 68 |
1 files changed, 41 insertions, 27 deletions
diff --git a/JavaScriptCore/runtime/Operations.h b/JavaScriptCore/runtime/Operations.h index 5a905e3..c3aa0fa 100644 --- a/JavaScriptCore/runtime/Operations.h +++ b/JavaScriptCore/runtime/Operations.h @@ -37,6 +37,11 @@ namespace JSC { ALWAYS_INLINE JSValue jsString(ExecState* exec, JSString* s1, JSString* s2) { + if (!s1->length()) + return s2; + if (!s2->length()) + return s1; + unsigned ropeLength = s1->ropeLength() + s2->ropeLength(); JSGlobalData* globalData = &exec->globalData(); @@ -53,6 +58,42 @@ namespace JSC { return new (globalData) JSString(globalData, rope.release()); } + ALWAYS_INLINE JSValue jsString(ExecState* exec, const UString& u1, JSString* s2) + { + unsigned ropeLength = 1 + s2->ropeLength(); + JSGlobalData* globalData = &exec->globalData(); + + if (ropeLength <= JSString::s_maxInternalRopeLength) + return new (globalData) JSString(globalData, ropeLength, u1, s2); + + unsigned index = 0; + RefPtr<JSString::Rope> rope = JSString::Rope::createOrNull(ropeLength); + if (UNLIKELY(!rope)) + return throwOutOfMemoryError(exec); + rope->append(index, u1); + rope->append(index, s2); + ASSERT(index == ropeLength); + return new (globalData) JSString(globalData, rope.release()); + } + + ALWAYS_INLINE JSValue jsString(ExecState* exec, JSString* s1, const UString& u2) + { + unsigned ropeLength = s1->ropeLength() + 1; + JSGlobalData* globalData = &exec->globalData(); + + if (ropeLength <= JSString::s_maxInternalRopeLength) + return new (globalData) JSString(globalData, ropeLength, s1, u2); + + unsigned index = 0; + RefPtr<JSString::Rope> rope = JSString::Rope::createOrNull(ropeLength); + if (UNLIKELY(!rope)) + return throwOutOfMemoryError(exec); + rope->append(index, s1); + rope->append(index, u2); + ASSERT(index == ropeLength); + return new (globalData) JSString(globalData, rope.release()); + } + ALWAYS_INLINE JSValue jsString(ExecState* exec, Register* strings, unsigned count) { ASSERT(count >= 3); @@ -284,32 +325,6 @@ namespace JSC { ALWAYS_INLINE JSValue jsAdd(CallFrame* callFrame, JSValue v1, JSValue v2) { -<<<<<<< HEAD - double left; - double right = 0.0; - - bool rightIsNumber = v2.getNumber(right); - if (rightIsNumber && v1.getNumber(left)) - return jsNumber(callFrame, left + right); - - bool leftIsString = v1.isString(); - if (leftIsString && v2.isString()) { - if (!asString(v1)->length()) - return asString(v2); - if (!asString(v2)->length()) - return asString(v1); - return jsString(callFrame, asString(v1), asString(v2)); - } - - if (rightIsNumber & leftIsString) { - RefPtr<UString::Rep> value = v2.isInt32() ? - concatenate(asString(v1)->value(callFrame).rep(), v2.asInt32()) : - concatenate(asString(v1)->value(callFrame).rep(), right); - - if (!value) - return throwOutOfMemoryError(callFrame); - return jsString(callFrame, value.release()); -======= double left = 0.0, right; if (v1.getNumber(left) && v2.getNumber(right)) return jsNumber(callFrame, left + right); @@ -318,7 +333,6 @@ namespace JSC { return v2.isString() ? jsString(callFrame, asString(v1), asString(v2)) : jsString(callFrame, asString(v1), v2.toPrimitiveString(callFrame)); ->>>>>>> webkit.org at r54127 } // All other cases are pretty uncommon |