]>
git.saurik.com Git - apple/javascriptcore.git/blob - runtime/JSValue.cpp
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 "BooleanConstructor.h"
27 #include "BooleanPrototype.h"
28 #include "ExceptionHelpers.h"
29 #include "JSGlobalObject.h"
30 #include "JSFunction.h"
31 #include "JSNotAnObject.h"
32 #include "NumberObject.h"
33 #include <wtf/MathExtras.h>
34 #include <wtf/StringExtras.h>
38 static const double D32
= 4294967296.0;
41 double JSValue::toInteger(ExecState
* exec
) const
45 double d
= toNumber(exec
);
46 return isnan(d
) ? 0.0 : trunc(d
);
49 double JSValue::toIntegerPreserveNaN(ExecState
* exec
) const
53 return trunc(toNumber(exec
));
56 JSObject
* JSValue::toObjectSlowCase(ExecState
* exec
) const
60 if (isInt32() || isDouble())
61 return constructNumber(exec
, asValue());
62 if (isTrue() || isFalse())
63 return constructBooleanFromImmediateBoolean(exec
, asValue());
64 ASSERT(isUndefinedOrNull());
65 JSNotAnObjectErrorStub
* exception
= createNotAnObjectErrorStub(exec
, isNull());
66 exec
->setException(exception
);
67 return new (exec
) JSNotAnObject(exec
, exception
);
70 JSObject
* JSValue::toThisObjectSlowCase(ExecState
* exec
) const
74 if (isInt32() || isDouble())
75 return constructNumber(exec
, asValue());
76 if (isTrue() || isFalse())
77 return constructBooleanFromImmediateBoolean(exec
, asValue());
78 ASSERT(isUndefinedOrNull());
79 return exec
->globalThisValue();
82 JSObject
* JSValue::synthesizeObject(ExecState
* exec
) const
86 return constructNumber(exec
, asValue());
88 return constructBooleanFromImmediateBoolean(exec
, asValue());
90 JSNotAnObjectErrorStub
* exception
= createNotAnObjectErrorStub(exec
, isNull());
91 exec
->setException(exception
);
92 return new (exec
) JSNotAnObject(exec
, exception
);
95 JSObject
* JSValue::synthesizePrototype(ExecState
* exec
) const
99 return exec
->lexicalGlobalObject()->numberPrototype();
101 return exec
->lexicalGlobalObject()->booleanPrototype();
103 JSNotAnObjectErrorStub
* exception
= createNotAnObjectErrorStub(exec
, isNull());
104 exec
->setException(exception
);
105 return new (exec
) JSNotAnObject(exec
, exception
);
109 char* JSValue::description()
111 static const size_t size
= 32;
112 static char description
[size
];
115 snprintf(description
, size
, "<JSValue()>");
117 snprintf(description
, size
, "Int32: %d", asInt32());
119 snprintf(description
, size
, "Double: %lf", asDouble());
121 snprintf(description
, size
, "Cell: %p", asCell());
123 snprintf(description
, size
, "True");
125 snprintf(description
, size
, "False");
127 snprintf(description
, size
, "Null");
129 ASSERT(isUndefined());
130 snprintf(description
, size
, "Undefined");
137 int32_t toInt32SlowCase(double d
, bool& ok
)
141 if (d
>= -D32
/ 2 && d
< D32
/ 2)
142 return static_cast<int32_t>(d
);
144 if (isnan(d
) || isinf(d
)) {
149 double d32
= fmod(trunc(d
), D32
);
152 else if (d32
< -D32
/ 2)
154 return static_cast<int32_t>(d32
);
157 uint32_t toUInt32SlowCase(double d
, bool& ok
)
161 if (d
>= 0.0 && d
< D32
)
162 return static_cast<uint32_t>(d
);
164 if (isnan(d
) || isinf(d
)) {
169 double d32
= fmod(trunc(d
), D32
);
172 return static_cast<uint32_t>(d32
);
175 NEVER_INLINE
double nonInlineNaN()
180 return std::numeric_limits
<double>::quiet_NaN();