OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 19 matching lines...) Expand all Loading... |
30 #include "v8.h" | 30 #include "v8.h" |
31 | 31 |
32 #include "cctest.h" | 32 #include "cctest.h" |
33 #include "factory.h" | 33 #include "factory.h" |
34 | 34 |
35 namespace { | 35 namespace { |
36 | 36 |
37 using namespace v8::internal; | 37 using namespace v8::internal; |
38 | 38 |
39 | 39 |
40 void CheckIterResultObject(Isolate* isolate, | |
41 Handle<JSObject> result, | |
42 Handle<Object> value, | |
43 bool done) { | |
44 Handle<Object> value_object = | |
45 Object::GetProperty(isolate, result, "value").ToHandleChecked(); | |
46 Handle<Object> done_object = | |
47 Object::GetProperty(isolate, result, "done").ToHandleChecked(); | |
48 | |
49 CHECK_EQ(*value_object, *value); | |
50 CHECK(done_object->IsBoolean()); | |
51 CHECK_EQ(done_object->BooleanValue(), done); | |
52 } | |
53 | |
54 | |
55 TEST(Set) { | 40 TEST(Set) { |
56 i::FLAG_harmony_collections = true; | 41 i::FLAG_harmony_collections = true; |
57 | 42 |
58 LocalContext context; | 43 LocalContext context; |
59 Isolate* isolate = CcTest::i_isolate(); | 44 Isolate* isolate = CcTest::i_isolate(); |
60 Factory* factory = isolate->factory(); | 45 Factory* factory = isolate->factory(); |
61 HandleScope scope(isolate); | 46 HandleScope scope(isolate); |
62 Handle<OrderedHashSet> ordered_set = factory->NewOrderedHashSet(); | 47 Handle<OrderedHashSet> ordered_set = factory->NewOrderedHashSet(); |
63 CHECK_EQ(2, ordered_set->NumberOfBuckets()); | 48 CHECK_EQ(2, ordered_set->NumberOfBuckets()); |
64 CHECK_EQ(0, ordered_set->NumberOfElements()); | 49 CHECK_EQ(0, ordered_set->NumberOfElements()); |
65 CHECK_EQ(0, ordered_set->NumberOfDeletedElements()); | 50 CHECK_EQ(0, ordered_set->NumberOfDeletedElements()); |
66 | 51 |
67 Handle<JSSetIterator> value_iterator = | |
68 JSSetIterator::Create(ordered_set, JSSetIterator::kKindValues); | |
69 Handle<JSSetIterator> value_iterator_2 = | |
70 JSSetIterator::Create(ordered_set, JSSetIterator::kKindValues); | |
71 | |
72 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 52 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
73 Handle<JSObject> obj = factory->NewJSObjectFromMap(map); | 53 Handle<JSObject> obj = factory->NewJSObjectFromMap(map); |
74 CHECK(!ordered_set->Contains(obj)); | 54 CHECK(!ordered_set->Contains(obj)); |
75 ordered_set = OrderedHashSet::Add(ordered_set, obj); | 55 ordered_set = OrderedHashSet::Add(ordered_set, obj); |
76 CHECK_EQ(1, ordered_set->NumberOfElements()); | 56 CHECK_EQ(1, ordered_set->NumberOfElements()); |
77 CHECK(ordered_set->Contains(obj)); | 57 CHECK(ordered_set->Contains(obj)); |
78 bool was_present = false; | 58 bool was_present = false; |
79 ordered_set = OrderedHashSet::Remove(ordered_set, obj, &was_present); | 59 ordered_set = OrderedHashSet::Remove(ordered_set, obj, &was_present); |
80 CHECK(was_present); | 60 CHECK(was_present); |
81 CHECK_EQ(0, ordered_set->NumberOfElements()); | 61 CHECK_EQ(0, ordered_set->NumberOfElements()); |
82 CHECK(!ordered_set->Contains(obj)); | 62 CHECK(!ordered_set->Contains(obj)); |
83 | 63 |
84 // Removing a not-present object should set was_present to false. | 64 // Removing a not-present object should set was_present to false. |
85 ordered_set = OrderedHashSet::Remove(ordered_set, obj, &was_present); | 65 ordered_set = OrderedHashSet::Remove(ordered_set, obj, &was_present); |
86 CHECK(!was_present); | 66 CHECK(!was_present); |
87 | 67 |
88 // Test for collisions/chaining | 68 // Test for collisions/chaining |
89 Handle<JSObject> obj1 = factory->NewJSObjectFromMap(map); | 69 Handle<JSObject> obj1 = factory->NewJSObjectFromMap(map); |
90 ordered_set = OrderedHashSet::Add(ordered_set, obj1); | 70 ordered_set = OrderedHashSet::Add(ordered_set, obj1); |
91 Handle<JSObject> obj2 = factory->NewJSObjectFromMap(map); | 71 Handle<JSObject> obj2 = factory->NewJSObjectFromMap(map); |
92 ordered_set = OrderedHashSet::Add(ordered_set, obj2); | 72 ordered_set = OrderedHashSet::Add(ordered_set, obj2); |
93 Handle<JSObject> obj3 = factory->NewJSObjectFromMap(map); | 73 Handle<JSObject> obj3 = factory->NewJSObjectFromMap(map); |
94 ordered_set = OrderedHashSet::Add(ordered_set, obj3); | 74 ordered_set = OrderedHashSet::Add(ordered_set, obj3); |
95 CHECK_EQ(3, ordered_set->NumberOfElements()); | 75 CHECK_EQ(3, ordered_set->NumberOfElements()); |
96 CHECK(ordered_set->Contains(obj1)); | 76 CHECK(ordered_set->Contains(obj1)); |
97 CHECK(ordered_set->Contains(obj2)); | 77 CHECK(ordered_set->Contains(obj2)); |
98 CHECK(ordered_set->Contains(obj3)); | 78 CHECK(ordered_set->Contains(obj3)); |
99 | 79 |
100 // Test iteration | |
101 CheckIterResultObject( | |
102 isolate, JSSetIterator::Next(value_iterator), obj1, false); | |
103 CheckIterResultObject( | |
104 isolate, JSSetIterator::Next(value_iterator), obj2, false); | |
105 CheckIterResultObject( | |
106 isolate, JSSetIterator::Next(value_iterator), obj3, false); | |
107 CheckIterResultObject(isolate, | |
108 JSSetIterator::Next(value_iterator), | |
109 factory->undefined_value(), | |
110 true); | |
111 | |
112 // Test growth | 80 // Test growth |
113 ordered_set = OrderedHashSet::Add(ordered_set, obj); | 81 ordered_set = OrderedHashSet::Add(ordered_set, obj); |
114 Handle<JSObject> obj4 = factory->NewJSObjectFromMap(map); | 82 Handle<JSObject> obj4 = factory->NewJSObjectFromMap(map); |
115 ordered_set = OrderedHashSet::Add(ordered_set, obj4); | 83 ordered_set = OrderedHashSet::Add(ordered_set, obj4); |
116 CHECK(ordered_set->Contains(obj)); | 84 CHECK(ordered_set->Contains(obj)); |
117 CHECK(ordered_set->Contains(obj1)); | 85 CHECK(ordered_set->Contains(obj1)); |
118 CHECK(ordered_set->Contains(obj2)); | 86 CHECK(ordered_set->Contains(obj2)); |
119 CHECK(ordered_set->Contains(obj3)); | 87 CHECK(ordered_set->Contains(obj3)); |
120 CHECK(ordered_set->Contains(obj4)); | 88 CHECK(ordered_set->Contains(obj4)); |
121 CHECK_EQ(5, ordered_set->NumberOfElements()); | 89 CHECK_EQ(5, ordered_set->NumberOfElements()); |
122 CHECK_EQ(0, ordered_set->NumberOfDeletedElements()); | 90 CHECK_EQ(0, ordered_set->NumberOfDeletedElements()); |
123 CHECK_EQ(4, ordered_set->NumberOfBuckets()); | 91 CHECK_EQ(4, ordered_set->NumberOfBuckets()); |
124 | 92 |
125 // Test iteration after growth | |
126 CheckIterResultObject( | |
127 isolate, JSSetIterator::Next(value_iterator_2), obj1, false); | |
128 CheckIterResultObject( | |
129 isolate, JSSetIterator::Next(value_iterator_2), obj2, false); | |
130 CheckIterResultObject( | |
131 isolate, JSSetIterator::Next(value_iterator_2), obj3, false); | |
132 CheckIterResultObject( | |
133 isolate, JSSetIterator::Next(value_iterator_2), obj, false); | |
134 CheckIterResultObject( | |
135 isolate, JSSetIterator::Next(value_iterator_2), obj4, false); | |
136 CheckIterResultObject(isolate, | |
137 JSSetIterator::Next(value_iterator_2), | |
138 factory->undefined_value(), | |
139 true); | |
140 | |
141 // Test shrinking | 93 // Test shrinking |
142 ordered_set = OrderedHashSet::Remove(ordered_set, obj, &was_present); | 94 ordered_set = OrderedHashSet::Remove(ordered_set, obj, &was_present); |
143 CHECK(was_present); | 95 CHECK(was_present); |
144 ordered_set = OrderedHashSet::Remove(ordered_set, obj1, &was_present); | 96 ordered_set = OrderedHashSet::Remove(ordered_set, obj1, &was_present); |
145 CHECK(was_present); | 97 CHECK(was_present); |
146 ordered_set = OrderedHashSet::Remove(ordered_set, obj2, &was_present); | 98 ordered_set = OrderedHashSet::Remove(ordered_set, obj2, &was_present); |
147 CHECK(was_present); | 99 CHECK(was_present); |
148 ordered_set = OrderedHashSet::Remove(ordered_set, obj3, &was_present); | 100 ordered_set = OrderedHashSet::Remove(ordered_set, obj3, &was_present); |
149 CHECK(was_present); | 101 CHECK(was_present); |
150 CHECK_EQ(1, ordered_set->NumberOfElements()); | 102 CHECK_EQ(1, ordered_set->NumberOfElements()); |
151 CHECK_EQ(2, ordered_set->NumberOfBuckets()); | 103 CHECK_EQ(2, ordered_set->NumberOfBuckets()); |
152 } | 104 } |
153 | 105 |
154 | 106 |
155 TEST(Map) { | 107 TEST(Map) { |
156 i::FLAG_harmony_collections = true; | 108 i::FLAG_harmony_collections = true; |
157 | 109 |
158 LocalContext context; | 110 LocalContext context; |
159 Isolate* isolate = CcTest::i_isolate(); | 111 Isolate* isolate = CcTest::i_isolate(); |
160 Factory* factory = isolate->factory(); | 112 Factory* factory = isolate->factory(); |
161 HandleScope scope(isolate); | 113 HandleScope scope(isolate); |
162 Handle<OrderedHashMap> ordered_map = factory->NewOrderedHashMap(); | 114 Handle<OrderedHashMap> ordered_map = factory->NewOrderedHashMap(); |
163 CHECK_EQ(2, ordered_map->NumberOfBuckets()); | 115 CHECK_EQ(2, ordered_map->NumberOfBuckets()); |
164 CHECK_EQ(0, ordered_map->NumberOfElements()); | 116 CHECK_EQ(0, ordered_map->NumberOfElements()); |
165 CHECK_EQ(0, ordered_map->NumberOfDeletedElements()); | 117 CHECK_EQ(0, ordered_map->NumberOfDeletedElements()); |
166 | 118 |
167 Handle<JSMapIterator> value_iterator = | |
168 JSMapIterator::Create(ordered_map, JSMapIterator::kKindValues); | |
169 Handle<JSMapIterator> key_iterator = | |
170 JSMapIterator::Create(ordered_map, JSMapIterator::kKindKeys); | |
171 | |
172 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 119 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
173 Handle<JSObject> obj = factory->NewJSObjectFromMap(map); | 120 Handle<JSObject> obj = factory->NewJSObjectFromMap(map); |
174 Handle<JSObject> val = factory->NewJSObjectFromMap(map); | 121 Handle<JSObject> val = factory->NewJSObjectFromMap(map); |
175 CHECK(ordered_map->Lookup(obj)->IsTheHole()); | 122 CHECK(ordered_map->Lookup(obj)->IsTheHole()); |
176 ordered_map = OrderedHashMap::Put(ordered_map, obj, val); | 123 ordered_map = OrderedHashMap::Put(ordered_map, obj, val); |
177 CHECK_EQ(1, ordered_map->NumberOfElements()); | 124 CHECK_EQ(1, ordered_map->NumberOfElements()); |
178 CHECK(ordered_map->Lookup(obj)->SameValue(*val)); | 125 CHECK(ordered_map->Lookup(obj)->SameValue(*val)); |
179 ordered_map = OrderedHashMap::Put( | 126 ordered_map = OrderedHashMap::Put( |
180 ordered_map, obj, factory->the_hole_value()); | 127 ordered_map, obj, factory->the_hole_value()); |
181 CHECK_EQ(0, ordered_map->NumberOfElements()); | 128 CHECK_EQ(0, ordered_map->NumberOfElements()); |
182 CHECK(ordered_map->Lookup(obj)->IsTheHole()); | 129 CHECK(ordered_map->Lookup(obj)->IsTheHole()); |
183 | 130 |
184 // Test for collisions/chaining | 131 // Test for collisions/chaining |
185 Handle<JSObject> obj1 = factory->NewJSObjectFromMap(map); | 132 Handle<JSObject> obj1 = factory->NewJSObjectFromMap(map); |
186 Handle<JSObject> obj2 = factory->NewJSObjectFromMap(map); | 133 Handle<JSObject> obj2 = factory->NewJSObjectFromMap(map); |
187 Handle<JSObject> obj3 = factory->NewJSObjectFromMap(map); | 134 Handle<JSObject> obj3 = factory->NewJSObjectFromMap(map); |
188 Handle<JSObject> val1 = factory->NewJSObjectFromMap(map); | 135 Handle<JSObject> val1 = factory->NewJSObjectFromMap(map); |
189 Handle<JSObject> val2 = factory->NewJSObjectFromMap(map); | 136 Handle<JSObject> val2 = factory->NewJSObjectFromMap(map); |
190 Handle<JSObject> val3 = factory->NewJSObjectFromMap(map); | 137 Handle<JSObject> val3 = factory->NewJSObjectFromMap(map); |
191 ordered_map = OrderedHashMap::Put(ordered_map, obj1, val1); | 138 ordered_map = OrderedHashMap::Put(ordered_map, obj1, val1); |
192 ordered_map = OrderedHashMap::Put(ordered_map, obj2, val2); | 139 ordered_map = OrderedHashMap::Put(ordered_map, obj2, val2); |
193 ordered_map = OrderedHashMap::Put(ordered_map, obj3, val3); | 140 ordered_map = OrderedHashMap::Put(ordered_map, obj3, val3); |
194 CHECK_EQ(3, ordered_map->NumberOfElements()); | 141 CHECK_EQ(3, ordered_map->NumberOfElements()); |
195 CHECK(ordered_map->Lookup(obj1)->SameValue(*val1)); | 142 CHECK(ordered_map->Lookup(obj1)->SameValue(*val1)); |
196 CHECK(ordered_map->Lookup(obj2)->SameValue(*val2)); | 143 CHECK(ordered_map->Lookup(obj2)->SameValue(*val2)); |
197 CHECK(ordered_map->Lookup(obj3)->SameValue(*val3)); | 144 CHECK(ordered_map->Lookup(obj3)->SameValue(*val3)); |
198 | 145 |
199 // Test iteration | |
200 CheckIterResultObject( | |
201 isolate, JSMapIterator::Next(value_iterator), val1, false); | |
202 CheckIterResultObject( | |
203 isolate, JSMapIterator::Next(value_iterator), val2, false); | |
204 CheckIterResultObject( | |
205 isolate, JSMapIterator::Next(value_iterator), val3, false); | |
206 CheckIterResultObject(isolate, | |
207 JSMapIterator::Next(value_iterator), | |
208 factory->undefined_value(), | |
209 true); | |
210 | |
211 // Test growth | 146 // Test growth |
212 ordered_map = OrderedHashMap::Put(ordered_map, obj, val); | 147 ordered_map = OrderedHashMap::Put(ordered_map, obj, val); |
213 Handle<JSObject> obj4 = factory->NewJSObjectFromMap(map); | 148 Handle<JSObject> obj4 = factory->NewJSObjectFromMap(map); |
214 Handle<JSObject> val4 = factory->NewJSObjectFromMap(map); | 149 Handle<JSObject> val4 = factory->NewJSObjectFromMap(map); |
215 ordered_map = OrderedHashMap::Put(ordered_map, obj4, val4); | 150 ordered_map = OrderedHashMap::Put(ordered_map, obj4, val4); |
216 CHECK(ordered_map->Lookup(obj)->SameValue(*val)); | 151 CHECK(ordered_map->Lookup(obj)->SameValue(*val)); |
217 CHECK(ordered_map->Lookup(obj1)->SameValue(*val1)); | 152 CHECK(ordered_map->Lookup(obj1)->SameValue(*val1)); |
218 CHECK(ordered_map->Lookup(obj2)->SameValue(*val2)); | 153 CHECK(ordered_map->Lookup(obj2)->SameValue(*val2)); |
219 CHECK(ordered_map->Lookup(obj3)->SameValue(*val3)); | 154 CHECK(ordered_map->Lookup(obj3)->SameValue(*val3)); |
220 CHECK(ordered_map->Lookup(obj4)->SameValue(*val4)); | 155 CHECK(ordered_map->Lookup(obj4)->SameValue(*val4)); |
221 CHECK_EQ(5, ordered_map->NumberOfElements()); | 156 CHECK_EQ(5, ordered_map->NumberOfElements()); |
222 CHECK_EQ(4, ordered_map->NumberOfBuckets()); | 157 CHECK_EQ(4, ordered_map->NumberOfBuckets()); |
223 | 158 |
224 // Test iteration after growth | |
225 CheckIterResultObject( | |
226 isolate, JSMapIterator::Next(key_iterator), obj1, false); | |
227 CheckIterResultObject( | |
228 isolate, JSMapIterator::Next(key_iterator), obj2, false); | |
229 CheckIterResultObject( | |
230 isolate, JSMapIterator::Next(key_iterator), obj3, false); | |
231 CheckIterResultObject( | |
232 isolate, JSMapIterator::Next(key_iterator), obj, false); | |
233 CheckIterResultObject( | |
234 isolate, JSMapIterator::Next(key_iterator), obj4, false); | |
235 CheckIterResultObject(isolate, | |
236 JSMapIterator::Next(key_iterator), | |
237 factory->undefined_value(), | |
238 true); | |
239 | |
240 // Test shrinking | 159 // Test shrinking |
241 ordered_map = OrderedHashMap::Put( | 160 ordered_map = OrderedHashMap::Put( |
242 ordered_map, obj, factory->the_hole_value()); | 161 ordered_map, obj, factory->the_hole_value()); |
243 ordered_map = OrderedHashMap::Put( | 162 ordered_map = OrderedHashMap::Put( |
244 ordered_map, obj1, factory->the_hole_value()); | 163 ordered_map, obj1, factory->the_hole_value()); |
245 ordered_map = OrderedHashMap::Put( | 164 ordered_map = OrderedHashMap::Put( |
246 ordered_map, obj2, factory->the_hole_value()); | 165 ordered_map, obj2, factory->the_hole_value()); |
247 ordered_map = OrderedHashMap::Put( | 166 ordered_map = OrderedHashMap::Put( |
248 ordered_map, obj3, factory->the_hole_value()); | 167 ordered_map, obj3, factory->the_hole_value()); |
249 CHECK_EQ(1, ordered_map->NumberOfElements()); | 168 CHECK_EQ(1, ordered_map->NumberOfElements()); |
250 CHECK_EQ(2, ordered_map->NumberOfBuckets()); | 169 CHECK_EQ(2, ordered_map->NumberOfBuckets()); |
251 } | 170 } |
252 | 171 |
253 | 172 |
254 } | 173 } |
OLD | NEW |