#include "config.h"
#include "JSString.h"
#include "JSGlobalObject.h"
#include "JSObject.h"
#include "StringObject.h"
#include "StringPrototype.h"
namespace JSC {
JSValuePtr JSString::toPrimitive(ExecState*, PreferredPrimitiveType) const
{
return const_cast<JSString*>(this);
}
bool JSString::getPrimitiveNumber(ExecState*, double& number, JSValuePtr& value)
{
value = this;
number = m_value.toDouble();
return false;
}
bool JSString::toBoolean(ExecState*) const
{
return !m_value.isEmpty();
}
double JSString::toNumber(ExecState*) const
{
return m_value.toDouble();
}
UString JSString::toString(ExecState*) const
{
return m_value;
}
UString JSString::toThisString(ExecState*) const
{
return m_value;
}
JSString* JSString::toThisJSString(ExecState*)
{
return this;
}
inline StringObject* StringObject::create(ExecState* exec, JSString* string)
{
return new (exec) StringObject(exec->lexicalGlobalObject()->stringObjectStructure(), string);
}
JSObject* JSString::toObject(ExecState* exec) const
{
return StringObject::create(exec, const_cast<JSString*>(this));
}
JSObject* JSString::toThisObject(ExecState* exec) const
{
return StringObject::create(exec, const_cast<JSString*>(this));
}
bool JSString::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
{
if (getStringPropertySlot(exec, propertyName, slot))
return true;
slot.setBase(this);
JSObject* object;
for (JSValuePtr prototype = exec->lexicalGlobalObject()->stringPrototype(); !prototype.isNull(); prototype = object->prototype()) {
object = asObject(prototype);
if (object->getOwnPropertySlot(exec, propertyName, slot))
return true;
}
slot.setUndefined();
return true;
}
bool JSString::getOwnPropertySlot(ExecState* exec, unsigned propertyName, PropertySlot& slot)
{
if (getStringPropertySlot(exec, propertyName, slot))
return true;
return JSString::getOwnPropertySlot(exec, Identifier::from(exec, propertyName), slot);
}
JSString* jsString(JSGlobalData* globalData, const UString& s)
{
int size = s.size();
if (!size)
return globalData->smallStrings.emptyString(globalData);
if (size == 1) {
UChar c = s.data()[0];
if (c <= 0xFF)
return globalData->smallStrings.singleCharacterString(globalData, c);
}
return new (globalData) JSString(globalData, s);
}
JSString* jsSubstring(JSGlobalData* globalData, const UString& s, unsigned offset, unsigned length)
{
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));
}
JSString* jsOwnedString(JSGlobalData* globalData, const UString& s)
{
int size = s.size();
if (!size)
return globalData->smallStrings.emptyString(globalData);
if (size == 1) {
UChar c = s.data()[0];
if (c <= 0xFF)
return globalData->smallStrings.singleCharacterString(globalData, c);
}
return new (globalData) JSString(globalData, s, JSString::HasOtherOwner);
}
}