From ee06ac7528b20b9b1c33f1a960322eb4dc7e9c0d Mon Sep 17 00:00:00 2001 From: Kyle Farnung Date: Fri, 25 Aug 2017 18:28:49 -0700 Subject: [PATCH 1/2] Adding test case for weak refs of tagged ints --- bin/NativeTests/JsRTApiTest.cpp | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/bin/NativeTests/JsRTApiTest.cpp b/bin/NativeTests/JsRTApiTest.cpp index e022f7908c4..6781dc5248f 100644 --- a/bin/NativeTests/JsRTApiTest.cpp +++ b/bin/NativeTests/JsRTApiTest.cpp @@ -133,6 +133,40 @@ namespace JsRTApiTest JsRTApiTest::RunWithAttributes(JsRTApiTest::WeakReferenceTest); } + void WeakReferenceTaggedIntTest(JsRuntimeAttributes attributes, JsRuntimeHandle runtime) + { + JsValueRef valueRef = JS_INVALID_REFERENCE; + REQUIRE(JsIntToNumber(25, &valueRef) == JsNoError); + + JsWeakRef weakRef = JS_INVALID_REFERENCE; + REQUIRE(JsCreateWeakReference(valueRef, &weakRef) == JsNoError); + + // JsGetWeakReferenceValue should return the original value reference. + JsValueRef valueRefFromWeakRef = JS_INVALID_REFERENCE; + CHECK(JsGetWeakReferenceValue(weakRef, &valueRefFromWeakRef) == JsNoError); + CHECK(valueRefFromWeakRef != JS_INVALID_REFERENCE); + CHECK(valueRefFromWeakRef == valueRef); + + // Clear the references on the stack, so that the value will be GC'd. + valueRef = JS_INVALID_REFERENCE; + valueRefFromWeakRef = JS_INVALID_REFERENCE; + + CHECK(JsCollectGarbage(runtime) == JsNoError); + + // JsGetWeakReferenceValue should return the value even after a GC since + // it's not heap allocated. + REQUIRE(JsIntToNumber(25, &valueRef) == JsNoError); + + JsValueRef valueRefAfterGC = JS_INVALID_REFERENCE; + CHECK(JsGetWeakReferenceValue(weakRef, &valueRefAfterGC) == JsNoError); + CHECK(valueRefAfterGC == valueRef); + } + + TEST_CASE("ApiTest_WeakReferenceTaggedIntTest", "[ApiTest]") + { + JsRTApiTest::RunWithAttributes(JsRTApiTest::WeakReferenceTaggedIntTest); + } + void ObjectsAndPropertiesTest1(JsRuntimeAttributes attributes, JsRuntimeHandle runtime) { JsValueRef object = JS_INVALID_REFERENCE; From 9d3966766eccec54b681f1a81f140192e670b62f Mon Sep 17 00:00:00 2001 From: Kyle Farnung Date: Fri, 25 Aug 2017 18:56:11 -0700 Subject: [PATCH 2/2] Allow strongRefHeapBlock to be nullptr --- lib/Common/Memory/Recycler.cpp | 3 ++- lib/Common/Memory/RecyclerWeakReference.h | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Common/Memory/Recycler.cpp b/lib/Common/Memory/Recycler.cpp index 7bc461be633..bd59cf7005c 100644 --- a/lib/Common/Memory/Recycler.cpp +++ b/lib/Common/Memory/Recycler.cpp @@ -3118,7 +3118,8 @@ Recycler::SweepWeakReference() return false; } - if (!weakRef->strongRefHeapBlock->TestObjectMarkedBit(weakRef->strongRef)) + if (weakRef->strongRefHeapBlock != nullptr && + !weakRef->strongRefHeapBlock->TestObjectMarkedBit(weakRef->strongRef)) { hasCleanup = true; weakRef->strongRef = nullptr; diff --git a/lib/Common/Memory/RecyclerWeakReference.h b/lib/Common/Memory/RecyclerWeakReference.h index 210aadf222f..db9dd3b9807 100644 --- a/lib/Common/Memory/RecyclerWeakReference.h +++ b/lib/Common/Memory/RecyclerWeakReference.h @@ -346,7 +346,6 @@ class WeakReferenceHashTable entry = AllocatorNewBase(Recycler, recycler, AllocWeakReferenceEntry, RecyclerWeakReferenceBase); entry->strongRef = strongReference; entry->strongRefHeapBlock = recycler->FindHeapBlock(strongReference); - Assert(entry->strongRefHeapBlock != nullptr); HeapBlock * weakRefHeapBlock = recycler->FindHeapBlock(entry); Assert(!weakRefHeapBlock->IsLargeHeapBlock() || ((LargeHeapBlock*)weakRefHeapBlock)->InPageHeapMode());