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

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: Moved more to JS Created 5 years, 9 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
« no previous file with comments | « src/runtime/runtime.h ('k') | test/cctest/cctest.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_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();
Michael Starzinger 2015/03/16 22:54:13 This will trigger debug code in CEntryStub::Genera
adamk 2015/03/17 09:05:31 %FixedArrayGet() can already return the hole (whic
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
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
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
OLDNEW
« no previous file with comments | « src/runtime/runtime.h ('k') | test/cctest/cctest.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698