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 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0); | 259 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0); |
260 CONVERT_NUMBER_CHECKED(int, max_entries, Int32, args[1]); | 260 CONVERT_NUMBER_CHECKED(int, max_entries, Int32, args[1]); |
261 RUNTIME_ASSERT(max_entries >= 0); | 261 RUNTIME_ASSERT(max_entries >= 0); |
262 | 262 |
263 Handle<ObjectHashTable> table(ObjectHashTable::cast(holder->table())); | 263 Handle<ObjectHashTable> table(ObjectHashTable::cast(holder->table())); |
264 if (max_entries == 0 || max_entries > table->NumberOfElements()) { | 264 if (max_entries == 0 || max_entries > table->NumberOfElements()) { |
265 max_entries = table->NumberOfElements(); | 265 max_entries = table->NumberOfElements(); |
266 } | 266 } |
267 Handle<FixedArray> entries = | 267 Handle<FixedArray> entries = |
268 isolate->factory()->NewFixedArray(max_entries * 2); | 268 isolate->factory()->NewFixedArray(max_entries * 2); |
| 269 // Allocation can cause GC can delete weak elements. Reload. |
| 270 if (max_entries > table->NumberOfElements()) { |
| 271 max_entries = table->NumberOfElements(); |
| 272 } |
| 273 |
269 { | 274 { |
270 DisallowHeapAllocation no_gc; | 275 DisallowHeapAllocation no_gc; |
271 int count = 0; | 276 int count = 0; |
272 for (int i = 0; count / 2 < max_entries && i < table->Capacity(); i++) { | 277 for (int i = 0; count / 2 < max_entries && i < table->Capacity(); i++) { |
273 Handle<Object> key(table->KeyAt(i), isolate); | 278 Handle<Object> key(table->KeyAt(i), isolate); |
274 if (table->IsKey(*key)) { | 279 if (table->IsKey(*key)) { |
275 entries->set(count++, *key); | 280 entries->set(count++, *key); |
276 Object* value = table->Lookup(key); | 281 Object* value = table->Lookup(key); |
277 entries->set(count++, value); | 282 entries->set(count++, value); |
278 } | 283 } |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 | 435 |
431 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { | 436 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { |
432 HandleScope scope(isolate); | 437 HandleScope scope(isolate); |
433 DCHECK(args.length() == 0); | 438 DCHECK(args.length() == 0); |
434 Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap(); | 439 Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap(); |
435 Runtime::WeakCollectionInitialize(isolate, weakmap); | 440 Runtime::WeakCollectionInitialize(isolate, weakmap); |
436 return *weakmap; | 441 return *weakmap; |
437 } | 442 } |
438 } | 443 } |
439 } // namespace v8::internal | 444 } // namespace v8::internal |
OLD | NEW |