]>
git.saurik.com Git - apple/javascriptcore.git/blob - runtime/JSCell.cpp
869fbfc883e0ab2bd0d0a859090a02e43c2a36cf
   2  *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org) 
   3  *  Copyright (C) 2001 Peter Kelly (pmk@post.com) 
   4  *  Copyright (C) 2003, 2007, 2008 Apple Inc. All rights reserved. 
   6  *  This library is free software; you can redistribute it and/or 
   7  *  modify it under the terms of the GNU Library General Public 
   8  *  License as published by the Free Software Foundation; either 
   9  *  version 2 of the License, or (at your option) any later version. 
  11  *  This library is distributed in the hope that it will be useful, 
  12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
  13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
  14  *  Library General Public License for more details. 
  16  *  You should have received a copy of the GNU Library General Public License 
  17  *  along with this library; see the file COPYING.LIB.  If not, write to 
  18  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
  19  *  Boston, MA 02110-1301, USA. 
  26 #include "JSFunction.h" 
  29 #include <wtf/MathExtras.h> 
  33 #if defined NAN && defined INFINITY 
  35 extern const double NaN 
= NAN
; 
  36 extern const double Inf 
= INFINITY
; 
  38 #else // !(defined NAN && defined INFINITY) 
  40 // The trick is to define the NaN and Inf globals with a different type than the declaration. 
  41 // This trick works because the mangled name of the globals does not include the type, although 
  42 // I'm not sure that's guaranteed. There could be alignment issues with this, since arrays of 
  43 // characters don't necessarily need the same alignment doubles do, but for now it seems to work. 
  44 // It would be good to figure out a 100% clean way that still avoids code that runs at init time. 
  46 // Note, we have to use union to ensure alignment. Otherwise, NaN_Bytes can start anywhere, 
  47 // while NaN_double has to be 4-byte aligned for 32-bits. 
  48 // With -fstrict-aliasing enabled, unions are the only safe way to do type masquerading. 
  52         unsigned char NaN_Bytes
[8]; 
  53         unsigned char Inf_Bytes
[8]; 
  63     { 0x7f, 0xf8, 0, 0, 0, 0, 0, 0 }, 
  64     { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 } 
  65 #elif CPU(MIDDLE_ENDIAN) 
  66     { 0, 0, 0xf8, 0x7f, 0, 0, 0, 0 }, 
  67     { 0, 0, 0xf0, 0x7f, 0, 0, 0, 0 } 
  69     { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f }, 
  70     { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f } 
  74 extern const double NaN 
= NaNInf
.doubles
.NaN_Double
; 
  75 extern const double Inf 
= NaNInf
.doubles
.Inf_Double
; 
  77 #endif // !(defined NAN && defined INFINITY) 
  79 bool JSCell::getUInt32(uint32_t&) const 
  84 bool JSCell::getString(ExecState
* exec
, UString
&stringValue
) const 
  88     stringValue 
= static_cast<const JSString
*>(this)->value(exec
); 
  92 UString 
JSCell::getString(ExecState
* exec
) const 
  94     return isString() ? static_cast<const JSString
*>(this)->value(exec
) : UString(); 
  97 JSObject
* JSCell::getObject() 
  99     return isObject() ? asObject(this) : 0; 
 102 const JSObject
* JSCell::getObject() const 
 104     return isObject() ? static_cast<const JSObject
*>(this) : 0; 
 107 CallType 
JSCell::getCallData(CallData
&) 
 112 ConstructType 
JSCell::getConstructData(ConstructData
&) 
 114     return ConstructTypeNone
; 
 117 bool JSCell::getOwnPropertySlot(ExecState
* exec
, const Identifier
& identifier
, PropertySlot
& slot
) 
 119     // This is not a general purpose implementation of getOwnPropertySlot. 
 120     // It should only be called by JSValue::get. 
 121     // It calls getPropertySlot, not getOwnPropertySlot. 
 122     JSObject
* object 
= toObject(exec
); 
 123     slot
.setBase(object
); 
 124     if (!object
->getPropertySlot(exec
, identifier
, slot
)) 
 129 bool JSCell::getOwnPropertySlot(ExecState
* exec
, unsigned identifier
, PropertySlot
& slot
) 
 131     // This is not a general purpose implementation of getOwnPropertySlot. 
 132     // It should only be called by JSValue::get. 
 133     // It calls getPropertySlot, not getOwnPropertySlot. 
 134     JSObject
* object 
= toObject(exec
); 
 135     slot
.setBase(object
); 
 136     if (!object
->getPropertySlot(exec
, identifier
, slot
)) 
 141 void JSCell::put(ExecState
* exec
, const Identifier
& identifier
, JSValue value
, PutPropertySlot
& slot
) 
 143     toObject(exec
)->put(exec
, identifier
, value
, slot
); 
 146 void JSCell::put(ExecState
* exec
, unsigned identifier
, JSValue value
) 
 148     toObject(exec
)->put(exec
, identifier
, value
); 
 151 bool JSCell::deleteProperty(ExecState
* exec
, const Identifier
& identifier
) 
 153     return toObject(exec
)->deleteProperty(exec
, identifier
); 
 156 bool JSCell::deleteProperty(ExecState
* exec
, unsigned identifier
) 
 158     return toObject(exec
)->deleteProperty(exec
, identifier
); 
 161 JSObject
* JSCell::toThisObject(ExecState
* exec
) const 
 163     return toObject(exec
); 
 166 UString 
JSCell::toThisString(ExecState
* exec
) const 
 168     return toThisObject(exec
)->toString(exec
); 
 171 JSString
* JSCell::toThisJSString(ExecState
* exec
) 
 173     return jsString(exec
, toThisString(exec
)); 
 176 const ClassInfo
* JSCell::classInfo() const 
 181 JSValue 
JSCell::getJSNumber() 
 186 bool JSCell::isGetterSetter() const 
 191 JSValue 
JSCell::toPrimitive(ExecState
*, PreferredPrimitiveType
) const 
 193     ASSERT_NOT_REACHED(); 
 197 bool JSCell::getPrimitiveNumber(ExecState
*, double&, JSValue
&) 
 199     ASSERT_NOT_REACHED(); 
 203 bool JSCell::toBoolean(ExecState
*) const 
 205     ASSERT_NOT_REACHED(); 
 209 double JSCell::toNumber(ExecState
*) const 
 211     ASSERT_NOT_REACHED(); 
 215 UString 
JSCell::toString(ExecState
*) const 
 217     ASSERT_NOT_REACHED(); 
 221 JSObject
* JSCell::toObject(ExecState
*) const 
 223     ASSERT_NOT_REACHED();