- ASSERT(offset <= static_cast<unsigned>(s.size()));
- ASSERT(length <= static_cast<unsigned>(s.size()));
- ASSERT(offset + length <= static_cast<unsigned>(s.size()));
- if (!length)
- return globalData->smallStrings.emptyString(globalData);
- if (length == 1) {
- UChar c = s.data()[offset];
- if (c <= 0xFF)
- return globalData->smallStrings.singleCharacterString(globalData, c);
- }
- return new (globalData) JSString(globalData, UString::Rep::create(s.rep(), offset, length));
+ clearFibers();
+ ASSERT(isRope());
+ ASSERT(m_value.isNull());
+ if (exec)
+ throwOutOfMemoryError(exec);
+}
+
+JSString* JSRopeString::getIndexSlowCase(ExecState* exec, unsigned i)
+{
+ ASSERT(isRope());
+ resolveRope(exec);
+ // Return a safe no-value result, this should never be used, since the excetion will be thrown.
+ if (exec->exception())
+ return jsEmptyString(exec);
+ ASSERT(!isRope());
+ RELEASE_ASSERT(i < m_value.length());
+ return jsSingleCharacterSubstring(exec, m_value, i);
+}
+
+JSValue JSString::toPrimitive(ExecState*, PreferredPrimitiveType) const
+{
+ return const_cast<JSString*>(this);
+}
+
+bool JSString::getPrimitiveNumber(ExecState* exec, double& number, JSValue& result) const
+{
+ result = this;
+ number = jsToNumber(value(exec));
+ return false;
+}
+
+bool JSString::toBoolean() const
+{
+ return m_length;
+}
+
+double JSString::toNumber(ExecState* exec) const
+{
+ return jsToNumber(value(exec));
+}
+
+inline StringObject* StringObject::create(VM& vm, JSGlobalObject* globalObject, JSString* string)
+{
+ StringObject* object = new (NotNull, allocateCell<StringObject>(vm.heap)) StringObject(vm, globalObject->stringObjectStructure());
+ object->finishCreation(vm, string);
+ return object;
+}
+
+JSObject* JSString::toObject(ExecState* exec, JSGlobalObject* globalObject) const
+{
+ return StringObject::create(exec->vm(), globalObject, const_cast<JSString*>(this));
+}
+
+JSValue JSString::toThis(JSCell* cell, ExecState* exec, ECMAMode ecmaMode)
+{
+ if (ecmaMode == StrictMode)
+ return cell;
+ return StringObject::create(exec->vm(), exec->lexicalGlobalObject(), jsCast<JSString*>(cell));