Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(332)

Side by Side Diff: src/runtime/runtime-collections.cc

Issue 947683002: Reimplement Maps and Sets in JS (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Disable one more test Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« src/objects.cc ('K') | « src/runtime/runtime.h ('k') | test/cctest/cctest.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698