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 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 F(undefined_value) \ | 320 F(undefined_value) \ |
321 F(the_hole_value) | 321 F(the_hole_value) |
322 | 322 |
323 class AstValueFactory { | 323 class AstValueFactory { |
324 public: | 324 public: |
325 AstValueFactory(Zone* zone, uint32_t hash_seed) | 325 AstValueFactory(Zone* zone, uint32_t hash_seed) |
326 : string_table_(AstRawStringCompare), | 326 : string_table_(AstRawStringCompare), |
327 values_(nullptr), | 327 values_(nullptr), |
328 strings_end_(&strings_), | 328 strings_end_(&strings_), |
329 zone_(zone), | 329 zone_(zone), |
330 isolate_(NULL), | |
331 hash_seed_(hash_seed) { | 330 hash_seed_(hash_seed) { |
332 ResetStrings(); | 331 ResetStrings(); |
333 #define F(name, str) name##_string_ = NULL; | 332 #define F(name, str) name##_string_ = NULL; |
334 STRING_CONSTANTS(F) | 333 STRING_CONSTANTS(F) |
335 #undef F | 334 #undef F |
336 #define F(name) name##_ = NULL; | 335 #define F(name) name##_ = NULL; |
337 OTHER_CONSTANTS(F) | 336 OTHER_CONSTANTS(F) |
338 #undef F | 337 #undef F |
339 } | 338 } |
340 | 339 |
341 Zone* zone() const { return zone_; } | 340 Zone* zone() const { return zone_; } |
342 | 341 |
343 const AstRawString* GetOneByteString(Vector<const uint8_t> literal) { | 342 const AstRawString* GetOneByteString(Vector<const uint8_t> literal) { |
344 return GetOneByteStringInternal(literal); | 343 return GetOneByteStringInternal(literal); |
345 } | 344 } |
346 const AstRawString* GetOneByteString(const char* string) { | 345 const AstRawString* GetOneByteString(const char* string) { |
347 return GetOneByteString(Vector<const uint8_t>( | 346 return GetOneByteString(Vector<const uint8_t>( |
348 reinterpret_cast<const uint8_t*>(string), StrLength(string))); | 347 reinterpret_cast<const uint8_t*>(string), StrLength(string))); |
349 } | 348 } |
350 const AstRawString* GetTwoByteString(Vector<const uint16_t> literal) { | 349 const AstRawString* GetTwoByteString(Vector<const uint16_t> literal) { |
351 return GetTwoByteStringInternal(literal); | 350 return GetTwoByteStringInternal(literal); |
352 } | 351 } |
353 const AstRawString* GetString(Handle<String> literal); | 352 const AstRawString* GetString(Handle<String> literal); |
354 const AstConsString* NewConsString(const AstString* left, | 353 const AstConsString* NewConsString(const AstString* left, |
355 const AstString* right); | 354 const AstString* right); |
356 | 355 |
357 void Internalize(Isolate* isolate); | 356 void Internalize(Isolate* isolate); |
358 bool IsInternalized() { | |
359 return isolate_ != NULL; | |
360 } | |
361 | 357 |
362 #define F(name, str) \ | 358 #define F(name, str) \ |
363 const AstRawString* name##_string() { \ | 359 const AstRawString* name##_string() { \ |
364 if (name##_string_ == NULL) { \ | 360 if (name##_string_ == NULL) { \ |
365 const char* data = str; \ | 361 const char* data = str; \ |
366 name##_string_ = GetOneByteString( \ | 362 name##_string_ = GetOneByteString( \ |
367 Vector<const uint8_t>(reinterpret_cast<const uint8_t*>(data), \ | 363 Vector<const uint8_t>(reinterpret_cast<const uint8_t*>(data), \ |
368 static_cast<int>(strlen(data)))); \ | 364 static_cast<int>(strlen(data)))); \ |
369 } \ | 365 } \ |
370 return name##_string_; \ | 366 return name##_string_; \ |
371 } | 367 } |
372 STRING_CONSTANTS(F) | 368 STRING_CONSTANTS(F) |
373 #undef F | 369 #undef F |
374 | 370 |
375 const AstValue* NewString(const AstRawString* string); | 371 const AstValue* NewString(const AstRawString* string); |
376 // A JavaScript symbol (ECMA-262 edition 6). | 372 // A JavaScript symbol (ECMA-262 edition 6). |
377 const AstValue* NewSymbol(const char* name); | 373 const AstValue* NewSymbol(const char* name); |
378 const AstValue* NewNumber(double number, bool with_dot = false); | 374 const AstValue* NewNumber(double number, bool with_dot = false); |
379 const AstValue* NewSmi(int number); | 375 const AstValue* NewSmi(int number); |
380 const AstValue* NewBoolean(bool b); | 376 const AstValue* NewBoolean(bool b); |
381 const AstValue* NewStringList(ZoneList<const AstRawString*>* strings); | 377 const AstValue* NewStringList(ZoneList<const AstRawString*>* strings); |
382 const AstValue* NewNull(); | 378 const AstValue* NewNull(); |
383 const AstValue* NewUndefined(); | 379 const AstValue* NewUndefined(); |
384 const AstValue* NewTheHole(); | 380 const AstValue* NewTheHole(); |
385 | 381 |
386 private: | 382 private: |
387 AstValue* AddValue(AstValue* value) { | 383 AstValue* AddValue(AstValue* value) { |
388 if (isolate_) { | 384 value->set_next(values_); |
389 value->Internalize(isolate_); | 385 values_ = value; |
390 } else { | |
391 value->set_next(values_); | |
392 values_ = value; | |
393 } | |
394 return value; | 386 return value; |
395 } | 387 } |
396 AstString* AddString(AstString* string) { | 388 AstString* AddString(AstString* string) { |
397 if (isolate_) { | 389 *strings_end_ = string; |
398 string->Internalize(isolate_); | 390 strings_end_ = string->next_location(); |
399 } else { | |
400 *strings_end_ = string; | |
401 strings_end_ = string->next_location(); | |
402 } | |
403 return string; | 391 return string; |
404 } | 392 } |
405 void ResetStrings() { | 393 void ResetStrings() { |
406 strings_ = nullptr; | 394 strings_ = nullptr; |
407 strings_end_ = &strings_; | 395 strings_end_ = &strings_; |
408 } | 396 } |
409 AstRawString* GetOneByteStringInternal(Vector<const uint8_t> literal); | 397 AstRawString* GetOneByteStringInternal(Vector<const uint8_t> literal); |
410 AstRawString* GetTwoByteStringInternal(Vector<const uint16_t> literal); | 398 AstRawString* GetTwoByteStringInternal(Vector<const uint16_t> literal); |
411 AstRawString* GetString(uint32_t hash, bool is_one_byte, | 399 AstRawString* GetString(uint32_t hash, bool is_one_byte, |
412 Vector<const byte> literal_bytes); | 400 Vector<const byte> literal_bytes); |
413 | 401 |
414 static bool AstRawStringCompare(void* a, void* b); | 402 static bool AstRawStringCompare(void* a, void* b); |
415 | 403 |
416 // All strings are copied here, one after another (no NULLs inbetween). | 404 // All strings are copied here, one after another (no NULLs inbetween). |
417 base::HashMap string_table_; | 405 base::HashMap string_table_; |
418 // For keeping track of all AstValues and AstRawStrings we've created (so that | 406 // For keeping track of all AstValues and AstRawStrings we've created (so that |
419 // they can be internalized later). | 407 // they can be internalized later). |
420 AstValue* values_; | 408 AstValue* values_; |
421 // We need to keep track of strings_ in order, since cons strings require | 409 // We need to keep track of strings_ in order, since cons strings require |
422 // their members to be internalized first. | 410 // their members to be internalized first. |
423 AstString* strings_; | 411 AstString* strings_; |
424 AstString** strings_end_; | 412 AstString** strings_end_; |
425 Zone* zone_; | 413 Zone* zone_; |
426 Isolate* isolate_; | |
427 | 414 |
428 uint32_t hash_seed_; | 415 uint32_t hash_seed_; |
429 | 416 |
430 #define F(name, str) const AstRawString* name##_string_; | 417 #define F(name, str) const AstRawString* name##_string_; |
431 STRING_CONSTANTS(F) | 418 STRING_CONSTANTS(F) |
432 #undef F | 419 #undef F |
433 | 420 |
434 #define F(name) AstValue* name##_; | 421 #define F(name) AstValue* name##_; |
435 OTHER_CONSTANTS(F) | 422 OTHER_CONSTANTS(F) |
436 #undef F | 423 #undef F |
437 }; | 424 }; |
438 } // namespace internal | 425 } // namespace internal |
439 } // namespace v8 | 426 } // namespace v8 |
440 | 427 |
441 #undef STRING_CONSTANTS | 428 #undef STRING_CONSTANTS |
442 #undef OTHER_CONSTANTS | 429 #undef OTHER_CONSTANTS |
443 | 430 |
444 #endif // V8_AST_AST_VALUE_FACTORY_H_ | 431 #endif // V8_AST_AST_VALUE_FACTORY_H_ |
OLD | NEW |