| 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/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
| 6 | 6 |
| 7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
| 8 #include "src/conversions-inl.h" | 8 #include "src/conversions-inl.h" |
| 9 #include "src/factory.h" | 9 #include "src/factory.h" |
| 10 | 10 |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 | 264 |
| 265 RUNTIME_FUNCTION(Runtime_MapIteratorNext) { | 265 RUNTIME_FUNCTION(Runtime_MapIteratorNext) { |
| 266 SealHandleScope shs(isolate); | 266 SealHandleScope shs(isolate); |
| 267 DCHECK(args.length() == 2); | 267 DCHECK(args.length() == 2); |
| 268 CONVERT_ARG_CHECKED(JSMapIterator, holder, 0); | 268 CONVERT_ARG_CHECKED(JSMapIterator, holder, 0); |
| 269 CONVERT_ARG_CHECKED(JSArray, value_array, 1); | 269 CONVERT_ARG_CHECKED(JSArray, value_array, 1); |
| 270 return holder->Next(value_array); | 270 return holder->Next(value_array); |
| 271 } | 271 } |
| 272 | 272 |
| 273 | 273 |
| 274 void Runtime::WeakCollectionInitialize( | |
| 275 Isolate* isolate, Handle<JSWeakCollection> weak_collection) { | |
| 276 DCHECK_EQ(0, weak_collection->map()->GetInObjectProperties()); | |
| 277 Handle<ObjectHashTable> table = ObjectHashTable::New(isolate, 0); | |
| 278 weak_collection->set_table(*table); | |
| 279 } | |
| 280 | |
| 281 | |
| 282 RUNTIME_FUNCTION(Runtime_WeakCollectionInitialize) { | 274 RUNTIME_FUNCTION(Runtime_WeakCollectionInitialize) { |
| 283 HandleScope scope(isolate); | 275 HandleScope scope(isolate); |
| 284 DCHECK(args.length() == 1); | 276 DCHECK(args.length() == 1); |
| 285 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 277 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| 286 Runtime::WeakCollectionInitialize(isolate, weak_collection); | 278 JSWeakCollection::Initialize(weak_collection, isolate); |
| 287 return *weak_collection; | 279 return *weak_collection; |
| 288 } | 280 } |
| 289 | 281 |
| 290 | 282 |
| 291 RUNTIME_FUNCTION(Runtime_WeakCollectionGet) { | 283 RUNTIME_FUNCTION(Runtime_WeakCollectionGet) { |
| 292 HandleScope scope(isolate); | 284 HandleScope scope(isolate); |
| 293 DCHECK(args.length() == 3); | 285 DCHECK(args.length() == 3); |
| 294 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 286 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| 295 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 287 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
| 296 CONVERT_SMI_ARG_CHECKED(hash, 2) | 288 CONVERT_SMI_ARG_CHECKED(hash, 2) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 311 CONVERT_SMI_ARG_CHECKED(hash, 2) | 303 CONVERT_SMI_ARG_CHECKED(hash, 2) |
| 312 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); | 304 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); |
| 313 Handle<ObjectHashTable> table( | 305 Handle<ObjectHashTable> table( |
| 314 ObjectHashTable::cast(weak_collection->table())); | 306 ObjectHashTable::cast(weak_collection->table())); |
| 315 RUNTIME_ASSERT(table->IsKey(*key)); | 307 RUNTIME_ASSERT(table->IsKey(*key)); |
| 316 Handle<Object> lookup(table->Lookup(key, hash), isolate); | 308 Handle<Object> lookup(table->Lookup(key, hash), isolate); |
| 317 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); | 309 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); |
| 318 } | 310 } |
| 319 | 311 |
| 320 | 312 |
| 321 bool Runtime::WeakCollectionDelete(Handle<JSWeakCollection> weak_collection, | |
| 322 Handle<Object> key) { | |
| 323 int32_t hash = | |
| 324 Object::GetOrCreateHash(weak_collection->GetIsolate(), key)->value(); | |
| 325 return WeakCollectionDelete(weak_collection, key, hash); | |
| 326 } | |
| 327 | |
| 328 | |
| 329 bool Runtime::WeakCollectionDelete(Handle<JSWeakCollection> weak_collection, | |
| 330 Handle<Object> key, int32_t hash) { | |
| 331 DCHECK(key->IsJSReceiver() || key->IsSymbol()); | |
| 332 Handle<ObjectHashTable> table( | |
| 333 ObjectHashTable::cast(weak_collection->table())); | |
| 334 DCHECK(table->IsKey(*key)); | |
| 335 bool was_present = false; | |
| 336 Handle<ObjectHashTable> new_table = | |
| 337 ObjectHashTable::Remove(table, key, &was_present, hash); | |
| 338 weak_collection->set_table(*new_table); | |
| 339 if (*table != *new_table) { | |
| 340 // Zap the old table since we didn't record slots for its elements. | |
| 341 table->FillWithHoles(0, table->length()); | |
| 342 } | |
| 343 return was_present; | |
| 344 } | |
| 345 | |
| 346 | |
| 347 RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) { | 313 RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) { |
| 348 HandleScope scope(isolate); | 314 HandleScope scope(isolate); |
| 349 DCHECK(args.length() == 3); | 315 DCHECK(args.length() == 3); |
| 350 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 316 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| 351 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 317 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
| 352 CONVERT_SMI_ARG_CHECKED(hash, 2) | 318 CONVERT_SMI_ARG_CHECKED(hash, 2) |
| 353 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); | 319 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); |
| 354 Handle<ObjectHashTable> table( | 320 Handle<ObjectHashTable> table( |
| 355 ObjectHashTable::cast(weak_collection->table())); | 321 ObjectHashTable::cast(weak_collection->table())); |
| 356 RUNTIME_ASSERT(table->IsKey(*key)); | 322 RUNTIME_ASSERT(table->IsKey(*key)); |
| 357 bool was_present = Runtime::WeakCollectionDelete(weak_collection, key, hash); | 323 bool was_present = JSWeakCollection::Delete(weak_collection, key, hash); |
| 358 return isolate->heap()->ToBoolean(was_present); | 324 return isolate->heap()->ToBoolean(was_present); |
| 359 } | 325 } |
| 360 | 326 |
| 361 | 327 |
| 362 void Runtime::WeakCollectionSet(Handle<JSWeakCollection> weak_collection, | |
| 363 Handle<Object> key, Handle<Object> value, | |
| 364 int32_t hash) { | |
| 365 DCHECK(key->IsJSReceiver() || key->IsSymbol()); | |
| 366 Handle<ObjectHashTable> table( | |
| 367 ObjectHashTable::cast(weak_collection->table())); | |
| 368 DCHECK(table->IsKey(*key)); | |
| 369 Handle<ObjectHashTable> new_table = | |
| 370 ObjectHashTable::Put(table, key, value, hash); | |
| 371 weak_collection->set_table(*new_table); | |
| 372 if (*table != *new_table) { | |
| 373 // Zap the old table since we didn't record slots for its elements. | |
| 374 table->FillWithHoles(0, table->length()); | |
| 375 } | |
| 376 } | |
| 377 | |
| 378 | |
| 379 RUNTIME_FUNCTION(Runtime_WeakCollectionSet) { | 328 RUNTIME_FUNCTION(Runtime_WeakCollectionSet) { |
| 380 HandleScope scope(isolate); | 329 HandleScope scope(isolate); |
| 381 DCHECK(args.length() == 4); | 330 DCHECK(args.length() == 4); |
| 382 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); | 331 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| 383 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 332 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
| 384 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); | 333 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); |
| 385 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 334 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
| 386 CONVERT_SMI_ARG_CHECKED(hash, 3) | 335 CONVERT_SMI_ARG_CHECKED(hash, 3) |
| 387 Handle<ObjectHashTable> table( | 336 Handle<ObjectHashTable> table( |
| 388 ObjectHashTable::cast(weak_collection->table())); | 337 ObjectHashTable::cast(weak_collection->table())); |
| 389 RUNTIME_ASSERT(table->IsKey(*key)); | 338 RUNTIME_ASSERT(table->IsKey(*key)); |
| 390 Runtime::WeakCollectionSet(weak_collection, key, value, hash); | 339 JSWeakCollection::Set(weak_collection, key, value, hash); |
| 391 return *weak_collection; | 340 return *weak_collection; |
| 392 } | 341 } |
| 393 | 342 |
| 394 | 343 |
| 395 RUNTIME_FUNCTION(Runtime_GetWeakSetValues) { | 344 RUNTIME_FUNCTION(Runtime_GetWeakSetValues) { |
| 396 HandleScope scope(isolate); | 345 HandleScope scope(isolate); |
| 397 DCHECK(args.length() == 2); | 346 DCHECK(args.length() == 2); |
| 398 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0); | 347 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0); |
| 399 CONVERT_NUMBER_CHECKED(int, max_values, Int32, args[1]); | 348 CONVERT_NUMBER_CHECKED(int, max_values, Int32, args[1]); |
| 400 RUNTIME_ASSERT(max_values >= 0); | 349 RUNTIME_ASSERT(max_values >= 0); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 418 DCHECK_EQ(max_values, count); | 367 DCHECK_EQ(max_values, count); |
| 419 } | 368 } |
| 420 return *isolate->factory()->NewJSArrayWithElements(values); | 369 return *isolate->factory()->NewJSArrayWithElements(values); |
| 421 } | 370 } |
| 422 | 371 |
| 423 | 372 |
| 424 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { | 373 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { |
| 425 HandleScope scope(isolate); | 374 HandleScope scope(isolate); |
| 426 DCHECK(args.length() == 0); | 375 DCHECK(args.length() == 0); |
| 427 Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap(); | 376 Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap(); |
| 428 Runtime::WeakCollectionInitialize(isolate, weakmap); | 377 JSWeakCollection::Initialize(weakmap, isolate); |
| 429 return *weakmap; | 378 return *weakmap; |
| 430 } | 379 } |
| 431 } // namespace internal | 380 } // namespace internal |
| 432 } // namespace v8 | 381 } // namespace v8 |
| OLD | NEW |