18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is free software; you can redistribute it and/or
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  modify it under the terms of the GNU Lesser General Public
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License as published by the Free Software Foundation; either
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  version 2 of the License, or (at your option) any later version.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is distributed in the hope that it will be useful,
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Lesser General Public License for more details.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  You should have received a copy of the GNU Lesser General Public
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License along with this library; if not, write to the Free Software
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "StringObject.h"
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PropertyNameArray.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectASSERT_CLASS_FITS_IN_CELL(StringObject);
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochconst ClassInfo StringObject::s_info = { "String", &JSWrapperObject::s_info, 0, 0 };
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochStringObject::StringObject(ExecState* exec, Structure* structure)
332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    : JSWrapperObject(exec->globalData(), structure)
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(inherits(&s_info));
362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    setInternalValue(exec->globalData(), jsEmptyString(exec));
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochStringObject::StringObject(JSGlobalData& globalData, Structure* structure, JSString* string)
402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    : JSWrapperObject(globalData, structure)
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(inherits(&s_info));
432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    setInternalValue(globalData, string);
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochStringObject::StringObject(ExecState* exec, Structure* structure, const UString& string)
472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    : JSWrapperObject(exec->globalData(), structure)
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(inherits(&s_info));
502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    setInternalValue(exec->globalData(), jsString(exec, string));
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool StringObject::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (internalValue()->getStringPropertySlot(exec, propertyName, slot))
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return JSObject::getOwnPropertySlot(exec, propertyName, slot);
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool StringObject::getOwnPropertySlot(ExecState* exec, unsigned propertyName, PropertySlot& slot)
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (internalValue()->getStringPropertySlot(exec, propertyName, slot))
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return JSObject::getOwnPropertySlot(exec, Identifier::from(exec, propertyName), slot);
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool StringObject::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
69231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (internalValue()->getStringPropertyDescriptor(exec, propertyName, descriptor))
70231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return true;
71231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return JSObject::getOwnPropertyDescriptor(exec, propertyName, descriptor);
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
73231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid StringObject::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (propertyName == exec->propertyNames().length)
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSObject::put(exec, propertyName, value, slot);
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool StringObject::deleteProperty(ExecState* exec, const Identifier& propertyName)
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (propertyName == exec->propertyNames().length)
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool isStrictUInt32;
86f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    unsigned i = propertyName.toUInt32(isStrictUInt32);
87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (isStrictUInt32 && internalValue()->canGetIndex(i))
88643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return JSObject::deleteProperty(exec, propertyName);
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
92d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid StringObject::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode)
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    int size = internalValue()->length();
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < size; ++i)
96f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        propertyNames.add(Identifier(exec, UString::number(i)));
97d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (mode == IncludeDontEnumProperties)
98d0825bca7fe65beaee391d30da42e937db621564Steve Block        propertyNames.add(exec->propertyNames().length);
99d0825bca7fe65beaee391d30da42e937db621564Steve Block    return JSObject::getOwnPropertyNames(exec, propertyNames, mode);
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC
103