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::s_info = { "String", &JSWrapperObject::s_info, 0, 0 };
     31 
     32 StringObject::StringObject(ExecState* exec, Structure* structure)
     33     : JSWrapperObject(exec->globalData(), structure)
     34 {
     35     ASSERT(inherits(&s_info));
     36     setInternalValue(exec->globalData(), jsEmptyString(exec));
     37 }
     38 
     39 StringObject::StringObject(JSGlobalData& globalData, Structure* structure, JSString* string)
     40     : JSWrapperObject(globalData, structure)
     41 {
     42     ASSERT(inherits(&s_info));
     43     setInternalValue(globalData, string);
     44 }
     45 
     46 StringObject::StringObject(ExecState* exec, Structure* structure, const UString& string)
     47     : JSWrapperObject(exec->globalData(), structure)
     48 {
     49     ASSERT(inherits(&s_info));
     50     setInternalValue(exec->globalData(), jsString(exec, string));
     51 }
     52 
     53 bool StringObject::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
     54 {
     55     if (internalValue()->getStringPropertySlot(exec, propertyName, slot))
     56         return true;
     57     return JSObject::getOwnPropertySlot(exec, propertyName, slot);
     58 }
     59 
     60 bool StringObject::getOwnPropertySlot(ExecState* exec, unsigned propertyName, PropertySlot& slot)
     61 {
     62     if (internalValue()->getStringPropertySlot(exec, propertyName, slot))
     63         return true;
     64     return JSObject::getOwnPropertySlot(exec, Identifier::from(exec, propertyName), slot);
     65 }
     66 
     67 bool StringObject::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
     68 {
     69     if (internalValue()->getStringPropertyDescriptor(exec, propertyName, descriptor))
     70         return true;
     71     return JSObject::getOwnPropertyDescriptor(exec, propertyName, descriptor);
     72 }
     73 
     74 void StringObject::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
     75 {
     76     if (propertyName == exec->propertyNames().length)
     77         return;
     78     JSObject::put(exec, propertyName, value, slot);
     79 }
     80 
     81 bool StringObject::deleteProperty(ExecState* exec, const Identifier& propertyName)
     82 {
     83     if (propertyName == exec->propertyNames().length)
     84         return false;
     85     bool isStrictUInt32;
     86     unsigned i = propertyName.toUInt32(isStrictUInt32);
     87     if (isStrictUInt32 && internalValue()->canGetIndex(i))
     88         return false;
     89     return JSObject::deleteProperty(exec, propertyName);
     90 }
     91 
     92 void StringObject::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode)
     93 {
     94     int size = internalValue()->length();
     95     for (int i = 0; i < size; ++i)
     96         propertyNames.add(Identifier(exec, UString::number(i)));
     97     if (mode == IncludeDontEnumProperties)
     98         propertyNames.add(exec->propertyNames().length);
     99     return JSObject::getOwnPropertyNames(exec, propertyNames, mode);
    100 }
    101 
    102 } // namespace JSC
    103