• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (C) 2003-2006, 2008 Apple Inc. All rights reserved.
3  *
4  *  This library is free software; you can redistribute it and/or
5  *  modify it under the terms of the GNU Library General Public
6  *  License as published by the Free Software Foundation; either
7  *  version 2 of the License, or (at your option) any later version.
8  *
9  *  This library is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Library General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Library General Public License
15  *  along with this library; see the file COPYING.LIB.  If not, write to
16  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  *  Boston, MA 02110-1301, USA.
18  *
19  */
20 
21 #include "config.h"
22 #include "JSImmediate.h"
23 
24 #include "BooleanConstructor.h"
25 #include "BooleanPrototype.h"
26 #include "Error.h"
27 #include "ExceptionHelpers.h"
28 #include "JSGlobalObject.h"
29 #include "JSNotAnObject.h"
30 #include "NumberConstructor.h"
31 #include "NumberPrototype.h"
32 
33 namespace JSC {
34 
toThisObject(JSValuePtr v,ExecState * exec)35 JSObject* JSImmediate::toThisObject(JSValuePtr v, ExecState* exec)
36 {
37     ASSERT(isImmediate(v));
38     if (isNumber(v))
39         return constructNumber(exec, v);
40     if (isBoolean(v))
41         return constructBooleanFromImmediateBoolean(exec, v);
42     if (v.isNull())
43         return exec->globalThisValue();
44 
45     JSNotAnObjectErrorStub* exception = createNotAnObjectErrorStub(exec, v.isNull());
46     exec->setException(exception);
47     return new (exec) JSNotAnObject(exec, exception);
48 }
49 
toObject(JSValuePtr v,ExecState * exec)50 JSObject* JSImmediate::toObject(JSValuePtr v, ExecState* exec)
51 {
52     ASSERT(isImmediate(v));
53     if (isNumber(v))
54         return constructNumber(exec, v);
55     if (isBoolean(v))
56         return constructBooleanFromImmediateBoolean(exec, v);
57 
58     JSNotAnObjectErrorStub* exception = createNotAnObjectErrorStub(exec, v.isNull());
59     exec->setException(exception);
60     return new (exec) JSNotAnObject(exec, exception);
61 }
62 
prototype(JSValuePtr v,ExecState * exec)63 JSObject* JSImmediate::prototype(JSValuePtr v, ExecState* exec)
64 {
65     ASSERT(isImmediate(v));
66     if (isNumber(v))
67         return exec->lexicalGlobalObject()->numberPrototype();
68     if (isBoolean(v))
69         return exec->lexicalGlobalObject()->booleanPrototype();
70 
71     JSNotAnObjectErrorStub* exception = createNotAnObjectErrorStub(exec, v.isNull());
72     exec->setException(exception);
73     return new (exec) JSNotAnObject(exec, exception);
74 }
75 
toString(JSValuePtr v)76 UString JSImmediate::toString(JSValuePtr v)
77 {
78     ASSERT(isImmediate(v));
79     if (isIntegerNumber(v))
80         return UString::from(getTruncatedInt32(v));
81 #if USE(ALTERNATE_JSIMMEDIATE)
82     if (isNumber(v)) {
83         ASSERT(isDoubleNumber(v));
84         double value = doubleValue(v);
85         if (value == 0.0) // +0.0 or -0.0
86             return "0";
87         return UString::from(value);
88     }
89 #else
90         ASSERT(!isNumber(v));
91 #endif
92     if (jsBoolean(false) == v)
93         return "false";
94     if (jsBoolean(true) == v)
95         return "true";
96     if (v.isNull())
97         return "null";
98     ASSERT(v.isUndefined());
99     return "undefined";
100 }
101 
nonInlineNaN()102 NEVER_INLINE double JSImmediate::nonInlineNaN()
103 {
104     return std::numeric_limits<double>::quiet_NaN();
105 }
106 
107 } // namespace JSC
108