100
102
virtual bool getUInt32(uint32_t&) const;
101
virtual bool getTruncatedInt32(int32_t&) const;
102
virtual bool getTruncatedUInt32(uint32_t&) const;
107
extern const double NaN;
108
extern const double Inf;
110
JSNumberCell* asNumberCell(JSValuePtr);
112
JSValuePtr jsNumberCell(JSGlobalData*, double);
113
JSValuePtr jsNaN(JSGlobalData*);
114
JSValuePtr jsNumberCell(ExecState*, double);
115
JSValuePtr jsNaN(ExecState*);
117
inline JSNumberCell* asNumberCell(JSValuePtr value)
119
ASSERT(asCell(value)->isNumber());
120
return static_cast<JSNumberCell*>(asCell(value));
123
ALWAYS_INLINE JSValuePtr jsNumber(ExecState* exec, double d)
125
JSValuePtr v = JSImmediate::from(d);
126
return v ? v : jsNumberCell(exec, d);
129
ALWAYS_INLINE JSValuePtr jsNumber(ExecState* exec, short i)
131
JSValuePtr v = JSImmediate::from(i);
132
return v ? v : jsNumberCell(exec, i);
135
ALWAYS_INLINE JSValuePtr jsNumber(ExecState* exec, unsigned short i)
137
JSValuePtr v = JSImmediate::from(i);
138
return v ? v : jsNumberCell(exec, i);
141
ALWAYS_INLINE JSValuePtr jsNumber(ExecState* exec, int i)
143
JSValuePtr v = JSImmediate::from(i);
144
return v ? v : jsNumberCell(exec, i);
147
ALWAYS_INLINE JSValuePtr jsNumber(ExecState* exec, unsigned i)
149
JSValuePtr v = JSImmediate::from(i);
150
return v ? v : jsNumberCell(exec, i);
153
ALWAYS_INLINE JSValuePtr jsNumber(ExecState* exec, long i)
155
JSValuePtr v = JSImmediate::from(i);
156
return v ? v : jsNumberCell(exec, i);
159
ALWAYS_INLINE JSValuePtr jsNumber(ExecState* exec, unsigned long i)
161
JSValuePtr v = JSImmediate::from(i);
162
return v ? v : jsNumberCell(exec, i);
165
ALWAYS_INLINE JSValuePtr jsNumber(ExecState* exec, long long i)
167
JSValuePtr v = JSImmediate::from(i);
168
return v ? v : jsNumberCell(exec, static_cast<double>(i));
171
ALWAYS_INLINE JSValuePtr jsNumber(ExecState* exec, unsigned long long i)
173
JSValuePtr v = JSImmediate::from(i);
174
return v ? v : jsNumberCell(exec, static_cast<double>(i));
177
ALWAYS_INLINE JSValuePtr jsNumber(JSGlobalData* globalData, double d)
179
JSValuePtr v = JSImmediate::from(d);
180
return v ? v : jsNumberCell(globalData, d);
183
ALWAYS_INLINE JSValuePtr jsNumber(JSGlobalData* globalData, short i)
185
JSValuePtr v = JSImmediate::from(i);
186
return v ? v : jsNumberCell(globalData, i);
189
ALWAYS_INLINE JSValuePtr jsNumber(JSGlobalData* globalData, unsigned short i)
191
JSValuePtr v = JSImmediate::from(i);
192
return v ? v : jsNumberCell(globalData, i);
195
ALWAYS_INLINE JSValuePtr jsNumber(JSGlobalData* globalData, int i)
197
JSValuePtr v = JSImmediate::from(i);
198
return v ? v : jsNumberCell(globalData, i);
201
ALWAYS_INLINE JSValuePtr jsNumber(JSGlobalData* globalData, unsigned i)
203
JSValuePtr v = JSImmediate::from(i);
204
return v ? v : jsNumberCell(globalData, i);
207
ALWAYS_INLINE JSValuePtr jsNumber(JSGlobalData* globalData, long i)
209
JSValuePtr v = JSImmediate::from(i);
210
return v ? v : jsNumberCell(globalData, i);
213
ALWAYS_INLINE JSValuePtr jsNumber(JSGlobalData* globalData, unsigned long i)
215
JSValuePtr v = JSImmediate::from(i);
216
return v ? v : jsNumberCell(globalData, i);
219
ALWAYS_INLINE JSValuePtr jsNumber(JSGlobalData* globalData, long long i)
221
JSValuePtr v = JSImmediate::from(i);
222
return v ? v : jsNumberCell(globalData, static_cast<double>(i));
225
ALWAYS_INLINE JSValuePtr jsNumber(JSGlobalData* globalData, unsigned long long i)
227
JSValuePtr v = JSImmediate::from(i);
228
return v ? v : jsNumberCell(globalData, static_cast<double>(i));
107
JSValue jsNumberCell(JSGlobalData*, double);
109
inline bool isNumberCell(JSValue v)
111
return v.isCell() && v.asCell()->isNumber();
114
inline JSNumberCell* asNumberCell(JSValue v)
116
ASSERT(isNumberCell(v));
117
return static_cast<JSNumberCell*>(v.asCell());
120
inline JSValue::JSValue(ExecState* exec, double d)
122
JSValue v = JSImmediate::from(d);
123
*this = v ? v : jsNumberCell(exec, d);
126
inline JSValue::JSValue(ExecState* exec, int i)
128
JSValue v = JSImmediate::from(i);
129
*this = v ? v : jsNumberCell(exec, i);
132
inline JSValue::JSValue(ExecState* exec, unsigned i)
134
JSValue v = JSImmediate::from(i);
135
*this = v ? v : jsNumberCell(exec, i);
138
inline JSValue::JSValue(ExecState* exec, long i)
140
JSValue v = JSImmediate::from(i);
141
*this = v ? v : jsNumberCell(exec, i);
144
inline JSValue::JSValue(ExecState* exec, unsigned long i)
146
JSValue v = JSImmediate::from(i);
147
*this = v ? v : jsNumberCell(exec, i);
150
inline JSValue::JSValue(ExecState* exec, long long i)
152
JSValue v = JSImmediate::from(i);
153
*this = v ? v : jsNumberCell(exec, static_cast<double>(i));
156
inline JSValue::JSValue(ExecState* exec, unsigned long long i)
158
JSValue v = JSImmediate::from(i);
159
*this = v ? v : jsNumberCell(exec, static_cast<double>(i));
162
inline JSValue::JSValue(JSGlobalData* globalData, double d)
164
JSValue v = JSImmediate::from(d);
165
*this = v ? v : jsNumberCell(globalData, d);
168
inline JSValue::JSValue(JSGlobalData* globalData, int i)
170
JSValue v = JSImmediate::from(i);
171
*this = v ? v : jsNumberCell(globalData, i);
174
inline JSValue::JSValue(JSGlobalData* globalData, unsigned i)
176
JSValue v = JSImmediate::from(i);
177
*this = v ? v : jsNumberCell(globalData, i);
180
inline bool JSValue::isDouble() const
182
return isNumberCell(asValue());
185
inline double JSValue::asDouble() const
187
return asNumberCell(asValue())->value();
190
inline bool JSValue::isNumber() const
192
return JSImmediate::isNumber(asValue()) || isDouble();
195
inline double JSValue::uncheckedGetNumber() const
198
return JSImmediate::isImmediate(asValue()) ? JSImmediate::toDouble(asValue()) : asDouble();
201
#endif // USE(JSVALUE32)
204
inline JSValue::JSValue(ExecState*, double d)
206
JSValue v = JSImmediate::from(d);
211
inline JSValue::JSValue(ExecState*, int i)
213
JSValue v = JSImmediate::from(i);
218
inline JSValue::JSValue(ExecState*, unsigned i)
220
JSValue v = JSImmediate::from(i);
225
inline JSValue::JSValue(ExecState*, long i)
227
JSValue v = JSImmediate::from(i);
232
inline JSValue::JSValue(ExecState*, unsigned long i)
234
JSValue v = JSImmediate::from(i);
239
inline JSValue::JSValue(ExecState*, long long i)
241
JSValue v = JSImmediate::from(static_cast<double>(i));
246
inline JSValue::JSValue(ExecState*, unsigned long long i)
248
JSValue v = JSImmediate::from(static_cast<double>(i));
253
inline JSValue::JSValue(JSGlobalData*, double d)
255
JSValue v = JSImmediate::from(d);
260
inline JSValue::JSValue(JSGlobalData*, int i)
262
JSValue v = JSImmediate::from(i);
267
inline JSValue::JSValue(JSGlobalData*, unsigned i)
269
JSValue v = JSImmediate::from(i);
274
inline bool JSValue::isDouble() const
276
return JSImmediate::isDouble(asValue());
279
inline double JSValue::asDouble() const
281
return JSImmediate::doubleValue(asValue());
284
inline bool JSValue::isNumber() const
286
return JSImmediate::isNumber(asValue());
289
inline double JSValue::uncheckedGetNumber() const
292
return JSImmediate::toDouble(asValue());
295
#endif // USE(JSVALUE64)
297
#if USE(JSVALUE32) || USE(JSVALUE64)
299
inline JSValue::JSValue(ExecState*, char i)
301
ASSERT(JSImmediate::from(i));
302
*this = JSImmediate::from(i);
305
inline JSValue::JSValue(ExecState*, unsigned char i)
307
ASSERT(JSImmediate::from(i));
308
*this = JSImmediate::from(i);
311
inline JSValue::JSValue(ExecState*, short i)
313
ASSERT(JSImmediate::from(i));
314
*this = JSImmediate::from(i);
317
inline JSValue::JSValue(ExecState*, unsigned short i)
319
ASSERT(JSImmediate::from(i));
320
*this = JSImmediate::from(i);
323
inline JSValue jsNaN(ExecState* exec)
325
return jsNumber(exec, NaN);
328
inline JSValue jsNaN(JSGlobalData* globalData)
330
return jsNumber(globalData, NaN);
231
333
// --- JSValue inlines ----------------------------
233
inline double JSValue::uncheckedGetNumber() const
235
ASSERT(JSImmediate::isImmediate(asValue()) || asCell()->isNumber());
236
return JSImmediate::isImmediate(asValue()) ? JSImmediate::toDouble(asValue()) : asNumberCell(asValue())->value();
239
inline int32_t JSNumberCell::toInt32() const
241
if (m_value >= -2147483648.0 && m_value < 2147483648.0)
242
return static_cast<int32_t>(m_value);
244
return JSC::toInt32SlowCase(m_value, scratch);
247
inline uint32_t JSNumberCell::toUInt32() const
249
if (m_value >= 0.0 && m_value < 4294967296.0)
250
return static_cast<uint32_t>(m_value);
252
return JSC::toUInt32SlowCase(m_value, scratch);
255
ALWAYS_INLINE JSValuePtr JSValue::toJSNumber(ExecState* exec) const
257
return JSImmediate::isNumber(asValue()) ? asValue() : jsNumber(exec, this->toNumber(exec));
335
ALWAYS_INLINE JSValue JSValue::toJSNumber(ExecState* exec) const
337
return isNumber() ? asValue() : jsNumber(exec, this->toNumber(exec));
340
inline bool JSValue::getNumber(double &result) const
344
else if (LIKELY(isDouble()))
353
#endif // USE(JSVALUE32) || USE(JSVALUE64)
260
355
} // namespace JSC