| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
| 8 #include "src/runtime/runtime-utils.h" | 8 #include "src/runtime/runtime-utils.h" |
| 9 | 9 |
| 10 | 10 |
| 11 namespace v8 { | 11 namespace v8 { |
| 12 namespace internal { | 12 namespace internal { |
| 13 | 13 |
| 14 |
| 15 RUNTIME_FUNCTION(Runtime_StringHash) { |
| 16 HandleScope scope(isolate); |
| 17 DCHECK(args.length() == 1); |
| 18 CONVERT_ARG_HANDLE_CHECKED(String, string, 0); |
| 19 return Smi::FromInt(string->Hash()); |
| 20 } |
| 21 |
| 22 |
| 23 RUNTIME_FUNCTION(Runtime_SmiHash) { |
| 24 HandleScope scope(isolate); |
| 25 DCHECK(args.length() == 1); |
| 26 return args[0]->GetHash(); |
| 27 } |
| 28 |
| 29 |
| 30 RUNTIME_FUNCTION(Runtime_FixedArrayGet) { |
| 31 SealHandleScope shs(isolate); |
| 32 DCHECK(args.length() == 2); |
| 33 CONVERT_ARG_CHECKED(FixedArray, object, 0); |
| 34 CONVERT_SMI_ARG_CHECKED(index, 1); |
| 35 return object->get(index); |
| 36 } |
| 37 |
| 38 |
| 39 RUNTIME_FUNCTION(Runtime_FixedArraySet) { |
| 40 SealHandleScope shs(isolate); |
| 41 DCHECK(args.length() == 3); |
| 42 CONVERT_ARG_CHECKED(FixedArray, object, 0); |
| 43 CONVERT_SMI_ARG_CHECKED(index, 1); |
| 44 CONVERT_ARG_CHECKED(Object, value, 2); |
| 45 object->set(index, value); |
| 46 return isolate->heap()->undefined_value(); |
| 47 } |
| 48 |
| 49 |
| 50 RUNTIME_FUNCTION(Runtime_FixedArraySetTheHole) { |
| 51 SealHandleScope shs(isolate); |
| 52 DCHECK(args.length() == 2); |
| 53 CONVERT_ARG_CHECKED(FixedArray, object, 0); |
| 54 CONVERT_SMI_ARG_CHECKED(index, 1); |
| 55 object->set_the_hole(index); |
| 56 return isolate->heap()->undefined_value(); |
| 57 } |
| 58 |
| 59 |
| 60 RUNTIME_FUNCTION(Runtime_JSCollectionGetTable) { |
| 61 SealHandleScope shs(isolate); |
| 62 DCHECK(args.length() == 1); |
| 63 CONVERT_ARG_CHECKED(JSObject, object, 0); |
| 64 RUNTIME_ASSERT(object->IsJSSet() || object->IsJSMap()); |
| 65 return static_cast<JSCollection*>(object)->table(); |
| 66 } |
| 67 |
| 68 |
| 69 RUNTIME_FUNCTION(Runtime_GenericHash) { |
| 70 HandleScope scope(isolate); |
| 71 DCHECK(args.length() == 1); |
| 72 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); |
| 73 Handle<Smi> hash = Object::GetOrCreateHash(isolate, object); |
| 74 return *hash; |
| 75 } |
| 76 |
| 77 |
| 14 RUNTIME_FUNCTION(Runtime_SetInitialize) { | 78 RUNTIME_FUNCTION(Runtime_SetInitialize) { |
| 15 HandleScope scope(isolate); | 79 HandleScope scope(isolate); |
| 16 DCHECK(args.length() == 1); | 80 DCHECK(args.length() == 1); |
| 17 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | 81 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
| 18 Handle<OrderedHashSet> table = isolate->factory()->NewOrderedHashSet(); | 82 Handle<OrderedHashSet> table = isolate->factory()->NewOrderedHashSet(); |
| 19 holder->set_table(*table); | 83 holder->set_table(*table); |
| 20 return *holder; | 84 return *holder; |
| 21 } | 85 } |
| 22 | 86 |
| 23 | 87 |
| 24 RUNTIME_FUNCTION(Runtime_SetAdd) { | 88 RUNTIME_FUNCTION(Runtime_SetGrow) { |
| 25 HandleScope scope(isolate); | 89 HandleScope scope(isolate); |
| 26 DCHECK(args.length() == 2); | 90 DCHECK(args.length() == 1); |
| 27 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | 91 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
| 28 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | |
| 29 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); | 92 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); |
| 30 table = OrderedHashSet::Add(table, key); | 93 table = OrderedHashSet::EnsureGrowable(table); |
| 31 holder->set_table(*table); | 94 holder->set_table(*table); |
| 32 return *holder; | 95 return isolate->heap()->undefined_value(); |
| 33 } | 96 } |
| 34 | 97 |
| 35 | 98 |
| 36 RUNTIME_FUNCTION(Runtime_SetHas) { | 99 RUNTIME_FUNCTION(Runtime_SetShrink) { |
| 37 HandleScope scope(isolate); | 100 HandleScope scope(isolate); |
| 38 DCHECK(args.length() == 2); | 101 DCHECK(args.length() == 1); |
| 39 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | 102 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
| 40 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | |
| 41 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); | 103 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); |
| 42 return isolate->heap()->ToBoolean(table->Contains(key)); | 104 table = OrderedHashSet::Shrink(table); |
| 43 } | |
| 44 | |
| 45 | |
| 46 RUNTIME_FUNCTION(Runtime_SetDelete) { | |
| 47 HandleScope scope(isolate); | |
| 48 DCHECK(args.length() == 2); | |
| 49 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | |
| 50 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | |
| 51 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); | |
| 52 bool was_present = false; | |
| 53 table = OrderedHashSet::Remove(table, key, &was_present); | |
| 54 holder->set_table(*table); | 105 holder->set_table(*table); |
| 55 return isolate->heap()->ToBoolean(was_present); | 106 return isolate->heap()->undefined_value(); |
| 56 } | 107 } |
| 57 | 108 |
| 58 | 109 |
| 59 RUNTIME_FUNCTION(Runtime_SetClear) { | 110 RUNTIME_FUNCTION(Runtime_SetClear) { |
| 60 HandleScope scope(isolate); | 111 HandleScope scope(isolate); |
| 61 DCHECK(args.length() == 1); | 112 DCHECK(args.length() == 1); |
| 62 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | 113 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
| 63 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); | 114 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); |
| 64 table = OrderedHashSet::Clear(table); | 115 table = OrderedHashSet::Clear(table); |
| 65 holder->set_table(*table); | 116 holder->set_table(*table); |
| 66 return isolate->heap()->undefined_value(); | 117 return isolate->heap()->undefined_value(); |
| 67 } | 118 } |
| 68 | 119 |
| 69 | 120 |
| 70 RUNTIME_FUNCTION(Runtime_SetGetSize) { | |
| 71 HandleScope scope(isolate); | |
| 72 DCHECK(args.length() == 1); | |
| 73 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | |
| 74 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); | |
| 75 return Smi::FromInt(table->NumberOfElements()); | |
| 76 } | |
| 77 | |
| 78 | |
| 79 RUNTIME_FUNCTION(Runtime_SetIteratorInitialize) { | 121 RUNTIME_FUNCTION(Runtime_SetIteratorInitialize) { |
| 80 HandleScope scope(isolate); | 122 HandleScope scope(isolate); |
| 81 DCHECK(args.length() == 3); | 123 DCHECK(args.length() == 3); |
| 82 CONVERT_ARG_HANDLE_CHECKED(JSSetIterator, holder, 0); | 124 CONVERT_ARG_HANDLE_CHECKED(JSSetIterator, holder, 0); |
| 83 CONVERT_ARG_HANDLE_CHECKED(JSSet, set, 1); | 125 CONVERT_ARG_HANDLE_CHECKED(JSSet, set, 1); |
| 84 CONVERT_SMI_ARG_CHECKED(kind, 2) | 126 CONVERT_SMI_ARG_CHECKED(kind, 2) |
| 85 RUNTIME_ASSERT(kind == JSSetIterator::kKindValues || | 127 RUNTIME_ASSERT(kind == JSSetIterator::kKindValues || |
| 86 kind == JSSetIterator::kKindEntries); | 128 kind == JSSetIterator::kKindEntries); |
| 87 Handle<OrderedHashSet> table(OrderedHashSet::cast(set->table())); | 129 Handle<OrderedHashSet> table(OrderedHashSet::cast(set->table())); |
| 88 holder->set_table(*table); | 130 holder->set_table(*table); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 RUNTIME_FUNCTION(Runtime_MapInitialize) { | 176 RUNTIME_FUNCTION(Runtime_MapInitialize) { |
| 135 HandleScope scope(isolate); | 177 HandleScope scope(isolate); |
| 136 DCHECK(args.length() == 1); | 178 DCHECK(args.length() == 1); |
| 137 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 179 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
| 138 Handle<OrderedHashMap> table = isolate->factory()->NewOrderedHashMap(); | 180 Handle<OrderedHashMap> table = isolate->factory()->NewOrderedHashMap(); |
| 139 holder->set_table(*table); | 181 holder->set_table(*table); |
| 140 return *holder; | 182 return *holder; |
| 141 } | 183 } |
| 142 | 184 |
| 143 | 185 |
| 144 RUNTIME_FUNCTION(Runtime_MapGet) { | 186 RUNTIME_FUNCTION(Runtime_MapShrink) { |
| 145 HandleScope scope(isolate); | 187 HandleScope scope(isolate); |
| 146 DCHECK(args.length() == 2); | 188 DCHECK(args.length() == 1); |
| 147 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 189 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
| 148 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | |
| 149 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); | 190 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); |
| 150 Handle<Object> lookup(table->Lookup(key), isolate); | 191 table = OrderedHashMap::Shrink(table); |
| 151 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; | 192 holder->set_table(*table); |
| 193 return isolate->heap()->undefined_value(); |
| 152 } | 194 } |
| 153 | 195 |
| 154 | 196 |
| 155 RUNTIME_FUNCTION(Runtime_MapHas) { | |
| 156 HandleScope scope(isolate); | |
| 157 DCHECK(args.length() == 2); | |
| 158 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | |
| 159 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | |
| 160 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); | |
| 161 Handle<Object> lookup(table->Lookup(key), isolate); | |
| 162 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); | |
| 163 } | |
| 164 | |
| 165 | |
| 166 RUNTIME_FUNCTION(Runtime_MapDelete) { | |
| 167 HandleScope scope(isolate); | |
| 168 DCHECK(args.length() == 2); | |
| 169 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | |
| 170 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | |
| 171 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); | |
| 172 bool was_present = false; | |
| 173 Handle<OrderedHashMap> new_table = | |
| 174 OrderedHashMap::Remove(table, key, &was_present); | |
| 175 holder->set_table(*new_table); | |
| 176 return isolate->heap()->ToBoolean(was_present); | |
| 177 } | |
| 178 | |
| 179 | |
| 180 RUNTIME_FUNCTION(Runtime_MapClear) { | 197 RUNTIME_FUNCTION(Runtime_MapClear) { |
| 181 HandleScope scope(isolate); | 198 HandleScope scope(isolate); |
| 182 DCHECK(args.length() == 1); | 199 DCHECK(args.length() == 1); |
| 183 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 200 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
| 184 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); | 201 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); |
| 185 table = OrderedHashMap::Clear(table); | 202 table = OrderedHashMap::Clear(table); |
| 186 holder->set_table(*table); | 203 holder->set_table(*table); |
| 187 return isolate->heap()->undefined_value(); | 204 return isolate->heap()->undefined_value(); |
| 188 } | 205 } |
| 189 | 206 |
| 190 | 207 |
| 191 RUNTIME_FUNCTION(Runtime_MapSet) { | 208 RUNTIME_FUNCTION(Runtime_MapGrow) { |
| 192 HandleScope scope(isolate); | |
| 193 DCHECK(args.length() == 3); | |
| 194 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | |
| 195 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | |
| 196 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | |
| 197 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); | |
| 198 Handle<OrderedHashMap> new_table = OrderedHashMap::Put(table, key, value); | |
| 199 holder->set_table(*new_table); | |
| 200 return *holder; | |
| 201 } | |
| 202 | |
| 203 | |
| 204 RUNTIME_FUNCTION(Runtime_MapGetSize) { | |
| 205 HandleScope scope(isolate); | 209 HandleScope scope(isolate); |
| 206 DCHECK(args.length() == 1); | 210 DCHECK(args.length() == 1); |
| 207 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 211 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
| 208 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); | 212 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); |
| 209 return Smi::FromInt(table->NumberOfElements()); | 213 table = OrderedHashMap::EnsureGrowable(table); |
| 214 holder->set_table(*table); |
| 215 return isolate->heap()->undefined_value(); |
| 210 } | 216 } |
| 211 | 217 |
| 212 | 218 |
| 213 RUNTIME_FUNCTION(Runtime_MapIteratorInitialize) { | 219 RUNTIME_FUNCTION(Runtime_MapIteratorInitialize) { |
| 214 HandleScope scope(isolate); | 220 HandleScope scope(isolate); |
| 215 DCHECK(args.length() == 3); | 221 DCHECK(args.length() == 3); |
| 216 CONVERT_ARG_HANDLE_CHECKED(JSMapIterator, holder, 0); | 222 CONVERT_ARG_HANDLE_CHECKED(JSMapIterator, holder, 0); |
| 217 CONVERT_ARG_HANDLE_CHECKED(JSMap, map, 1); | 223 CONVERT_ARG_HANDLE_CHECKED(JSMap, map, 1); |
| 218 CONVERT_SMI_ARG_CHECKED(kind, 2) | 224 CONVERT_SMI_ARG_CHECKED(kind, 2) |
| 219 RUNTIME_ASSERT(kind == JSMapIterator::kKindKeys || | 225 RUNTIME_ASSERT(kind == JSMapIterator::kKindKeys || |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 | 440 |
| 435 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { | 441 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { |
| 436 HandleScope scope(isolate); | 442 HandleScope scope(isolate); |
| 437 DCHECK(args.length() == 0); | 443 DCHECK(args.length() == 0); |
| 438 Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap(); | 444 Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap(); |
| 439 Runtime::WeakCollectionInitialize(isolate, weakmap); | 445 Runtime::WeakCollectionInitialize(isolate, weakmap); |
| 440 return *weakmap; | 446 return *weakmap; |
| 441 } | 447 } |
| 442 } | 448 } |
| 443 } // namespace v8::internal | 449 } // namespace v8::internal |
| OLD | NEW |