2 * Copyright (C) 2011 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #include <wtf/Assertions.h>
35 // This enum tracks the current representation in which a value is being held.
36 // Values may be unboxed primitives (int32, double, or cell), or boxed as a JSValue.
37 // For boxed values, we may know the type of boxing that has taken place.
38 // (May also need bool, array, object, string types!)
41 DataFormatInteger
= 1,
43 DataFormatBoolean
= 3,
45 DataFormatStorage
= 5,
47 DataFormatJSInteger
= DataFormatJS
| DataFormatInteger
,
48 DataFormatJSDouble
= DataFormatJS
| DataFormatDouble
,
49 DataFormatJSCell
= DataFormatJS
| DataFormatCell
,
50 DataFormatJSBoolean
= DataFormatJS
| DataFormatBoolean
,
52 // Marker deliminating ordinary data formats and OSR-only data formats.
53 DataFormatOSRMarker
= 32,
55 // Special data formats used only for OSR.
56 DataFormatDead
= 33, // Implies jsUndefined().
57 DataFormatArguments
= 34 // Implies that the arguments object must be reified.
60 inline const char* dataFormatToString(DataFormat dataFormat
)
65 case DataFormatInteger
:
67 case DataFormatDouble
:
71 case DataFormatBoolean
:
73 case DataFormatStorage
:
77 case DataFormatJSInteger
:
79 case DataFormatJSDouble
:
81 case DataFormatJSCell
:
83 case DataFormatJSBoolean
:
87 case DataFormatArguments
:
90 RELEASE_ASSERT_NOT_REACHED();
96 inline bool needDataFormatConversion(DataFormat from
, DataFormat to
)
98 ASSERT(from
!= DataFormatNone
);
99 ASSERT(to
!= DataFormatNone
);
101 case DataFormatInteger
:
102 case DataFormatDouble
:
106 case DataFormatJSInteger
:
107 case DataFormatJSDouble
:
108 case DataFormatJSCell
:
109 case DataFormatJSBoolean
:
111 case DataFormatInteger
:
112 case DataFormatDouble
:
116 case DataFormatJSInteger
:
117 case DataFormatJSDouble
:
118 case DataFormatJSCell
:
119 case DataFormatJSBoolean
:
122 // This captures DataFormatBoolean, which is currently unused.
123 RELEASE_ASSERT_NOT_REACHED();
125 case DataFormatStorage
:
126 ASSERT(to
== DataFormatStorage
);
129 // This captures DataFormatBoolean, which is currently unused.
130 RELEASE_ASSERT_NOT_REACHED();
135 #elif USE(JSVALUE32_64)
136 inline bool needDataFormatConversion(DataFormat from
, DataFormat to
)
138 ASSERT(from
!= DataFormatNone
);
139 ASSERT(to
!= DataFormatNone
);
141 case DataFormatInteger
:
143 case DataFormatBoolean
:
144 return ((to
& DataFormatJS
) || to
== DataFormatDouble
);
145 case DataFormatDouble
:
146 case DataFormatJSDouble
:
147 return (to
!= DataFormatDouble
&& to
!= DataFormatJSDouble
);
149 case DataFormatJSInteger
:
150 case DataFormatJSCell
:
151 case DataFormatJSBoolean
:
152 return (!(to
& DataFormatJS
) || to
== DataFormatJSDouble
);
153 case DataFormatStorage
:
154 ASSERT(to
== DataFormatStorage
);
157 RELEASE_ASSERT_NOT_REACHED();
163 inline bool isJSFormat(DataFormat format
, DataFormat expectedFormat
)
165 ASSERT(expectedFormat
& DataFormatJS
);
166 return (format
| DataFormatJS
) == expectedFormat
;
169 inline bool isJSInteger(DataFormat format
)
171 return isJSFormat(format
, DataFormatJSInteger
);
174 inline bool isJSDouble(DataFormat format
)
176 return isJSFormat(format
, DataFormatJSDouble
);
179 inline bool isJSCell(DataFormat format
)
181 return isJSFormat(format
, DataFormatJSCell
);
184 inline bool isJSBoolean(DataFormat format
)
186 return isJSFormat(format
, DataFormatJSBoolean
);
191 #endif // DataFormat_h