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