| 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 |