2 * Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
3 * Copyright (C) 2001 Peter Kelly (pmk@post.com)
4 * Copyright (C) 2003, 2004, 2005, 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.
23 #ifndef JSNumberCell_h
24 #define JSNumberCell_h
26 #include "CallFrame.h"
28 #include "JSImmediate.h"
29 #include "Collector.h"
31 #include <stddef.h> // for size_t
35 extern const double NaN
;
36 extern const double Inf
;
39 JSValue
jsNumberCell(ExecState
*, double);
50 class JSNumberCell
: public JSCell
{
52 friend JSValue
jsNumberCell(JSGlobalData
*, double);
53 friend JSValue
jsNumberCell(ExecState
*, double);
56 double value() const { return m_value
; }
58 virtual JSValue
toPrimitive(ExecState
*, PreferredPrimitiveType
) const;
59 virtual bool getPrimitiveNumber(ExecState
*, double& number
, JSValue
& value
);
60 virtual bool toBoolean(ExecState
*) const;
61 virtual double toNumber(ExecState
*) const;
62 virtual UString
toString(ExecState
*) const;
63 virtual JSObject
* toObject(ExecState
*) const;
65 virtual UString
toThisString(ExecState
*) const;
66 virtual JSObject
* toThisObject(ExecState
*) const;
67 virtual JSValue
getJSNumber();
69 void* operator new(size_t size
, ExecState
* exec
)
71 return exec
->heap()->allocateNumber(size
);
74 void* operator new(size_t size
, JSGlobalData
* globalData
)
76 return globalData
->heap
.allocateNumber(size
);
79 static PassRefPtr
<Structure
> createStructure(JSValue proto
) { return Structure::create(proto
, TypeInfo(NumberType
, OverridesGetOwnPropertySlot
| NeedsThisConversion
), AnonymousSlotCount
); }
82 JSNumberCell(JSGlobalData
* globalData
, double value
)
83 : JSCell(globalData
->numberStructure
.get())
88 JSNumberCell(ExecState
* exec
, double value
)
89 : JSCell(exec
->globalData().numberStructure
.get())
94 virtual bool getUInt32(uint32_t&) const;
99 JSValue
jsNumberCell(JSGlobalData
*, double);
101 inline bool isNumberCell(JSValue v
)
103 return v
.isCell() && v
.asCell()->isNumber();
106 inline JSNumberCell
* asNumberCell(JSValue v
)
108 ASSERT(isNumberCell(v
));
109 return static_cast<JSNumberCell
*>(v
.asCell());
112 ALWAYS_INLINE
JSValue::JSValue(EncodeAsDoubleTag
, ExecState
* exec
, double d
)
114 *this = jsNumberCell(exec
, d
);
117 inline JSValue::JSValue(ExecState
* exec
, double d
)
119 JSValue v
= JSImmediate::from(d
);
120 *this = v
? v
: jsNumberCell(exec
, d
);
123 inline JSValue::JSValue(ExecState
* exec
, int i
)
125 JSValue v
= JSImmediate::from(i
);
126 *this = v
? v
: jsNumberCell(exec
, i
);
129 inline JSValue::JSValue(ExecState
* exec
, unsigned i
)
131 JSValue v
= JSImmediate::from(i
);
132 *this = v
? v
: jsNumberCell(exec
, i
);
135 inline JSValue::JSValue(ExecState
* exec
, long i
)
137 JSValue v
= JSImmediate::from(i
);
138 *this = v
? v
: jsNumberCell(exec
, i
);
141 inline JSValue::JSValue(ExecState
* exec
, unsigned long i
)
143 JSValue v
= JSImmediate::from(i
);
144 *this = v
? v
: jsNumberCell(exec
, i
);
147 inline JSValue::JSValue(ExecState
* exec
, long long i
)
149 JSValue v
= JSImmediate::from(i
);
150 *this = v
? v
: jsNumberCell(exec
, static_cast<double>(i
));
153 inline JSValue::JSValue(ExecState
* exec
, unsigned long long i
)
155 JSValue v
= JSImmediate::from(i
);
156 *this = v
? v
: jsNumberCell(exec
, static_cast<double>(i
));
159 inline JSValue::JSValue(JSGlobalData
* globalData
, double d
)
161 JSValue v
= JSImmediate::from(d
);
162 *this = v
? v
: jsNumberCell(globalData
, d
);
165 inline JSValue::JSValue(JSGlobalData
* globalData
, int i
)
167 JSValue v
= JSImmediate::from(i
);
168 *this = v
? v
: jsNumberCell(globalData
, i
);
171 inline JSValue::JSValue(JSGlobalData
* globalData
, unsigned i
)
173 JSValue v
= JSImmediate::from(i
);
174 *this = v
? v
: jsNumberCell(globalData
, i
);
177 inline bool JSValue::isDouble() const
179 return isNumberCell(asValue());
182 inline double JSValue::asDouble() const
184 return asNumberCell(asValue())->value();
187 inline bool JSValue::isNumber() const
189 return JSImmediate::isNumber(asValue()) || isDouble();
192 inline double JSValue::uncheckedGetNumber() const
195 return JSImmediate::isImmediate(asValue()) ? JSImmediate::toDouble(asValue()) : asDouble();
198 #endif // USE(JSVALUE32)
201 ALWAYS_INLINE
JSValue::JSValue(EncodeAsDoubleTag
, ExecState
*, double d
)
203 *this = JSImmediate::fromNumberOutsideIntegerRange(d
);
206 inline JSValue::JSValue(ExecState
*, double d
)
208 JSValue v
= JSImmediate::from(d
);
213 inline JSValue::JSValue(ExecState
*, int i
)
215 JSValue v
= JSImmediate::from(i
);
220 inline JSValue::JSValue(ExecState
*, unsigned i
)
222 JSValue v
= JSImmediate::from(i
);
227 inline JSValue::JSValue(ExecState
*, long i
)
229 JSValue v
= JSImmediate::from(i
);
234 inline JSValue::JSValue(ExecState
*, unsigned long i
)
236 JSValue v
= JSImmediate::from(i
);
241 inline JSValue::JSValue(ExecState
*, long long i
)
243 JSValue v
= JSImmediate::from(static_cast<double>(i
));
248 inline JSValue::JSValue(ExecState
*, unsigned long long i
)
250 JSValue v
= JSImmediate::from(static_cast<double>(i
));
255 inline JSValue::JSValue(JSGlobalData
*, double d
)
257 JSValue v
= JSImmediate::from(d
);
262 inline JSValue::JSValue(JSGlobalData
*, int i
)
264 JSValue v
= JSImmediate::from(i
);
269 inline JSValue::JSValue(JSGlobalData
*, unsigned i
)
271 JSValue v
= JSImmediate::from(i
);
276 inline bool JSValue::isDouble() const
278 return JSImmediate::isDouble(asValue());
281 inline double JSValue::asDouble() const
283 return JSImmediate::doubleValue(asValue());
286 inline bool JSValue::isNumber() const
288 return JSImmediate::isNumber(asValue());
291 inline double JSValue::uncheckedGetNumber() const
294 return JSImmediate::toDouble(asValue());
297 #endif // USE(JSVALUE64)
299 #if USE(JSVALUE32) || USE(JSVALUE64)
301 inline JSValue::JSValue(ExecState
*, char i
)
303 ASSERT(JSImmediate::from(i
));
304 *this = JSImmediate::from(i
);
307 inline JSValue::JSValue(ExecState
*, unsigned char i
)
309 ASSERT(JSImmediate::from(i
));
310 *this = JSImmediate::from(i
);
313 inline JSValue::JSValue(ExecState
*, short i
)
315 ASSERT(JSImmediate::from(i
));
316 *this = JSImmediate::from(i
);
319 inline JSValue::JSValue(ExecState
*, unsigned short i
)
321 ASSERT(JSImmediate::from(i
));
322 *this = JSImmediate::from(i
);
325 inline JSValue
jsNaN(ExecState
* exec
)
327 return jsNumber(exec
, NaN
);
330 inline JSValue
jsNaN(JSGlobalData
* globalData
)
332 return jsNumber(globalData
, NaN
);
335 // --- JSValue inlines ----------------------------
337 ALWAYS_INLINE JSValue
JSValue::toJSNumber(ExecState
* exec
) const
339 return isNumber() ? asValue() : jsNumber(exec
, this->toNumber(exec
));
342 inline bool JSValue::getNumber(double &result
) const
346 else if (LIKELY(isDouble()))
355 #endif // USE(JSVALUE32) || USE(JSVALUE64)
359 #endif // JSNumberCell_h