Home | History | Annotate | Download | only in runtime
      1 /*
      2  *  Copyright (C) 1999-2001 Harri Porten (porten (at) kde.org)
      3  *  Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
      4  *
      5  *  This library is free software; you can redistribute it and/or
      6  *  modify it under the terms of the GNU Lesser General Public
      7  *  License as published by the Free Software Foundation; either
      8  *  version 2 of the License, or (at your option) any later version.
      9  *
     10  *  This library is distributed in the hope that it will be useful,
     11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13  *  Lesser General Public License for more details.
     14  *
     15  *  You should have received a copy of the GNU Lesser General Public
     16  *  License along with this library; if not, write to the Free Software
     17  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     18  *
     19  */
     20 
     21 #include "config.h"
     22 #include "StringObject.h"
     23 
     24 #include "PropertyNameArray.h"
     25 
     26 namespace JSC {
     27 
     28 ASSERT_CLASS_FITS_IN_CELL(StringObject);
     29 
     30 const ClassInfo StringObject::info = { "String", 0, 0, 0 };
     31 
     32 StringObject::StringObject(ExecState* exec, NonNullPassRefPtr<Structure> structure)
     33     : JSWrapperObject(structure)
     34 {
     35     setInternalValue(jsEmptyString(exec));
     36 }
     37 
     38 StringObject::StringObject(NonNullPassRefPtr<Structure> structure, JSString* string)
     39     : JSWrapperObject(structure)
     40 {
     41     setInternalValue(string);
     42 }
     43 
     44 StringObject::StringObject(ExecState* exec, NonNullPassRefPtr<Structure> structure, const UString& string)
     45     : JSWrapperObject(structure)
     46 {
     47     setInternalValue(jsString(exec, string));
     48 }
     49 
     50 bool StringObject::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
     51 {
     52     if (internalValue()->getStringPropertySlot(exec, propertyName, slot))
     53         return true;
     54     return JSObject::getOwnPropertySlot(exec, propertyName, slot);
     55 }
     56 
     57 bool StringObject::getOwnPropertySlot(ExecState* exec, unsigned propertyName, PropertySlot& slot)
     58 {
     59     if (internalValue()->getStringPropertySlot(exec, propertyName, slot))
     60         return true;
     61     return JSObject::getOwnPropertySlot(exec, Identifier::from(exec, propertyName), slot);
     62 }
     63 
     64 bool StringObject::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
     65 {
     66     if (internalValue()->getStringPropertyDescriptor(exec, propertyName, descriptor))
     67         return true;
     68     return JSObject::getOwnPropertyDescriptor(exec, propertyName, descriptor);
     69 }
     70 
     71 void StringObject::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
     72 {
     73     if (propertyName == exec->propertyNames().length)
     74         return;
     75     JSObject::put(exec, propertyName, value, slot);
     76 }
     77 
     78 bool StringObject::deleteProperty(ExecState* exec, const Identifier& propertyName)
     79 {
     80     if (propertyName == exec->propertyNames().length)
     81         return false;
     82     bool isStrictUInt32;
     83     unsigned i = propertyName.toStrictUInt32(&isStrictUInt32);
     84     if (isStrictUInt32 && internalValue()->canGetIndex(i))
     85         return false;
     86     return JSObject::deleteProperty(exec, propertyName);
     87 }
     88 
     89 void StringObject::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode)
     90 {
     91     int size = internalValue()->length();
     92     for (int i = 0; i < size; ++i)
     93         propertyNames.add(Identifier(exec, UString::from(i)));
     94     if (mode == IncludeDontEnumProperties)
     95         propertyNames.add(exec->propertyNames().length);
     96     return JSObject::getOwnPropertyNames(exec, propertyNames, mode);
     97 }
     98 
     99 } // namespace JSC
    100