| OLD | NEW |
| 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 |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 HandleScope scope(isolate); | 289 HandleScope scope(isolate); |
| 290 DCHECK(args.length() == 1); | 290 DCHECK(args.length() == 1); |
| 291 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 291 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| 292 Runtime::WeakCollectionInitialize(isolate, weak_collection); | 292 Runtime::WeakCollectionInitialize(isolate, weak_collection); |
| 293 return *weak_collection; | 293 return *weak_collection; |
| 294 } | 294 } |
| 295 | 295 |
| 296 | 296 |
| 297 RUNTIME_FUNCTION(Runtime_WeakCollectionGet) { | 297 RUNTIME_FUNCTION(Runtime_WeakCollectionGet) { |
| 298 HandleScope scope(isolate); | 298 HandleScope scope(isolate); |
| 299 DCHECK(args.length() == 2); | 299 DCHECK(args.length() == 3); |
| 300 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 300 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| 301 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 301 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
| 302 CONVERT_SMI_ARG_CHECKED(hash, 2) |
| 302 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); | 303 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); |
| 303 Handle<ObjectHashTable> table( | 304 Handle<ObjectHashTable> table( |
| 304 ObjectHashTable::cast(weak_collection->table())); | 305 ObjectHashTable::cast(weak_collection->table())); |
| 305 RUNTIME_ASSERT(table->IsKey(*key)); | 306 RUNTIME_ASSERT(table->IsKey(*key)); |
| 306 Handle<Object> lookup(table->Lookup(key), isolate); | 307 Handle<Object> lookup(table->Lookup(key, hash), isolate); |
| 307 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; | 308 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; |
| 308 } | 309 } |
| 309 | 310 |
| 310 | 311 |
| 311 RUNTIME_FUNCTION(Runtime_WeakCollectionHas) { | 312 RUNTIME_FUNCTION(Runtime_WeakCollectionHas) { |
| 312 HandleScope scope(isolate); | 313 HandleScope scope(isolate); |
| 313 DCHECK(args.length() == 2); | 314 DCHECK(args.length() == 3); |
| 314 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 315 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| 315 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 316 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
| 317 CONVERT_SMI_ARG_CHECKED(hash, 2) |
| 316 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); | 318 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); |
| 317 Handle<ObjectHashTable> table( | 319 Handle<ObjectHashTable> table( |
| 318 ObjectHashTable::cast(weak_collection->table())); | 320 ObjectHashTable::cast(weak_collection->table())); |
| 319 RUNTIME_ASSERT(table->IsKey(*key)); | 321 RUNTIME_ASSERT(table->IsKey(*key)); |
| 320 Handle<Object> lookup(table->Lookup(key), isolate); | 322 Handle<Object> lookup(table->Lookup(key, hash), isolate); |
| 321 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); | 323 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); |
| 322 } | 324 } |
| 323 | 325 |
| 324 | 326 |
| 325 bool Runtime::WeakCollectionDelete(Handle<JSWeakCollection> weak_collection, | 327 bool Runtime::WeakCollectionDelete(Handle<JSWeakCollection> weak_collection, |
| 326 Handle<Object> key) { | 328 Handle<Object> key) { |
| 329 int32_t hash = |
| 330 Object::GetOrCreateHash(weak_collection->GetIsolate(), key)->value(); |
| 331 return WeakCollectionDelete(weak_collection, key, hash); |
| 332 } |
| 333 |
| 334 |
| 335 bool Runtime::WeakCollectionDelete(Handle<JSWeakCollection> weak_collection, |
| 336 Handle<Object> key, int32_t hash) { |
| 327 DCHECK(key->IsJSReceiver() || key->IsSymbol()); | 337 DCHECK(key->IsJSReceiver() || key->IsSymbol()); |
| 328 Handle<ObjectHashTable> table( | 338 Handle<ObjectHashTable> table( |
| 329 ObjectHashTable::cast(weak_collection->table())); | 339 ObjectHashTable::cast(weak_collection->table())); |
| 330 DCHECK(table->IsKey(*key)); | 340 DCHECK(table->IsKey(*key)); |
| 331 bool was_present = false; | 341 bool was_present = false; |
| 332 Handle<ObjectHashTable> new_table = | 342 Handle<ObjectHashTable> new_table = |
| 333 ObjectHashTable::Remove(table, key, &was_present); | 343 ObjectHashTable::Remove(table, key, &was_present, hash); |
| 334 weak_collection->set_table(*new_table); | 344 weak_collection->set_table(*new_table); |
| 335 if (*table != *new_table) { | 345 if (*table != *new_table) { |
| 336 // Zap the old table since we didn't record slots for its elements. | 346 // Zap the old table since we didn't record slots for its elements. |
| 337 table->FillWithHoles(0, table->length()); | 347 table->FillWithHoles(0, table->length()); |
| 338 } | 348 } |
| 339 return was_present; | 349 return was_present; |
| 340 } | 350 } |
| 341 | 351 |
| 342 | 352 |
| 343 RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) { | 353 RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) { |
| 344 HandleScope scope(isolate); | 354 HandleScope scope(isolate); |
| 345 DCHECK(args.length() == 2); | 355 DCHECK(args.length() == 3); |
| 346 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 356 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| 347 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 357 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
| 358 CONVERT_SMI_ARG_CHECKED(hash, 2) |
| 348 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); | 359 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); |
| 349 Handle<ObjectHashTable> table( | 360 Handle<ObjectHashTable> table( |
| 350 ObjectHashTable::cast(weak_collection->table())); | 361 ObjectHashTable::cast(weak_collection->table())); |
| 351 RUNTIME_ASSERT(table->IsKey(*key)); | 362 RUNTIME_ASSERT(table->IsKey(*key)); |
| 352 bool was_present = Runtime::WeakCollectionDelete(weak_collection, key); | 363 bool was_present = Runtime::WeakCollectionDelete(weak_collection, key, hash); |
| 353 return isolate->heap()->ToBoolean(was_present); | 364 return isolate->heap()->ToBoolean(was_present); |
| 354 } | 365 } |
| 355 | 366 |
| 356 | 367 |
| 357 void Runtime::WeakCollectionSet(Handle<JSWeakCollection> weak_collection, | 368 void Runtime::WeakCollectionSet(Handle<JSWeakCollection> weak_collection, |
| 358 Handle<Object> key, Handle<Object> value) { | 369 Handle<Object> key, Handle<Object> value, |
| 370 int32_t hash) { |
| 359 DCHECK(key->IsJSReceiver() || key->IsSymbol()); | 371 DCHECK(key->IsJSReceiver() || key->IsSymbol()); |
| 360 Handle<ObjectHashTable> table( | 372 Handle<ObjectHashTable> table( |
| 361 ObjectHashTable::cast(weak_collection->table())); | 373 ObjectHashTable::cast(weak_collection->table())); |
| 362 DCHECK(table->IsKey(*key)); | 374 DCHECK(table->IsKey(*key)); |
| 363 Handle<ObjectHashTable> new_table = ObjectHashTable::Put(table, key, value); | 375 Handle<ObjectHashTable> new_table = |
| 376 ObjectHashTable::Put(table, key, value, hash); |
| 364 weak_collection->set_table(*new_table); | 377 weak_collection->set_table(*new_table); |
| 365 if (*table != *new_table) { | 378 if (*table != *new_table) { |
| 366 // Zap the old table since we didn't record slots for its elements. | 379 // Zap the old table since we didn't record slots for its elements. |
| 367 table->FillWithHoles(0, table->length()); | 380 table->FillWithHoles(0, table->length()); |
| 368 } | 381 } |
| 369 } | 382 } |
| 370 | 383 |
| 371 | 384 |
| 372 RUNTIME_FUNCTION(Runtime_WeakCollectionSet) { | 385 RUNTIME_FUNCTION(Runtime_WeakCollectionSet) { |
| 373 HandleScope scope(isolate); | 386 HandleScope scope(isolate); |
| 374 DCHECK(args.length() == 3); | 387 DCHECK(args.length() == 4); |
| 375 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 388 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| 376 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 389 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
| 377 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); | 390 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); |
| 378 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 391 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
| 392 CONVERT_SMI_ARG_CHECKED(hash, 3) |
| 379 Handle<ObjectHashTable> table( | 393 Handle<ObjectHashTable> table( |
| 380 ObjectHashTable::cast(weak_collection->table())); | 394 ObjectHashTable::cast(weak_collection->table())); |
| 381 RUNTIME_ASSERT(table->IsKey(*key)); | 395 RUNTIME_ASSERT(table->IsKey(*key)); |
| 382 Runtime::WeakCollectionSet(weak_collection, key, value); | 396 Runtime::WeakCollectionSet(weak_collection, key, value, hash); |
| 383 return *weak_collection; | 397 return *weak_collection; |
| 384 } | 398 } |
| 385 | 399 |
| 386 | 400 |
| 387 RUNTIME_FUNCTION(Runtime_GetWeakSetValues) { | 401 RUNTIME_FUNCTION(Runtime_GetWeakSetValues) { |
| 388 HandleScope scope(isolate); | 402 HandleScope scope(isolate); |
| 389 DCHECK(args.length() == 2); | 403 DCHECK(args.length() == 2); |
| 390 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0); | 404 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0); |
| 391 CONVERT_NUMBER_CHECKED(int, max_values, Int32, args[1]); | 405 CONVERT_NUMBER_CHECKED(int, max_values, Int32, args[1]); |
| 392 RUNTIME_ASSERT(max_values >= 0); | 406 RUNTIME_ASSERT(max_values >= 0); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 415 | 429 |
| 416 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { | 430 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { |
| 417 HandleScope scope(isolate); | 431 HandleScope scope(isolate); |
| 418 DCHECK(args.length() == 0); | 432 DCHECK(args.length() == 0); |
| 419 Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap(); | 433 Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap(); |
| 420 Runtime::WeakCollectionInitialize(isolate, weakmap); | 434 Runtime::WeakCollectionInitialize(isolate, weakmap); |
| 421 return *weakmap; | 435 return *weakmap; |
| 422 } | 436 } |
| 423 } // namespace internal | 437 } // namespace internal |
| 424 } // namespace v8 | 438 } // namespace v8 |
| OLD | NEW |