| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/ast/ast.h" | 5 #include "src/ast/ast.h" |
| 6 | 6 |
| 7 #include <cmath> // For isfinite. | 7 #include <cmath> // For isfinite. |
| 8 | 8 |
| 9 #include "src/ast/prettyprinter.h" | 9 #include "src/ast/prettyprinter.h" |
| 10 #include "src/ast/scopes.h" | 10 #include "src/ast/scopes.h" |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 may_store_doubles_ = true; | 458 may_store_doubles_ = true; |
| 459 } | 459 } |
| 460 | 460 |
| 461 is_simple = is_simple && !value->IsUninitialized(); | 461 is_simple = is_simple && !value->IsUninitialized(); |
| 462 | 462 |
| 463 // Keep track of the number of elements in the object literal and | 463 // Keep track of the number of elements in the object literal and |
| 464 // the largest element index. If the largest element index is | 464 // the largest element index. If the largest element index is |
| 465 // much larger than the number of elements, creating an object | 465 // much larger than the number of elements, creating an object |
| 466 // literal with fast elements will be a waste of space. | 466 // literal with fast elements will be a waste of space. |
| 467 uint32_t element_index = 0; | 467 uint32_t element_index = 0; |
| 468 if (key->IsString() | 468 if (key->IsString() && String::cast(*key)->AsArrayIndex(&element_index)) { |
| 469 && Handle<String>::cast(key)->AsArrayIndex(&element_index) | 469 max_element_index = Max(element_index, max_element_index); |
| 470 && element_index > max_element_index) { | |
| 471 max_element_index = element_index; | |
| 472 elements++; | 470 elements++; |
| 473 } else if (key->IsSmi()) { | 471 key = isolate->factory()->NewNumberFromUint(element_index); |
| 474 int key_value = Smi::cast(*key)->value(); | 472 } else if (key->ToArrayIndex(&element_index)) { |
| 475 if (key_value > 0 | 473 max_element_index = Max(element_index, max_element_index); |
| 476 && static_cast<uint32_t>(key_value) > max_element_index) { | |
| 477 max_element_index = key_value; | |
| 478 } | |
| 479 elements++; | 474 elements++; |
| 475 } else if (key->IsNumber()) { |
| 476 key = isolate->factory()->NumberToString(key); |
| 480 } | 477 } |
| 481 | 478 |
| 482 // Add name, value pair to the fixed array. | 479 // Add name, value pair to the fixed array. |
| 483 constant_properties->set(position++, *key); | 480 constant_properties->set(position++, *key); |
| 484 constant_properties->set(position++, *value); | 481 constant_properties->set(position++, *value); |
| 485 } | 482 } |
| 486 | 483 |
| 487 constant_properties_ = constant_properties; | 484 constant_properties_ = constant_properties; |
| 488 fast_elements_ = | 485 fast_elements_ = |
| 489 (max_element_index <= 32) || ((2 * elements) >= max_element_index); | 486 (max_element_index <= 32) || ((2 * elements) >= max_element_index); |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 834 bool Literal::Match(void* literal1, void* literal2) { | 831 bool Literal::Match(void* literal1, void* literal2) { |
| 835 const AstValue* x = static_cast<Literal*>(literal1)->raw_value(); | 832 const AstValue* x = static_cast<Literal*>(literal1)->raw_value(); |
| 836 const AstValue* y = static_cast<Literal*>(literal2)->raw_value(); | 833 const AstValue* y = static_cast<Literal*>(literal2)->raw_value(); |
| 837 return (x->IsString() && y->IsString() && x->AsString() == y->AsString()) || | 834 return (x->IsString() && y->IsString() && x->AsString() == y->AsString()) || |
| 838 (x->IsNumber() && y->IsNumber() && x->AsNumber() == y->AsNumber()); | 835 (x->IsNumber() && y->IsNumber() && x->AsNumber() == y->AsNumber()); |
| 839 } | 836 } |
| 840 | 837 |
| 841 | 838 |
| 842 } // namespace internal | 839 } // namespace internal |
| 843 } // namespace v8 | 840 } // namespace v8 |
| OLD | NEW |