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