| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 (function() { | 5 (function() { |
| 6 | 6 |
| 7 "use strict"; | 7 "use strict"; |
| 8 | 8 |
| 9 %CheckIsBootstrapping(); | 9 %CheckIsBootstrapping(); |
| 10 | 10 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 function SetConstructor(iterable) { | 92 function SetConstructor(iterable) { |
| 93 if (!%_IsConstructCall()) { | 93 if (!%_IsConstructCall()) { |
| 94 throw MakeTypeError('constructor_not_function', ['Set']); | 94 throw MakeTypeError('constructor_not_function', ['Set']); |
| 95 } | 95 } |
| 96 | 96 |
| 97 %_SetInitialize(this); | 97 %_SetInitialize(this); |
| 98 | 98 |
| 99 if (!IS_NULL_OR_UNDEFINED(iterable)) { | 99 if (!IS_NULL_OR_UNDEFINED(iterable)) { |
| 100 var adder = this.add; | 100 var adder = this.add; |
| 101 if (!IS_SPEC_FUNCTION(adder)) { | 101 if (!IS_SPEC_FUNCTION(adder)) { |
| 102 throw MakeTypeError(kPropertyNotFunction, ['add', this]); | 102 throw MakeTypeError(kPropertyNotFunction, 'add', this); |
| 103 } | 103 } |
| 104 | 104 |
| 105 for (var value of iterable) { | 105 for (var value of iterable) { |
| 106 %_CallFunction(this, value, adder); | 106 %_CallFunction(this, value, adder); |
| 107 } | 107 } |
| 108 } | 108 } |
| 109 } | 109 } |
| 110 | 110 |
| 111 | 111 |
| 112 function SetAdd(key) { | 112 function SetAdd(key) { |
| 113 if (!IS_SET(this)) { | 113 if (!IS_SET(this)) { |
| 114 throw MakeTypeError('incompatible_method_receiver', | 114 throw MakeTypeError(kIncompatibleMethodReceiver, 'Set.prototype.add', this); |
| 115 ['Set.prototype.add', this]); | |
| 116 } | 115 } |
| 117 // Normalize -0 to +0 as required by the spec. | 116 // Normalize -0 to +0 as required by the spec. |
| 118 // Even though we use SameValueZero as the comparison for the keys we don't | 117 // Even though we use SameValueZero as the comparison for the keys we don't |
| 119 // want to ever store -0 as the key since the key is directly exposed when | 118 // want to ever store -0 as the key since the key is directly exposed when |
| 120 // doing iteration. | 119 // doing iteration. |
| 121 if (key === 0) { | 120 if (key === 0) { |
| 122 key = 0; | 121 key = 0; |
| 123 } | 122 } |
| 124 var table = %_JSCollectionGetTable(this); | 123 var table = %_JSCollectionGetTable(this); |
| 125 var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); | 124 var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 145 ORDERED_HASH_TABLE_SET_BUCKET_AT(table, bucket, entry); | 144 ORDERED_HASH_TABLE_SET_BUCKET_AT(table, bucket, entry); |
| 146 ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof + 1); | 145 ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof + 1); |
| 147 FIXED_ARRAY_SET(table, index, key); | 146 FIXED_ARRAY_SET(table, index, key); |
| 148 FIXED_ARRAY_SET_SMI(table, index + 1, chainEntry); | 147 FIXED_ARRAY_SET_SMI(table, index + 1, chainEntry); |
| 149 return this; | 148 return this; |
| 150 } | 149 } |
| 151 | 150 |
| 152 | 151 |
| 153 function SetHas(key) { | 152 function SetHas(key) { |
| 154 if (!IS_SET(this)) { | 153 if (!IS_SET(this)) { |
| 155 throw MakeTypeError('incompatible_method_receiver', | 154 throw MakeTypeError(kIncompatibleMethodReceiver, 'Set.prototype.has', this); |
| 156 ['Set.prototype.has', this]); | |
| 157 } | 155 } |
| 158 var table = %_JSCollectionGetTable(this); | 156 var table = %_JSCollectionGetTable(this); |
| 159 var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); | 157 var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); |
| 160 var hash = GetHash(key); | 158 var hash = GetHash(key); |
| 161 return SetFindEntry(table, numBuckets, key, hash) !== NOT_FOUND; | 159 return SetFindEntry(table, numBuckets, key, hash) !== NOT_FOUND; |
| 162 } | 160 } |
| 163 | 161 |
| 164 | 162 |
| 165 function SetDelete(key) { | 163 function SetDelete(key) { |
| 166 if (!IS_SET(this)) { | 164 if (!IS_SET(this)) { |
| 167 throw MakeTypeError('incompatible_method_receiver', | 165 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 168 ['Set.prototype.delete', this]); | 166 'Set.prototype.delete', this); |
| 169 } | 167 } |
| 170 var table = %_JSCollectionGetTable(this); | 168 var table = %_JSCollectionGetTable(this); |
| 171 var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); | 169 var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); |
| 172 var hash = GetHash(key); | 170 var hash = GetHash(key); |
| 173 var entry = SetFindEntry(table, numBuckets, key, hash); | 171 var entry = SetFindEntry(table, numBuckets, key, hash); |
| 174 if (entry === NOT_FOUND) return false; | 172 if (entry === NOT_FOUND) return false; |
| 175 | 173 |
| 176 var nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table) - 1; | 174 var nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table) - 1; |
| 177 var nod = ORDERED_HASH_TABLE_DELETED_COUNT(table) + 1; | 175 var nod = ORDERED_HASH_TABLE_DELETED_COUNT(table) + 1; |
| 178 var index = ORDERED_HASH_SET_ENTRY_TO_INDEX(entry, numBuckets); | 176 var index = ORDERED_HASH_SET_ENTRY_TO_INDEX(entry, numBuckets); |
| 179 FIXED_ARRAY_SET(table, index, %_TheHole()); | 177 FIXED_ARRAY_SET(table, index, %_TheHole()); |
| 180 ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof); | 178 ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof); |
| 181 ORDERED_HASH_TABLE_SET_DELETED_COUNT(table, nod); | 179 ORDERED_HASH_TABLE_SET_DELETED_COUNT(table, nod); |
| 182 if (nof < (numBuckets >>> 1)) %SetShrink(this); | 180 if (nof < (numBuckets >>> 1)) %SetShrink(this); |
| 183 return true; | 181 return true; |
| 184 } | 182 } |
| 185 | 183 |
| 186 | 184 |
| 187 function SetGetSize() { | 185 function SetGetSize() { |
| 188 if (!IS_SET(this)) { | 186 if (!IS_SET(this)) { |
| 189 throw MakeTypeError('incompatible_method_receiver', | 187 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 190 ['Set.prototype.size', this]); | 188 'Set.prototype.size', this); |
| 191 } | 189 } |
| 192 var table = %_JSCollectionGetTable(this); | 190 var table = %_JSCollectionGetTable(this); |
| 193 return ORDERED_HASH_TABLE_ELEMENT_COUNT(table); | 191 return ORDERED_HASH_TABLE_ELEMENT_COUNT(table); |
| 194 } | 192 } |
| 195 | 193 |
| 196 | 194 |
| 197 function SetClearJS() { | 195 function SetClearJS() { |
| 198 if (!IS_SET(this)) { | 196 if (!IS_SET(this)) { |
| 199 throw MakeTypeError('incompatible_method_receiver', | 197 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 200 ['Set.prototype.clear', this]); | 198 'Set.prototype.clear', this); |
| 201 } | 199 } |
| 202 %_SetClear(this); | 200 %_SetClear(this); |
| 203 } | 201 } |
| 204 | 202 |
| 205 | 203 |
| 206 function SetForEach(f, receiver) { | 204 function SetForEach(f, receiver) { |
| 207 if (!IS_SET(this)) { | 205 if (!IS_SET(this)) { |
| 208 throw MakeTypeError('incompatible_method_receiver', | 206 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 209 ['Set.prototype.forEach', this]); | 207 'Set.prototype.forEach', this); |
| 210 } | 208 } |
| 211 | 209 |
| 212 if (!IS_SPEC_FUNCTION(f)) { | 210 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f); |
| 213 throw MakeTypeError('called_non_callable', [f]); | |
| 214 } | |
| 215 var needs_wrapper = false; | 211 var needs_wrapper = false; |
| 216 if (IS_NULL_OR_UNDEFINED(receiver)) { | 212 if (IS_NULL_OR_UNDEFINED(receiver)) { |
| 217 receiver = %GetDefaultReceiver(f) || receiver; | 213 receiver = %GetDefaultReceiver(f) || receiver; |
| 218 } else { | 214 } else { |
| 219 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); | 215 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); |
| 220 } | 216 } |
| 221 | 217 |
| 222 var iterator = new SetIterator(this, ITERATOR_KIND_VALUES); | 218 var iterator = new SetIterator(this, ITERATOR_KIND_VALUES); |
| 223 var key; | 219 var key; |
| 224 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); | 220 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 function MapConstructor(iterable) { | 255 function MapConstructor(iterable) { |
| 260 if (!%_IsConstructCall()) { | 256 if (!%_IsConstructCall()) { |
| 261 throw MakeTypeError('constructor_not_function', ['Map']); | 257 throw MakeTypeError('constructor_not_function', ['Map']); |
| 262 } | 258 } |
| 263 | 259 |
| 264 %_MapInitialize(this); | 260 %_MapInitialize(this); |
| 265 | 261 |
| 266 if (!IS_NULL_OR_UNDEFINED(iterable)) { | 262 if (!IS_NULL_OR_UNDEFINED(iterable)) { |
| 267 var adder = this.set; | 263 var adder = this.set; |
| 268 if (!IS_SPEC_FUNCTION(adder)) { | 264 if (!IS_SPEC_FUNCTION(adder)) { |
| 269 throw MakeTypeError(kPropertyNotFunction, ['set', this]); | 265 throw MakeTypeError(kPropertyNotFunction, 'set', this); |
| 270 } | 266 } |
| 271 | 267 |
| 272 for (var nextItem of iterable) { | 268 for (var nextItem of iterable) { |
| 273 if (!IS_SPEC_OBJECT(nextItem)) { | 269 if (!IS_SPEC_OBJECT(nextItem)) { |
| 274 throw MakeTypeError('iterator_value_not_an_object', [nextItem]); | 270 throw MakeTypeError('iterator_value_not_an_object', [nextItem]); |
| 275 } | 271 } |
| 276 %_CallFunction(this, nextItem[0], nextItem[1], adder); | 272 %_CallFunction(this, nextItem[0], nextItem[1], adder); |
| 277 } | 273 } |
| 278 } | 274 } |
| 279 } | 275 } |
| 280 | 276 |
| 281 | 277 |
| 282 function MapGet(key) { | 278 function MapGet(key) { |
| 283 if (!IS_MAP(this)) { | 279 if (!IS_MAP(this)) { |
| 284 throw MakeTypeError('incompatible_method_receiver', | 280 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 285 ['Map.prototype.get', this]); | 281 'Map.prototype.get', this); |
| 286 } | 282 } |
| 287 var table = %_JSCollectionGetTable(this); | 283 var table = %_JSCollectionGetTable(this); |
| 288 var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); | 284 var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); |
| 289 var hash = GetHash(key); | 285 var hash = GetHash(key); |
| 290 var entry = MapFindEntry(table, numBuckets, key, hash); | 286 var entry = MapFindEntry(table, numBuckets, key, hash); |
| 291 if (entry === NOT_FOUND) return UNDEFINED; | 287 if (entry === NOT_FOUND) return UNDEFINED; |
| 292 return ORDERED_HASH_MAP_VALUE_AT(table, entry, numBuckets); | 288 return ORDERED_HASH_MAP_VALUE_AT(table, entry, numBuckets); |
| 293 } | 289 } |
| 294 | 290 |
| 295 | 291 |
| 296 function MapSet(key, value) { | 292 function MapSet(key, value) { |
| 297 if (!IS_MAP(this)) { | 293 if (!IS_MAP(this)) { |
| 298 throw MakeTypeError('incompatible_method_receiver', | 294 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 299 ['Map.prototype.set', this]); | 295 'Map.prototype.set', this); |
| 300 } | 296 } |
| 301 // Normalize -0 to +0 as required by the spec. | 297 // Normalize -0 to +0 as required by the spec. |
| 302 // Even though we use SameValueZero as the comparison for the keys we don't | 298 // Even though we use SameValueZero as the comparison for the keys we don't |
| 303 // want to ever store -0 as the key since the key is directly exposed when | 299 // want to ever store -0 as the key since the key is directly exposed when |
| 304 // doing iteration. | 300 // doing iteration. |
| 305 if (key === 0) { | 301 if (key === 0) { |
| 306 key = 0; | 302 key = 0; |
| 307 } | 303 } |
| 308 | 304 |
| 309 var table = %_JSCollectionGetTable(this); | 305 var table = %_JSCollectionGetTable(this); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 336 ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof + 1); | 332 ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof + 1); |
| 337 FIXED_ARRAY_SET(table, index, key); | 333 FIXED_ARRAY_SET(table, index, key); |
| 338 FIXED_ARRAY_SET(table, index + 1, value); | 334 FIXED_ARRAY_SET(table, index + 1, value); |
| 339 FIXED_ARRAY_SET(table, index + 2, chainEntry); | 335 FIXED_ARRAY_SET(table, index + 2, chainEntry); |
| 340 return this; | 336 return this; |
| 341 } | 337 } |
| 342 | 338 |
| 343 | 339 |
| 344 function MapHas(key) { | 340 function MapHas(key) { |
| 345 if (!IS_MAP(this)) { | 341 if (!IS_MAP(this)) { |
| 346 throw MakeTypeError('incompatible_method_receiver', | 342 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 347 ['Map.prototype.has', this]); | 343 'Map.prototype.has', this); |
| 348 } | 344 } |
| 349 var table = %_JSCollectionGetTable(this); | 345 var table = %_JSCollectionGetTable(this); |
| 350 var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); | 346 var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); |
| 351 var hash = GetHash(key); | 347 var hash = GetHash(key); |
| 352 return MapFindEntry(table, numBuckets, key, hash) !== NOT_FOUND; | 348 return MapFindEntry(table, numBuckets, key, hash) !== NOT_FOUND; |
| 353 } | 349 } |
| 354 | 350 |
| 355 | 351 |
| 356 function MapDelete(key) { | 352 function MapDelete(key) { |
| 357 if (!IS_MAP(this)) { | 353 if (!IS_MAP(this)) { |
| 358 throw MakeTypeError('incompatible_method_receiver', | 354 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 359 ['Map.prototype.delete', this]); | 355 'Map.prototype.delete', this); |
| 360 } | 356 } |
| 361 var table = %_JSCollectionGetTable(this); | 357 var table = %_JSCollectionGetTable(this); |
| 362 var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); | 358 var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); |
| 363 var hash = GetHash(key); | 359 var hash = GetHash(key); |
| 364 var entry = MapFindEntry(table, numBuckets, key, hash); | 360 var entry = MapFindEntry(table, numBuckets, key, hash); |
| 365 if (entry === NOT_FOUND) return false; | 361 if (entry === NOT_FOUND) return false; |
| 366 | 362 |
| 367 var nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table) - 1; | 363 var nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table) - 1; |
| 368 var nod = ORDERED_HASH_TABLE_DELETED_COUNT(table) + 1; | 364 var nod = ORDERED_HASH_TABLE_DELETED_COUNT(table) + 1; |
| 369 var index = ORDERED_HASH_MAP_ENTRY_TO_INDEX(entry, numBuckets); | 365 var index = ORDERED_HASH_MAP_ENTRY_TO_INDEX(entry, numBuckets); |
| 370 FIXED_ARRAY_SET(table, index, %_TheHole()); | 366 FIXED_ARRAY_SET(table, index, %_TheHole()); |
| 371 FIXED_ARRAY_SET(table, index + 1, %_TheHole()); | 367 FIXED_ARRAY_SET(table, index + 1, %_TheHole()); |
| 372 ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof); | 368 ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof); |
| 373 ORDERED_HASH_TABLE_SET_DELETED_COUNT(table, nod); | 369 ORDERED_HASH_TABLE_SET_DELETED_COUNT(table, nod); |
| 374 if (nof < (numBuckets >>> 1)) %MapShrink(this); | 370 if (nof < (numBuckets >>> 1)) %MapShrink(this); |
| 375 return true; | 371 return true; |
| 376 } | 372 } |
| 377 | 373 |
| 378 | 374 |
| 379 function MapGetSize() { | 375 function MapGetSize() { |
| 380 if (!IS_MAP(this)) { | 376 if (!IS_MAP(this)) { |
| 381 throw MakeTypeError('incompatible_method_receiver', | 377 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 382 ['Map.prototype.size', this]); | 378 'Map.prototype.size', this); |
| 383 } | 379 } |
| 384 var table = %_JSCollectionGetTable(this); | 380 var table = %_JSCollectionGetTable(this); |
| 385 return ORDERED_HASH_TABLE_ELEMENT_COUNT(table); | 381 return ORDERED_HASH_TABLE_ELEMENT_COUNT(table); |
| 386 } | 382 } |
| 387 | 383 |
| 388 | 384 |
| 389 function MapClearJS() { | 385 function MapClearJS() { |
| 390 if (!IS_MAP(this)) { | 386 if (!IS_MAP(this)) { |
| 391 throw MakeTypeError('incompatible_method_receiver', | 387 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 392 ['Map.prototype.clear', this]); | 388 'Map.prototype.clear', this); |
| 393 } | 389 } |
| 394 %_MapClear(this); | 390 %_MapClear(this); |
| 395 } | 391 } |
| 396 | 392 |
| 397 | 393 |
| 398 function MapForEach(f, receiver) { | 394 function MapForEach(f, receiver) { |
| 399 if (!IS_MAP(this)) { | 395 if (!IS_MAP(this)) { |
| 400 throw MakeTypeError('incompatible_method_receiver', | 396 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 401 ['Map.prototype.forEach', this]); | 397 'Map.prototype.forEach', this); |
| 402 } | 398 } |
| 403 | 399 |
| 404 if (!IS_SPEC_FUNCTION(f)) { | 400 if (!IS_SPEC_FUNCTION(f)) throw MakeTypeError(kCalledNonCallable, f); |
| 405 throw MakeTypeError('called_non_callable', [f]); | |
| 406 } | |
| 407 var needs_wrapper = false; | 401 var needs_wrapper = false; |
| 408 if (IS_NULL_OR_UNDEFINED(receiver)) { | 402 if (IS_NULL_OR_UNDEFINED(receiver)) { |
| 409 receiver = %GetDefaultReceiver(f) || receiver; | 403 receiver = %GetDefaultReceiver(f) || receiver; |
| 410 } else { | 404 } else { |
| 411 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); | 405 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); |
| 412 } | 406 } |
| 413 | 407 |
| 414 var iterator = new MapIterator(this, ITERATOR_KIND_ENTRIES); | 408 var iterator = new MapIterator(this, ITERATOR_KIND_ENTRIES); |
| 415 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); | 409 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); |
| 416 var value_array = [UNDEFINED, UNDEFINED]; | 410 var value_array = [UNDEFINED, UNDEFINED]; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 437 InstallFunctions(GlobalMap.prototype, DONT_ENUM, [ | 431 InstallFunctions(GlobalMap.prototype, DONT_ENUM, [ |
| 438 "get", MapGet, | 432 "get", MapGet, |
| 439 "set", MapSet, | 433 "set", MapSet, |
| 440 "has", MapHas, | 434 "has", MapHas, |
| 441 "delete", MapDelete, | 435 "delete", MapDelete, |
| 442 "clear", MapClearJS, | 436 "clear", MapClearJS, |
| 443 "forEach", MapForEach | 437 "forEach", MapForEach |
| 444 ]); | 438 ]); |
| 445 | 439 |
| 446 })(); | 440 })(); |
| OLD | NEW |