@@ -335,7 +335,7 @@ void ObjectManager::JSObjectWeakCallback(Isolate *isolate, ObjectWeakCallbackSta
335335 }
336336 else
337337 {
338- m_implObjStrong.push_back ( PersistentObjectIdPair (po, javaObjectID ));
338+ m_implObjStrong.insert ( make_pair (javaObjectID, po ));
339339 jsInstanceInfo->IsJavaObjectWeak = true ;
340340 }
341341 }
@@ -495,6 +495,12 @@ void ObjectManager::MarkReachableObjects(Isolate *isolate, const Local<Object>&
495495 auto jsInfo = GetJSInstanceInfo (o);
496496 if (jsInfo != nullptr )
497497 {
498+ auto hasImplObject = HasImplObject (isolate, o);
499+ if (hasImplObject)
500+ {
501+ jsInfo->IsJavaObjectWeak = false ;
502+ m_implObjStrong[jsInfo->JavaObjectID ] = nullptr ;
503+ }
498504 o->SetHiddenValue (propName, curGCNumValue);
499505 }
500506
@@ -628,9 +634,9 @@ void ObjectManager::OnGcFinished(GCType type, GCCallbackFlags flags)
628634 auto obj = Local<Object>::New (isolate, *weakObj.po );
629635 MarkReachableObjects (isolate, obj);
630636 }
631- for (auto strongObj : m_implObjStrong)
637+ for (const auto & kv : m_implObjStrong)
632638 {
633- auto obj = Local<Object>::New (isolate, *strongObj. po );
639+ auto obj = Local<Object>::New (isolate, *kv. second );
634640 MarkReachableObjects (isolate, obj);
635641 }
636642
@@ -681,24 +687,27 @@ void ObjectManager::MakeRegularObjectsWeak(const set<int>& instances, DirectBuff
681687 inputBuff.Reset ();
682688}
683689
684- void ObjectManager::MakeImplObjectsWeak (const vector<PersistentObjectIdPair >& instances, DirectBuffer& inputBuff)
690+ void ObjectManager::MakeImplObjectsWeak (const map< int , Persistent<Object>* >& instances, DirectBuffer& inputBuff)
685691{
686692 jboolean keepAsWeak = JNI_TRUE;
687693
688- for (const auto & poIdPair : instances)
694+ for (const auto & kv : instances)
689695 {
690- int javaObjectId = poIdPair.javaObjectId ;
696+ if (kv.second != nullptr )
697+ {
698+ int javaObjectId = kv.first ;
691699
692- bool success = inputBuff.Write (javaObjectId);
700+ bool success = inputBuff.Write (javaObjectId);
693701
694- if (!success)
695- {
696- int length = inputBuff.Length ();
697- jboolean keepAsWeak = JNI_TRUE;
698- m_env.CallStaticVoidMethod (PlatformClass, MAKE_INSTANCE_WEAK_BATCH_METHOD_ID, (jobject) inputBuff, length, keepAsWeak);
699- inputBuff.Reset ();
700- success = inputBuff.Write (javaObjectId);
701- assert (success);
702+ if (!success)
703+ {
704+ int length = inputBuff.Length ();
705+ jboolean keepAsWeak = JNI_TRUE;
706+ m_env.CallStaticVoidMethod (PlatformClass, MAKE_INSTANCE_WEAK_BATCH_METHOD_ID, (jobject) inputBuff, length, keepAsWeak);
707+ inputBuff.Reset ();
708+ success = inputBuff.Write (javaObjectId);
709+ assert (success);
710+ }
702711 }
703712 }
704713 int size = inputBuff.Size ();
0 commit comments