OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 7451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7462 v8::V8::RemoveMessageListeners(MissingScriptInfoMessageListener); | 7462 v8::V8::RemoveMessageListeners(MissingScriptInfoMessageListener); |
7463 } | 7463 } |
7464 | 7464 |
7465 | 7465 |
7466 struct FlagAndPersistent { | 7466 struct FlagAndPersistent { |
7467 bool flag; | 7467 bool flag; |
7468 v8::Persistent<v8::Object> handle; | 7468 v8::Persistent<v8::Object> handle; |
7469 }; | 7469 }; |
7470 | 7470 |
7471 | 7471 |
7472 static void DisposeAndSetFlag( | 7472 static void SetFlag( |
7473 const v8::WeakCallbackData<v8::Object, FlagAndPersistent>& data) { | 7473 const v8::WeakCallbackData<v8::Object, FlagAndPersistent>& data) { |
7474 data.GetParameter()->handle.Reset(); | |
7475 data.GetParameter()->flag = true; | 7474 data.GetParameter()->flag = true; |
7476 } | 7475 } |
7477 | 7476 |
7478 | 7477 |
7479 THREADED_TEST(IndependentWeakHandle) { | 7478 static void IndependentWeakHandle(bool global_gc, bool interlinked) { |
7480 v8::Isolate* iso = CcTest::isolate(); | 7479 v8::Isolate* iso = CcTest::isolate(); |
7481 v8::HandleScope scope(iso); | 7480 v8::HandleScope scope(iso); |
7482 v8::Handle<Context> context = Context::New(iso); | 7481 v8::Handle<Context> context = Context::New(iso); |
7483 Context::Scope context_scope(context); | 7482 Context::Scope context_scope(context); |
7484 | 7483 |
7485 FlagAndPersistent object_a, object_b; | 7484 FlagAndPersistent object_a, object_b; |
7486 | 7485 |
| 7486 intptr_t big_heap_size; |
| 7487 |
7487 { | 7488 { |
7488 v8::HandleScope handle_scope(iso); | 7489 v8::HandleScope handle_scope(iso); |
7489 object_a.handle.Reset(iso, v8::Object::New(iso)); | 7490 Local<Object> a(v8::Object::New(iso)); |
7490 object_b.handle.Reset(iso, v8::Object::New(iso)); | 7491 Local<Object> b(v8::Object::New(iso)); |
| 7492 object_a.handle.Reset(iso, a); |
| 7493 object_b.handle.Reset(iso, b); |
| 7494 if (interlinked) { |
| 7495 a->Set(v8_str("x"), b); |
| 7496 b->Set(v8_str("x"), a); |
| 7497 } |
| 7498 if (global_gc) { |
| 7499 CcTest::heap()->CollectAllGarbage(TestHeap::Heap::kNoGCFlags); |
| 7500 } else { |
| 7501 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
| 7502 } |
| 7503 // We are relying on this creating a big flag array and reserving the space |
| 7504 // up front. |
| 7505 v8::Handle<Value> big_array = CompileRun("new Array(50000)"); |
| 7506 a->Set(v8_str("y"), big_array); |
| 7507 big_heap_size = CcTest::heap()->SizeOfObjects(); |
7491 } | 7508 } |
7492 | 7509 |
7493 object_a.flag = false; | 7510 object_a.flag = false; |
7494 object_b.flag = false; | 7511 object_b.flag = false; |
7495 object_a.handle.SetWeak(&object_a, &DisposeAndSetFlag); | 7512 object_a.handle.SetPhantom(&object_a, &SetFlag); |
7496 object_b.handle.SetWeak(&object_b, &DisposeAndSetFlag); | 7513 object_b.handle.SetPhantom(&object_b, &SetFlag); |
7497 CHECK(!object_b.handle.IsIndependent()); | 7514 CHECK(!object_b.handle.IsIndependent()); |
7498 object_a.handle.MarkIndependent(); | 7515 object_a.handle.MarkIndependent(); |
7499 object_b.handle.MarkIndependent(); | 7516 object_b.handle.MarkIndependent(); |
7500 CHECK(object_b.handle.IsIndependent()); | 7517 CHECK(object_b.handle.IsIndependent()); |
7501 CcTest::heap()->CollectGarbage(i::NEW_SPACE); | 7518 if (global_gc) { |
| 7519 CcTest::heap()->CollectAllGarbage(TestHeap::Heap::kNoGCFlags); |
| 7520 } else { |
| 7521 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
| 7522 } |
| 7523 // A single GC should be enough to reclaim the memory, since we are using |
| 7524 // phantom handles. |
| 7525 CHECK_LT(CcTest::heap()->SizeOfObjects(), big_heap_size - 200000); |
7502 CHECK(object_a.flag); | 7526 CHECK(object_a.flag); |
7503 CHECK(object_b.flag); | 7527 CHECK(object_b.flag); |
7504 } | 7528 } |
7505 | 7529 |
7506 | 7530 |
| 7531 THREADED_TEST(IndependentWeakHandle) { |
| 7532 IndependentWeakHandle(false, false); |
| 7533 IndependentWeakHandle(false, true); |
| 7534 IndependentWeakHandle(true, false); |
| 7535 IndependentWeakHandle(true, true); |
| 7536 } |
| 7537 |
| 7538 |
7507 static void InvokeScavenge() { | 7539 static void InvokeScavenge() { |
7508 CcTest::heap()->CollectGarbage(i::NEW_SPACE); | 7540 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
7509 } | 7541 } |
7510 | 7542 |
7511 | 7543 |
7512 static void InvokeMarkSweep() { | 7544 static void InvokeMarkSweep() { |
7513 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 7545 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); |
7514 } | 7546 } |
7515 | 7547 |
7516 | 7548 |
(...skipping 16468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
23985 char chunk2[] = | 24017 char chunk2[] = |
23986 "XX\xec\x92\x81r = 13;\n" | 24018 "XX\xec\x92\x81r = 13;\n" |
23987 " return foob\xec\x92\x81\xec\x92\x81r;\n" | 24019 " return foob\xec\x92\x81\xec\x92\x81r;\n" |
23988 "}\n"; | 24020 "}\n"; |
23989 chunk1[strlen(chunk1) - 1] = reference[0]; | 24021 chunk1[strlen(chunk1) - 1] = reference[0]; |
23990 chunk2[0] = reference[1]; | 24022 chunk2[0] = reference[1]; |
23991 chunk2[1] = reference[2]; | 24023 chunk2[1] = reference[2]; |
23992 const char* chunks[] = {chunk1, chunk2, "foo();", NULL}; | 24024 const char* chunks[] = {chunk1, chunk2, "foo();", NULL}; |
23993 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8); | 24025 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8); |
23994 } | 24026 } |
OLD | NEW |