Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(387)

Side by Side Diff: src/ast/ast-value-factory.h

Issue 2248693005: [Parser] Track ContainsDot for SMI values. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/ast/ast-value-factory.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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_
OLDNEW
« no previous file with comments | « no previous file | src/ast/ast-value-factory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698