OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 | 147 |
148 // AstValue is either a string, a number, a string array, a boolean, or a | 148 // AstValue is either a string, a number, a string array, a boolean, or a |
149 // special value (null, undefined, the hole). | 149 // special value (null, undefined, the hole). |
150 class AstValue : public ZoneObject { | 150 class AstValue : public ZoneObject { |
151 public: | 151 public: |
152 bool IsString() const { | 152 bool IsString() const { |
153 return type_ == STRING; | 153 return type_ == STRING; |
154 } | 154 } |
155 | 155 |
156 bool IsNumber() const { | 156 bool IsNumber() const { |
157 return type_ == NUMBER || type_ == NUMBER_WITH_DOT || type_ == SMI; | 157 return type_ == NUMBER || type_ == NUMBER_WITH_DOT || type_ == SMI || |
| 158 type_ == SMI_WITH_DOT; |
158 } | 159 } |
159 | 160 |
160 bool ContainsDot() const { return type_ == NUMBER_WITH_DOT; } | 161 bool ContainsDot() const { |
| 162 return type_ == NUMBER_WITH_DOT || type_ == SMI_WITH_DOT; |
| 163 } |
161 | 164 |
162 const AstRawString* AsString() const { | 165 const AstRawString* AsString() const { |
163 CHECK_EQ(STRING, type_); | 166 CHECK_EQ(STRING, type_); |
164 return string_; | 167 return string_; |
165 } | 168 } |
166 | 169 |
167 double AsNumber() const { | 170 double AsNumber() const { |
168 if (type_ == NUMBER || type_ == NUMBER_WITH_DOT) | 171 if (type_ == NUMBER || type_ == NUMBER_WITH_DOT) |
169 return number_; | 172 return number_; |
170 if (type_ == SMI) | 173 if (type_ == SMI || type_ == SMI_WITH_DOT) |
171 return smi_; | 174 return smi_; |
172 UNREACHABLE(); | 175 UNREACHABLE(); |
173 return 0; | 176 return 0; |
174 } | 177 } |
175 | 178 |
176 Smi* AsSmi() const { | 179 Smi* AsSmi() const { |
177 CHECK_EQ(SMI, type_); | 180 CHECK(type_ == SMI || type_ == SMI_WITH_DOT); |
178 return Smi::FromInt(smi_); | 181 return Smi::FromInt(smi_); |
179 } | 182 } |
180 | 183 |
181 bool EqualsString(const AstRawString* string) const { | 184 bool EqualsString(const AstRawString* string) const { |
182 return type_ == STRING && string_ == string; | 185 return type_ == STRING && string_ == string; |
183 } | 186 } |
184 | 187 |
185 bool IsPropertyName() const; | 188 bool IsPropertyName() const; |
186 | 189 |
187 bool BooleanValue() const; | 190 bool BooleanValue() const; |
188 | 191 |
189 bool IsSmi() const { return type_ == SMI; } | 192 bool IsSmi() const { return type_ == SMI || type_ == SMI_WITH_DOT; } |
190 bool IsFalse() const { return type_ == BOOLEAN && !bool_; } | 193 bool IsFalse() const { return type_ == BOOLEAN && !bool_; } |
191 bool IsTrue() const { return type_ == BOOLEAN && bool_; } | 194 bool IsTrue() const { return type_ == BOOLEAN && bool_; } |
192 bool IsUndefined() const { return type_ == UNDEFINED; } | 195 bool IsUndefined() const { return type_ == UNDEFINED; } |
193 bool IsTheHole() const { return type_ == THE_HOLE; } | 196 bool IsTheHole() const { return type_ == THE_HOLE; } |
194 bool IsNull() const { return type_ == NULL_TYPE; } | 197 bool IsNull() const { return type_ == NULL_TYPE; } |
195 | 198 |
196 void Internalize(Isolate* isolate); | 199 void Internalize(Isolate* isolate); |
197 | 200 |
198 // Can be called after Internalize has been called. | 201 // Can be called after Internalize has been called. |
199 V8_INLINE Handle<Object> value() const { | 202 V8_INLINE Handle<Object> value() const { |
200 if (type_ == STRING) { | 203 if (type_ == STRING) { |
201 return string_->string(); | 204 return string_->string(); |
202 } | 205 } |
203 DCHECK(!value_.is_null()); | 206 DCHECK(!value_.is_null()); |
204 return value_; | 207 return value_; |
205 } | 208 } |
206 AstValue* next() const { return next_; } | 209 AstValue* next() const { return next_; } |
207 void set_next(AstValue* next) { next_ = next; } | 210 void set_next(AstValue* next) { next_ = next; } |
208 | 211 |
209 private: | 212 private: |
210 friend class AstValueFactory; | 213 friend class AstValueFactory; |
211 | 214 |
212 enum Type { | 215 enum Type { |
213 STRING, | 216 STRING, |
214 SYMBOL, | 217 SYMBOL, |
215 NUMBER, | 218 NUMBER, |
216 NUMBER_WITH_DOT, | 219 NUMBER_WITH_DOT, |
217 SMI, | 220 SMI, |
| 221 SMI_WITH_DOT, |
218 BOOLEAN, | 222 BOOLEAN, |
219 NULL_TYPE, | 223 NULL_TYPE, |
220 UNDEFINED, | 224 UNDEFINED, |
221 THE_HOLE | 225 THE_HOLE |
222 }; | 226 }; |
223 | 227 |
224 explicit AstValue(const AstRawString* s) : type_(STRING), next_(nullptr) { | 228 explicit AstValue(const AstRawString* s) : type_(STRING), next_(nullptr) { |
225 string_ = s; | 229 string_ = s; |
226 } | 230 } |
227 | 231 |
228 explicit AstValue(const char* name) : type_(SYMBOL), next_(nullptr) { | 232 explicit AstValue(const char* name) : type_(SYMBOL), next_(nullptr) { |
229 symbol_name_ = name; | 233 symbol_name_ = name; |
230 } | 234 } |
231 | 235 |
232 explicit AstValue(double n, bool with_dot) : next_(nullptr) { | 236 explicit AstValue(double n, bool with_dot) : next_(nullptr) { |
233 if (with_dot) { | 237 int int_value; |
234 type_ = NUMBER_WITH_DOT; | 238 if (DoubleToSmiInteger(n, &int_value)) { |
| 239 type_ = with_dot ? SMI_WITH_DOT : SMI; |
| 240 smi_ = int_value; |
| 241 } else { |
| 242 type_ = with_dot ? NUMBER_WITH_DOT : NUMBER; |
235 number_ = n; | 243 number_ = n; |
236 } else { | |
237 int int_value; | |
238 if (DoubleToSmiInteger(n, &int_value)) { | |
239 type_ = SMI; | |
240 smi_ = int_value; | |
241 } else { | |
242 type_ = NUMBER; | |
243 number_ = n; | |
244 } | |
245 } | 244 } |
246 } | 245 } |
247 | 246 |
248 AstValue(Type t, int i) : type_(t), next_(nullptr) { | 247 AstValue(Type t, int i) : type_(t), next_(nullptr) { |
249 DCHECK(type_ == SMI); | 248 DCHECK(type_ == SMI); |
250 smi_ = i; | 249 smi_ = i; |
251 } | 250 } |
252 | 251 |
253 explicit AstValue(bool b) : type_(BOOLEAN), next_(nullptr) { bool_ = b; } | 252 explicit AstValue(bool b) : type_(BOOLEAN), next_(nullptr) { bool_ = b; } |
254 | 253 |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 OTHER_CONSTANTS(F) | 433 OTHER_CONSTANTS(F) |
435 #undef F | 434 #undef F |
436 }; | 435 }; |
437 } // namespace internal | 436 } // namespace internal |
438 } // namespace v8 | 437 } // namespace v8 |
439 | 438 |
440 #undef STRING_CONSTANTS | 439 #undef STRING_CONSTANTS |
441 #undef OTHER_CONSTANTS | 440 #undef OTHER_CONSTANTS |
442 | 441 |
443 #endif // V8_AST_AST_VALUE_FACTORY_H_ | 442 #endif // V8_AST_AST_VALUE_FACTORY_H_ |
OLD | NEW |