| 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 | 289 |
| 290 RUNTIME_FUNCTION(Runtime_MapIteratorNext) { | 290 RUNTIME_FUNCTION(Runtime_MapIteratorNext) { |
| 291 SealHandleScope shs(isolate); | 291 SealHandleScope shs(isolate); |
| 292 DCHECK(args.length() == 2); | 292 DCHECK(args.length() == 2); |
| 293 CONVERT_ARG_CHECKED(JSMapIterator, holder, 0); | 293 CONVERT_ARG_CHECKED(JSMapIterator, holder, 0); |
| 294 CONVERT_ARG_CHECKED(JSArray, value_array, 1); | 294 CONVERT_ARG_CHECKED(JSArray, value_array, 1); |
| 295 return holder->Next(value_array); | 295 return holder->Next(value_array); |
| 296 } | 296 } |
| 297 | 297 |
| 298 | 298 |
| 299 static Handle<JSWeakCollection> WeakCollectionInitialize( | 299 void Runtime::WeakCollectionInitialize( |
| 300 Isolate* isolate, Handle<JSWeakCollection> weak_collection) { | 300 Isolate* isolate, Handle<JSWeakCollection> weak_collection) { |
| 301 DCHECK(weak_collection->map()->inobject_properties() == 0); | 301 DCHECK(weak_collection->map()->inobject_properties() == 0); |
| 302 Handle<ObjectHashTable> table = ObjectHashTable::New(isolate, 0); | 302 Handle<ObjectHashTable> table = ObjectHashTable::New(isolate, 0); |
| 303 weak_collection->set_table(*table); | 303 weak_collection->set_table(*table); |
| 304 return weak_collection; | |
| 305 } | 304 } |
| 306 | 305 |
| 307 | 306 |
| 308 RUNTIME_FUNCTION(Runtime_WeakCollectionInitialize) { | 307 RUNTIME_FUNCTION(Runtime_WeakCollectionInitialize) { |
| 309 HandleScope scope(isolate); | 308 HandleScope scope(isolate); |
| 310 DCHECK(args.length() == 1); | 309 DCHECK(args.length() == 1); |
| 311 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 310 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| 312 return *WeakCollectionInitialize(isolate, weak_collection); | 311 Runtime::WeakCollectionInitialize(isolate, weak_collection); |
| 312 return *weak_collection; |
| 313 } | 313 } |
| 314 | 314 |
| 315 | 315 |
| 316 RUNTIME_FUNCTION(Runtime_WeakCollectionGet) { | 316 RUNTIME_FUNCTION(Runtime_WeakCollectionGet) { |
| 317 HandleScope scope(isolate); | 317 HandleScope scope(isolate); |
| 318 DCHECK(args.length() == 2); | 318 DCHECK(args.length() == 2); |
| 319 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 319 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| 320 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 320 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
| 321 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); | 321 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); |
| 322 Handle<ObjectHashTable> table( | 322 Handle<ObjectHashTable> table( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 334 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 334 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
| 335 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); | 335 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); |
| 336 Handle<ObjectHashTable> table( | 336 Handle<ObjectHashTable> table( |
| 337 ObjectHashTable::cast(weak_collection->table())); | 337 ObjectHashTable::cast(weak_collection->table())); |
| 338 RUNTIME_ASSERT(table->IsKey(*key)); | 338 RUNTIME_ASSERT(table->IsKey(*key)); |
| 339 Handle<Object> lookup(table->Lookup(key), isolate); | 339 Handle<Object> lookup(table->Lookup(key), isolate); |
| 340 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); | 340 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); |
| 341 } | 341 } |
| 342 | 342 |
| 343 | 343 |
| 344 bool Runtime::WeakCollectionDelete(Handle<JSWeakCollection> weak_collection, |
| 345 Handle<Object> key) { |
| 346 DCHECK(key->IsJSReceiver() || key->IsSymbol()); |
| 347 Handle<ObjectHashTable> table( |
| 348 ObjectHashTable::cast(weak_collection->table())); |
| 349 DCHECK(table->IsKey(*key)); |
| 350 bool was_present = false; |
| 351 Handle<ObjectHashTable> new_table = |
| 352 ObjectHashTable::Remove(table, key, &was_present); |
| 353 weak_collection->set_table(*new_table); |
| 354 if (*table != *new_table) { |
| 355 // Zap the old table since we didn't record slots for its elements. |
| 356 table->FillWithHoles(0, table->length()); |
| 357 } |
| 358 return was_present; |
| 359 } |
| 360 |
| 361 |
| 344 RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) { | 362 RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) { |
| 345 HandleScope scope(isolate); | 363 HandleScope scope(isolate); |
| 346 DCHECK(args.length() == 2); | 364 DCHECK(args.length() == 2); |
| 347 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 365 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| 348 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 366 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
| 349 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); | 367 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); |
| 350 Handle<ObjectHashTable> table( | 368 Handle<ObjectHashTable> table( |
| 351 ObjectHashTable::cast(weak_collection->table())); | 369 ObjectHashTable::cast(weak_collection->table())); |
| 352 RUNTIME_ASSERT(table->IsKey(*key)); | 370 RUNTIME_ASSERT(table->IsKey(*key)); |
| 353 bool was_present = false; | 371 bool was_present = Runtime::WeakCollectionDelete(weak_collection, key); |
| 354 Handle<ObjectHashTable> new_table = | 372 return isolate->heap()->ToBoolean(was_present); |
| 355 ObjectHashTable::Remove(table, key, &was_present); | 373 } |
| 374 |
| 375 |
| 376 void Runtime::WeakCollectionSet(Handle<JSWeakCollection> weak_collection, |
| 377 Handle<Object> key, Handle<Object> value) { |
| 378 DCHECK(key->IsJSReceiver() || key->IsSymbol()); |
| 379 Handle<ObjectHashTable> table( |
| 380 ObjectHashTable::cast(weak_collection->table())); |
| 381 DCHECK(table->IsKey(*key)); |
| 382 Handle<ObjectHashTable> new_table = ObjectHashTable::Put(table, key, value); |
| 356 weak_collection->set_table(*new_table); | 383 weak_collection->set_table(*new_table); |
| 357 if (*table != *new_table) { | 384 if (*table != *new_table) { |
| 358 // Zap the old table since we didn't record slots for its elements. | 385 // Zap the old table since we didn't record slots for its elements. |
| 359 table->FillWithHoles(0, table->length()); | 386 table->FillWithHoles(0, table->length()); |
| 360 } | 387 } |
| 361 return isolate->heap()->ToBoolean(was_present); | |
| 362 } | 388 } |
| 363 | 389 |
| 364 | 390 |
| 365 RUNTIME_FUNCTION(Runtime_WeakCollectionSet) { | 391 RUNTIME_FUNCTION(Runtime_WeakCollectionSet) { |
| 366 HandleScope scope(isolate); | 392 HandleScope scope(isolate); |
| 367 DCHECK(args.length() == 3); | 393 DCHECK(args.length() == 3); |
| 368 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 394 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| 369 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 395 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
| 370 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); | 396 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); |
| 371 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 397 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
| 372 Handle<ObjectHashTable> table( | 398 Handle<ObjectHashTable> table( |
| 373 ObjectHashTable::cast(weak_collection->table())); | 399 ObjectHashTable::cast(weak_collection->table())); |
| 374 RUNTIME_ASSERT(table->IsKey(*key)); | 400 RUNTIME_ASSERT(table->IsKey(*key)); |
| 375 Handle<ObjectHashTable> new_table = ObjectHashTable::Put(table, key, value); | 401 Runtime::WeakCollectionSet(weak_collection, key, value); |
| 376 weak_collection->set_table(*new_table); | |
| 377 if (*table != *new_table) { | |
| 378 // Zap the old table since we didn't record slots for its elements. | |
| 379 table->FillWithHoles(0, table->length()); | |
| 380 } | |
| 381 return *weak_collection; | 402 return *weak_collection; |
| 382 } | 403 } |
| 383 | 404 |
| 384 | 405 |
| 385 RUNTIME_FUNCTION(Runtime_GetWeakSetValues) { | 406 RUNTIME_FUNCTION(Runtime_GetWeakSetValues) { |
| 386 HandleScope scope(isolate); | 407 HandleScope scope(isolate); |
| 387 DCHECK(args.length() == 2); | 408 DCHECK(args.length() == 2); |
| 388 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0); | 409 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0); |
| 389 CONVERT_NUMBER_CHECKED(int, max_values, Int32, args[1]); | 410 CONVERT_NUMBER_CHECKED(int, max_values, Int32, args[1]); |
| 390 RUNTIME_ASSERT(max_values >= 0); | 411 RUNTIME_ASSERT(max_values >= 0); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 407 } | 428 } |
| 408 DCHECK_EQ(max_values, count); | 429 DCHECK_EQ(max_values, count); |
| 409 } | 430 } |
| 410 return *isolate->factory()->NewJSArrayWithElements(values); | 431 return *isolate->factory()->NewJSArrayWithElements(values); |
| 411 } | 432 } |
| 412 | 433 |
| 413 | 434 |
| 414 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { | 435 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { |
| 415 HandleScope scope(isolate); | 436 HandleScope scope(isolate); |
| 416 DCHECK(args.length() == 0); | 437 DCHECK(args.length() == 0); |
| 417 // TODO(adamk): Currently this runtime function is only called three times per | 438 Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap(); |
| 418 // isolate. If it's called more often, the map should be moved into the | 439 Runtime::WeakCollectionInitialize(isolate, weakmap); |
| 419 // strong root list. | 440 return *weakmap; |
| 420 Handle<Map> map = | |
| 421 isolate->factory()->NewMap(JS_WEAK_MAP_TYPE, JSWeakMap::kSize); | |
| 422 Handle<JSWeakMap> weakmap = | |
| 423 Handle<JSWeakMap>::cast(isolate->factory()->NewJSObjectFromMap(map)); | |
| 424 return *WeakCollectionInitialize(isolate, weakmap); | |
| 425 } | 441 } |
| 426 } | 442 } |
| 427 } // namespace v8::internal | 443 } // namespace v8::internal |
| OLD | NEW |