1 // Copyright 2017 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/objects/literal-objects.h" 6 7 #include "src/factory.h" 8 #include "src/isolate.h" 9 #include "src/objects-inl.h" 10 11 namespace v8 { 12 namespace internal { 13 14 Object* BoilerplateDescription::name(int index) const { 15 // get() already checks for out of bounds access, but we do not want to allow 16 // access to the last element, if it is the number of properties. 17 DCHECK_NE(size(), index); 18 return get(2 * index); 19 } 20 21 Object* BoilerplateDescription::value(int index) const { 22 return get(2 * index + 1); 23 } 24 25 int BoilerplateDescription::size() const { 26 DCHECK_EQ(0, (length() - (this->has_number_of_properties() ? 1 : 0)) % 2); 27 // Rounding is intended. 28 return length() / 2; 29 } 30 31 int BoilerplateDescription::backing_store_size() const { 32 if (has_number_of_properties()) { 33 // If present, the last entry contains the number of properties. 34 return Smi::cast(this->get(length() - 1))->value(); 35 } 36 // If the number is not given explicitly, we assume there are no 37 // properties with computed names. 38 return size(); 39 } 40 41 void BoilerplateDescription::set_backing_store_size(Isolate* isolate, 42 int backing_store_size) { 43 DCHECK(has_number_of_properties()); 44 DCHECK_NE(size(), backing_store_size); 45 Handle<Object> backing_store_size_obj = 46 isolate->factory()->NewNumberFromInt(backing_store_size); 47 set(length() - 1, *backing_store_size_obj); 48 } 49 50 bool BoilerplateDescription::has_number_of_properties() const { 51 return length() % 2 != 0; 52 } 53 54 } // namespace internal 55 } // namespace v8 56