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_StringGetRawHashField) { |
| 16 HandleScope scope(isolate); |
| 17 DCHECK(args.length() == 1); |
| 18 CONVERT_ARG_HANDLE_CHECKED(String, string, 0); |
| 19 return *isolate->factory()->NewNumberFromUint(string->hash_field()); |
| 20 } |
| 21 |
| 22 |
| 23 RUNTIME_FUNCTION(Runtime_TheHole) { |
| 24 SealHandleScope shs(isolate); |
| 25 DCHECK(args.length() == 0); |
| 26 return isolate->heap()->the_hole_value(); |
| 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_JSCollectionGetTable) { |
| 51 SealHandleScope shs(isolate); |
| 52 DCHECK(args.length() == 1); |
| 53 CONVERT_ARG_CHECKED(JSObject, object, 0); |
| 54 RUNTIME_ASSERT(object->IsJSSet() || object->IsJSMap()); |
| 55 return static_cast<JSCollection*>(object)->table(); |
| 56 } |
| 57 |
| 58 |
| 59 RUNTIME_FUNCTION(Runtime_GenericHash) { |
| 60 HandleScope scope(isolate); |
| 61 DCHECK(args.length() == 1); |
| 62 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); |
| 63 Handle<Smi> hash = Object::GetOrCreateHash(isolate, object); |
| 64 return *hash; |
| 65 } |
| 66 |
| 67 |
14 RUNTIME_FUNCTION(Runtime_SetInitialize) { | 68 RUNTIME_FUNCTION(Runtime_SetInitialize) { |
15 HandleScope scope(isolate); | 69 HandleScope scope(isolate); |
16 DCHECK(args.length() == 1); | 70 DCHECK(args.length() == 1); |
17 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | 71 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
18 Handle<OrderedHashSet> table = isolate->factory()->NewOrderedHashSet(); | 72 Handle<OrderedHashSet> table = isolate->factory()->NewOrderedHashSet(); |
19 holder->set_table(*table); | 73 holder->set_table(*table); |
20 return *holder; | 74 return *holder; |
21 } | 75 } |
22 | 76 |
23 | 77 |
24 RUNTIME_FUNCTION(Runtime_SetAdd) { | 78 RUNTIME_FUNCTION(Runtime_SetGrow) { |
25 HandleScope scope(isolate); | 79 HandleScope scope(isolate); |
26 DCHECK(args.length() == 2); | 80 DCHECK(args.length() == 1); |
27 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | 81 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
28 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | |
29 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); | 82 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); |
30 table = OrderedHashSet::Add(table, key); | 83 table = OrderedHashSet::EnsureGrowable(table); |
31 holder->set_table(*table); | 84 holder->set_table(*table); |
32 return *holder; | 85 return isolate->heap()->undefined_value(); |
33 } | 86 } |
34 | 87 |
35 | 88 |
36 RUNTIME_FUNCTION(Runtime_SetHas) { | 89 RUNTIME_FUNCTION(Runtime_SetShrink) { |
37 HandleScope scope(isolate); | 90 HandleScope scope(isolate); |
38 DCHECK(args.length() == 2); | 91 DCHECK(args.length() == 1); |
39 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | 92 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
40 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | |
41 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); | 93 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); |
42 return isolate->heap()->ToBoolean(table->Contains(key)); | 94 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); | 95 holder->set_table(*table); |
55 return isolate->heap()->ToBoolean(was_present); | 96 return isolate->heap()->undefined_value(); |
56 } | 97 } |
57 | 98 |
58 | 99 |
59 RUNTIME_FUNCTION(Runtime_SetClear) { | 100 RUNTIME_FUNCTION(Runtime_SetClear) { |
60 HandleScope scope(isolate); | 101 HandleScope scope(isolate); |
61 DCHECK(args.length() == 1); | 102 DCHECK(args.length() == 1); |
62 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | 103 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
63 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); | 104 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); |
64 table = OrderedHashSet::Clear(table); | 105 table = OrderedHashSet::Clear(table); |
65 holder->set_table(*table); | 106 holder->set_table(*table); |
66 return isolate->heap()->undefined_value(); | 107 return isolate->heap()->undefined_value(); |
67 } | 108 } |
68 | 109 |
69 | 110 |
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) { | 111 RUNTIME_FUNCTION(Runtime_SetIteratorInitialize) { |
80 HandleScope scope(isolate); | 112 HandleScope scope(isolate); |
81 DCHECK(args.length() == 3); | 113 DCHECK(args.length() == 3); |
82 CONVERT_ARG_HANDLE_CHECKED(JSSetIterator, holder, 0); | 114 CONVERT_ARG_HANDLE_CHECKED(JSSetIterator, holder, 0); |
83 CONVERT_ARG_HANDLE_CHECKED(JSSet, set, 1); | 115 CONVERT_ARG_HANDLE_CHECKED(JSSet, set, 1); |
84 CONVERT_SMI_ARG_CHECKED(kind, 2) | 116 CONVERT_SMI_ARG_CHECKED(kind, 2) |
85 RUNTIME_ASSERT(kind == JSSetIterator::kKindValues || | 117 RUNTIME_ASSERT(kind == JSSetIterator::kKindValues || |
86 kind == JSSetIterator::kKindEntries); | 118 kind == JSSetIterator::kKindEntries); |
87 Handle<OrderedHashSet> table(OrderedHashSet::cast(set->table())); | 119 Handle<OrderedHashSet> table(OrderedHashSet::cast(set->table())); |
88 holder->set_table(*table); | 120 holder->set_table(*table); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 RUNTIME_FUNCTION(Runtime_MapInitialize) { | 166 RUNTIME_FUNCTION(Runtime_MapInitialize) { |
135 HandleScope scope(isolate); | 167 HandleScope scope(isolate); |
136 DCHECK(args.length() == 1); | 168 DCHECK(args.length() == 1); |
137 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 169 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
138 Handle<OrderedHashMap> table = isolate->factory()->NewOrderedHashMap(); | 170 Handle<OrderedHashMap> table = isolate->factory()->NewOrderedHashMap(); |
139 holder->set_table(*table); | 171 holder->set_table(*table); |
140 return *holder; | 172 return *holder; |
141 } | 173 } |
142 | 174 |
143 | 175 |
144 RUNTIME_FUNCTION(Runtime_MapGet) { | 176 RUNTIME_FUNCTION(Runtime_MapShrink) { |
145 HandleScope scope(isolate); | 177 HandleScope scope(isolate); |
146 DCHECK(args.length() == 2); | 178 DCHECK(args.length() == 1); |
147 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 179 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
148 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | |
149 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); | 180 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); |
150 Handle<Object> lookup(table->Lookup(key), isolate); | 181 table = OrderedHashMap::Shrink(table); |
151 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; | 182 holder->set_table(*table); |
| 183 return isolate->heap()->undefined_value(); |
152 } | 184 } |
153 | 185 |
154 | 186 |
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) { | 187 RUNTIME_FUNCTION(Runtime_MapClear) { |
181 HandleScope scope(isolate); | 188 HandleScope scope(isolate); |
182 DCHECK(args.length() == 1); | 189 DCHECK(args.length() == 1); |
183 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 190 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
184 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); | 191 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); |
185 table = OrderedHashMap::Clear(table); | 192 table = OrderedHashMap::Clear(table); |
186 holder->set_table(*table); | 193 holder->set_table(*table); |
187 return isolate->heap()->undefined_value(); | 194 return isolate->heap()->undefined_value(); |
188 } | 195 } |
189 | 196 |
190 | 197 |
191 RUNTIME_FUNCTION(Runtime_MapSet) { | 198 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); | 199 HandleScope scope(isolate); |
206 DCHECK(args.length() == 1); | 200 DCHECK(args.length() == 1); |
207 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 201 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
208 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); | 202 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); |
209 return Smi::FromInt(table->NumberOfElements()); | 203 table = OrderedHashMap::EnsureGrowable(table); |
| 204 holder->set_table(*table); |
| 205 return isolate->heap()->undefined_value(); |
210 } | 206 } |
211 | 207 |
212 | 208 |
213 RUNTIME_FUNCTION(Runtime_MapIteratorInitialize) { | 209 RUNTIME_FUNCTION(Runtime_MapIteratorInitialize) { |
214 HandleScope scope(isolate); | 210 HandleScope scope(isolate); |
215 DCHECK(args.length() == 3); | 211 DCHECK(args.length() == 3); |
216 CONVERT_ARG_HANDLE_CHECKED(JSMapIterator, holder, 0); | 212 CONVERT_ARG_HANDLE_CHECKED(JSMapIterator, holder, 0); |
217 CONVERT_ARG_HANDLE_CHECKED(JSMap, map, 1); | 213 CONVERT_ARG_HANDLE_CHECKED(JSMap, map, 1); |
218 CONVERT_SMI_ARG_CHECKED(kind, 2) | 214 CONVERT_SMI_ARG_CHECKED(kind, 2) |
219 RUNTIME_ASSERT(kind == JSMapIterator::kKindKeys || | 215 RUNTIME_ASSERT(kind == JSMapIterator::kKindKeys || |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 | 430 |
435 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { | 431 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { |
436 HandleScope scope(isolate); | 432 HandleScope scope(isolate); |
437 DCHECK(args.length() == 0); | 433 DCHECK(args.length() == 0); |
438 Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap(); | 434 Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap(); |
439 Runtime::WeakCollectionInitialize(isolate, weakmap); | 435 Runtime::WeakCollectionInitialize(isolate, weakmap); |
440 return *weakmap; | 436 return *weakmap; |
441 } | 437 } |
442 } | 438 } |
443 } // namespace v8::internal | 439 } // namespace v8::internal |
OLD | NEW |