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
11namespace v8 {
12namespace internal {
13
14Object* 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
21Object* BoilerplateDescription::value(int index) const {
22  return get(2 * index + 1);
23}
24
25int 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
31int 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
41void 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
50bool BoilerplateDescription::has_number_of_properties() const {
51  return length() % 2 != 0;
52}
53
54}  // namespace internal
55}  // namespace v8
56