Index: src/objects/literal-objects.cc |
diff --git a/src/objects/literal-objects.cc b/src/objects/literal-objects.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..551b03621e72d90aa0a602b176153a5303f6fc26 |
--- /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 |