// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/objects/literal-objects.h" #include "src/factory.h" #include "src/isolate.h" #include "src/objects-inl.h" namespace v8 { namespace internal { Object* BoilerplateDescription::name(int index) const { // get() already checks for out of bounds access, but we do not want to allow // access to the last element, if it is the number of properties. DCHECK_NE(size(), index); return get(2 * index); } Object* BoilerplateDescription::value(int index) const { return get(2 * index + 1); } int BoilerplateDescription::size() const { DCHECK_EQ(0, (length() - (this->has_number_of_properties() ? 1 : 0)) % 2); // Rounding is intended. return length() / 2; } int BoilerplateDescription::backing_store_size() const { if (has_number_of_properties()) { // If present, the last entry contains the number of properties. return Smi::cast(this->get(length() - 1))->value(); } // If the number is not given explicitly, we assume there are no // properties with computed names. return size(); } void BoilerplateDescription::set_backing_store_size(Isolate* isolate, int backing_store_size) { DCHECK(has_number_of_properties()); DCHECK_NE(size(), backing_store_size); Handle backing_store_size_obj = isolate->factory()->NewNumberFromInt(backing_store_size); set(length() - 1, *backing_store_size_obj); } bool BoilerplateDescription::has_number_of_properties() const { return length() % 2 != 0; } } // namespace internal } // namespace v8