1958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Copyright 2014 the V8 project authors. All rights reserved.
2958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Use of this source code is governed by a BSD-style license that can be
3958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// found in the LICENSE file.
4958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/runtime/runtime-utils.h"
6958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/arguments.h"
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/conversions-inl.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/factory.h"
10958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace v8 {
12958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace internal {
13958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_StringGetRawHashField) {
16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(String, string, 0);
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return *isolate->factory()->NewNumberFromUint(string->hash_field());
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_TheHole) {
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SealHandleScope shs(isolate);
2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(0, args.length());
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return isolate->heap()->the_hole_value();
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_JSCollectionGetTable) {
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SealHandleScope shs(isolate);
3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_CHECKED(JSObject, object, 0);
3413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(object->IsJSSet() || object->IsJSMap());
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return static_cast<JSCollection*>(object)->table();
36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_GenericHash) {
40958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
4313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Smi* hash = Object::GetOrCreateHash(isolate, object);
4413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return hash;
45958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
47958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_SetInitialize) {
49958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0);
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSSet::Initialize(holder, isolate);
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return *holder;
54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
56958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_SetGrow) {
58958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
60958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0);
61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table()));
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  table = OrderedHashSet::EnsureGrowable(table);
63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  holder->set_table(*table);
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return isolate->heap()->undefined_value();
65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
67958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_SetShrink) {
69958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
7062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
71958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0);
72958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table()));
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  table = OrderedHashSet::Shrink(table);
74958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  holder->set_table(*table);
75958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return isolate->heap()->undefined_value();
76958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
77958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_SetClear) {
80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
8162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0);
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSSet::Clear(holder);
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return isolate->heap()->undefined_value();
85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_SetIteratorInitialize) {
89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
9062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(3, args.length());
91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSSetIterator, holder, 0);
92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSSet, set, 1);
93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_SMI_ARG_CHECKED(kind, 2)
9413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(kind == JSSetIterator::kKindValues ||
9513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        kind == JSSetIterator::kKindEntries);
96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<OrderedHashSet> table(OrderedHashSet::cast(set->table()));
97958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  holder->set_table(*table);
98c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  holder->set_index(Smi::kZero);
99958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  holder->set_kind(Smi::FromInt(kind));
100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return isolate->heap()->undefined_value();
101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_SetIteratorClone) {
105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
10662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSSetIterator, holder, 0);
108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSSetIterator> result = isolate->factory()->NewJSSetIterator();
110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  result->set_table(holder->table());
111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  result->set_index(Smi::FromInt(Smi::cast(holder->index())->value()));
112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  result->set_kind(Smi::FromInt(Smi::cast(holder->kind())->value()));
113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return *result;
115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_SetIteratorNext) {
119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  SealHandleScope shs(isolate);
12062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(2, args.length());
121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_CHECKED(JSSetIterator, holder, 0);
122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_CHECKED(JSArray, value_array, 1);
123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return holder->Next(value_array);
124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// The array returned contains the following information:
128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 0: HasMore flag
129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 1: Iteration index
130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 2: Iteration kind
131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_SetIteratorDetails) {
132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
13362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSSetIterator, holder, 0);
135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<FixedArray> details = isolate->factory()->NewFixedArray(4);
136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  details->set(0, isolate->heap()->ToBoolean(holder->HasMore()));
137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  details->set(1, holder->index());
138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  details->set(2, holder->kind());
139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return *isolate->factory()->NewJSArrayWithElements(details);
140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_MapInitialize) {
144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
14562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0);
147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSMap::Initialize(holder, isolate);
148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return *holder;
149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_MapShrink) {
153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
15462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0);
156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table()));
157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  table = OrderedHashMap::Shrink(table);
158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  holder->set_table(*table);
159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return isolate->heap()->undefined_value();
160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_MapClear) {
164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
16562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0);
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSMap::Clear(holder);
168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return isolate->heap()->undefined_value();
169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_MapGrow) {
173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
17462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0);
176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table()));
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  table = OrderedHashMap::EnsureGrowable(table);
178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  holder->set_table(*table);
179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return isolate->heap()->undefined_value();
180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_MapIteratorInitialize) {
184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
18562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(3, args.length());
186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSMapIterator, holder, 0);
187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSMap, map, 1);
188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_SMI_ARG_CHECKED(kind, 2)
18913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(kind == JSMapIterator::kKindKeys ||
19013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        kind == JSMapIterator::kKindValues ||
19113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        kind == JSMapIterator::kKindEntries);
192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<OrderedHashMap> table(OrderedHashMap::cast(map->table()));
193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  holder->set_table(*table);
194c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  holder->set_index(Smi::kZero);
195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  holder->set_kind(Smi::FromInt(kind));
196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return isolate->heap()->undefined_value();
197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_MapIteratorClone) {
201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
20262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSMapIterator, holder, 0);
204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSMapIterator> result = isolate->factory()->NewJSMapIterator();
206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  result->set_table(holder->table());
207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  result->set_index(Smi::FromInt(Smi::cast(holder->index())->value()));
208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  result->set_kind(Smi::FromInt(Smi::cast(holder->kind())->value()));
209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return *result;
211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// The array returned contains the following information:
215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 0: HasMore flag
216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 1: Iteration index
217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 2: Iteration kind
218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_MapIteratorDetails) {
219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
22062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSMapIterator, holder, 0);
222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<FixedArray> details = isolate->factory()->NewFixedArray(4);
223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  details->set(0, isolate->heap()->ToBoolean(holder->HasMore()));
224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  details->set(1, holder->index());
225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  details->set(2, holder->kind());
226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return *isolate->factory()->NewJSArrayWithElements(details);
227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_GetWeakMapEntries) {
231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
23262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(2, args.length());
233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0);
234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_NUMBER_CHECKED(int, max_entries, Int32, args[1]);
23513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(max_entries >= 0);
23662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return *JSWeakCollection::GetEntries(holder, max_entries);
237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_MapIteratorNext) {
241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  SealHandleScope shs(isolate);
24262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(2, args.length());
243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_CHECKED(JSMapIterator, holder, 0);
244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_CHECKED(JSArray, value_array, 1);
245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return holder->Next(value_array);
246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_WeakCollectionInitialize) {
250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
25162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0);
253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSWeakCollection::Initialize(weak_collection, isolate);
254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return *weak_collection;
255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_WeakCollectionGet) {
259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
26062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(3, args.length());
261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0);
262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_SMI_ARG_CHECKED(hash, 2)
26413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(key->IsJSReceiver() || key->IsSymbol());
265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<ObjectHashTable> table(
266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      ObjectHashTable::cast(weak_collection->table()));
26713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(table->IsKey(isolate, *key));
268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> lookup(table->Lookup(key, hash), isolate);
26913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return lookup->IsTheHole(isolate) ? isolate->heap()->undefined_value()
27013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                    : *lookup;
271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_WeakCollectionHas) {
275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
27662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(3, args.length());
277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0);
278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_SMI_ARG_CHECKED(hash, 2)
28013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(key->IsJSReceiver() || key->IsSymbol());
281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<ObjectHashTable> table(
282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      ObjectHashTable::cast(weak_collection->table()));
28313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(table->IsKey(isolate, *key));
284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> lookup(table->Lookup(key, hash), isolate);
28513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return isolate->heap()->ToBoolean(!lookup->IsTheHole(isolate));
286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_WeakCollectionDelete) {
290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
29162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(3, args.length());
292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0);
293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_SMI_ARG_CHECKED(hash, 2)
29513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(key->IsJSReceiver() || key->IsSymbol());
296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<ObjectHashTable> table(
297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      ObjectHashTable::cast(weak_collection->table()));
29813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(table->IsKey(isolate, *key));
299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool was_present = JSWeakCollection::Delete(weak_collection, key, hash);
300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return isolate->heap()->ToBoolean(was_present);
301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_WeakCollectionSet) {
305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
30662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(4, args.length());
307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0);
308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
30913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(key->IsJSReceiver() || key->IsSymbol());
310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_SMI_ARG_CHECKED(hash, 3)
312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<ObjectHashTable> table(
313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      ObjectHashTable::cast(weak_collection->table()));
31413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(table->IsKey(isolate, *key));
315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSWeakCollection::Set(weak_collection, key, value, hash);
316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return *weak_collection;
317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_GetWeakSetValues) {
321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
32262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(2, args.length());
323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0);
324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_NUMBER_CHECKED(int, max_values, Int32, args[1]);
32513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(max_values >= 0);
32662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return *JSWeakCollection::GetEntries(holder, max_values);
327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
330