• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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.
5  *
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.
10  *
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.
15  *
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.
20  *
21  */
22 
23 #include "config.h"
24 #include "JSCell.h"
25 
26 #include "JSFunction.h"
27 #include "JSString.h"
28 #include "JSObject.h"
29 #include <wtf/MathExtras.h>
30 
31 namespace JSC {
32 
33 #if defined NAN && defined INFINITY
34 
35 extern const double NaN = NAN;
36 extern const double Inf = INFINITY;
37 
38 #else // !(defined NAN && defined INFINITY)
39 
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.
45 
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.
49 
50 static const union {
51     struct {
52         unsigned char NaN_Bytes[8];
53         unsigned char Inf_Bytes[8];
54     } bytes;
55 
56     struct {
57         double NaN_Double;
58         double Inf_Double;
59     } doubles;
60 
61 } NaNInf = { {
62 #if PLATFORM(BIG_ENDIAN)
63     { 0x7f, 0xf8, 0, 0, 0, 0, 0, 0 },
64     { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 }
65 #elif PLATFORM(MIDDLE_ENDIAN)
66     { 0, 0, 0xf8, 0x7f, 0, 0, 0, 0 },
67     { 0, 0, 0xf0, 0x7f, 0, 0, 0, 0 }
68 #else
69     { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f },
70     { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f }
71 #endif
72 } } ;
73 
74 extern const double NaN = NaNInf.doubles.NaN_Double;
75 extern const double Inf = NaNInf.doubles.Inf_Double;
76 
77 #endif // !(defined NAN && defined INFINITY)
78 
operator new(size_t size,ExecState * exec)79 void* JSCell::operator new(size_t size, ExecState* exec)
80 {
81 #ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE
82     return exec->heap()->inlineAllocate(size);
83 #else
84     return exec->heap()->allocate(size);
85 #endif
86 }
87 
getUInt32(uint32_t &) const88 bool JSCell::getUInt32(uint32_t&) const
89 {
90     return false;
91 }
92 
getString(UString & stringValue) const93 bool JSCell::getString(UString&stringValue) const
94 {
95     if (!isString())
96         return false;
97     stringValue = static_cast<const JSString*>(this)->value();
98     return true;
99 }
100 
getString() const101 UString JSCell::getString() const
102 {
103     return isString() ? static_cast<const JSString*>(this)->value() : UString();
104 }
105 
getObject()106 JSObject* JSCell::getObject()
107 {
108     return isObject() ? static_cast<JSObject*>(this) : 0;
109 }
110 
getObject() const111 const JSObject* JSCell::getObject() const
112 {
113     return isObject() ? static_cast<const JSObject*>(this) : 0;
114 }
115 
getCallData(CallData &)116 CallType JSCell::getCallData(CallData&)
117 {
118     return CallTypeNone;
119 }
120 
getConstructData(ConstructData &)121 ConstructType JSCell::getConstructData(ConstructData&)
122 {
123     return ConstructTypeNone;
124 }
125 
getOwnPropertySlot(ExecState * exec,const Identifier & identifier,PropertySlot & slot)126 bool JSCell::getOwnPropertySlot(ExecState* exec, const Identifier& identifier, PropertySlot& slot)
127 {
128     // This is not a general purpose implementation of getOwnPropertySlot.
129     // It should only be called by JSValue::get.
130     // It calls getPropertySlot, not getOwnPropertySlot.
131     JSObject* object = toObject(exec);
132     slot.setBase(object);
133     if (!object->getPropertySlot(exec, identifier, slot))
134         slot.setUndefined();
135     return true;
136 }
137 
getOwnPropertySlot(ExecState * exec,unsigned identifier,PropertySlot & slot)138 bool JSCell::getOwnPropertySlot(ExecState* exec, unsigned identifier, PropertySlot& slot)
139 {
140     // This is not a general purpose implementation of getOwnPropertySlot.
141     // It should only be called by JSValue::get.
142     // It calls getPropertySlot, not getOwnPropertySlot.
143     JSObject* object = toObject(exec);
144     slot.setBase(object);
145     if (!object->getPropertySlot(exec, identifier, slot))
146         slot.setUndefined();
147     return true;
148 }
149 
put(ExecState * exec,const Identifier & identifier,JSValue value,PutPropertySlot & slot)150 void JSCell::put(ExecState* exec, const Identifier& identifier, JSValue value, PutPropertySlot& slot)
151 {
152     toObject(exec)->put(exec, identifier, value, slot);
153 }
154 
put(ExecState * exec,unsigned identifier,JSValue value)155 void JSCell::put(ExecState* exec, unsigned identifier, JSValue value)
156 {
157     toObject(exec)->put(exec, identifier, value);
158 }
159 
deleteProperty(ExecState * exec,const Identifier & identifier)160 bool JSCell::deleteProperty(ExecState* exec, const Identifier& identifier)
161 {
162     return toObject(exec)->deleteProperty(exec, identifier);
163 }
164 
deleteProperty(ExecState * exec,unsigned identifier)165 bool JSCell::deleteProperty(ExecState* exec, unsigned identifier)
166 {
167     return toObject(exec)->deleteProperty(exec, identifier);
168 }
169 
toThisObject(ExecState * exec) const170 JSObject* JSCell::toThisObject(ExecState* exec) const
171 {
172     return toObject(exec);
173 }
174 
toThisString(ExecState * exec) const175 UString JSCell::toThisString(ExecState* exec) const
176 {
177     return toThisObject(exec)->toString(exec);
178 }
179 
toThisJSString(ExecState * exec)180 JSString* JSCell::toThisJSString(ExecState* exec)
181 {
182     return jsString(exec, toThisString(exec));
183 }
184 
classInfo() const185 const ClassInfo* JSCell::classInfo() const
186 {
187     return 0;
188 }
189 
getJSNumber()190 JSValue JSCell::getJSNumber()
191 {
192     return JSValue();
193 }
194 
isGetterSetter() const195 bool JSCell::isGetterSetter() const
196 {
197     return false;
198 }
199 
200 } // namespace JSC
201