diff options
Diffstat (limited to 'src/objects/literal-objects.cc')
-rw-r--r-- | src/objects/literal-objects.cc | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/objects/literal-objects.cc b/src/objects/literal-objects.cc new file mode 100644 index 00000000..551b0362 --- /dev/null +++ b/src/objects/literal-objects.cc @@ -0,0 +1,55 @@ +// 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<Object> 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 |