@@ -85,8 +85,8 @@ void ObjectManager::Init(Isolate *isolate) {
85
85
m_poJsWrapperFunc = new Persistent<Function>(isolate, jsWrapperFunc);
86
86
87
87
if (m_markingMode != JavaScriptMarkingMode::None) {
88
- isolate->AddGCPrologueCallback (ObjectManager::OnGcStartedStatic, kGCTypeAll );
89
- isolate->AddGCEpilogueCallback (ObjectManager::OnGcFinishedStatic, kGCTypeAll );
88
+ isolate->AddGCPrologueCallback (ObjectManager::OnGcStartedStatic, kGCTypeMarkSweepCompact );
89
+ isolate->AddGCEpilogueCallback (ObjectManager::OnGcFinishedStatic, kGCTypeMarkSweepCompact );
90
90
}
91
91
}
92
92
@@ -380,9 +380,18 @@ void ObjectManager::JSObjectWeakCallback(Isolate *isolate, ObjectWeakCallbackSta
380
380
jsInstanceInfo->IsJavaObjectWeak = true ;
381
381
}
382
382
} else {
383
- assert (!m_markedForGC.empty ());
384
- auto &topGCInfo = m_markedForGC.top ();
385
- topGCInfo.markedForGC .push_back (po);
383
+ if (m_markedForGC.empty ()){
384
+ // Emulates the behavior in the OnGcStarted callback. Тhis is necessary as the hooking
385
+ // to the V8 GC is done only on the markSweepCompact phase. The JSObjectWeakCallback
386
+ // however is still triggered in other V8 GC phases (scavenger for example). This
387
+ // creates a problem that there is no 'top' on the m_markedForGC stack.
388
+ GarbageCollectionInfo gcInfo (++m_numberOfGC);
389
+ gcInfo.markedForGC .push_back (po);
390
+ m_markedForGC.push (gcInfo);
391
+ } else {
392
+ auto &topGCInfo = m_markedForGC.top ();
393
+ topGCInfo.markedForGC .push_back (po);
394
+ }
386
395
}
387
396
}
388
397
}
@@ -637,9 +646,15 @@ void ObjectManager::MarkReachableArrayElements(Local<Object> &o, stack<Local<Val
637
646
638
647
void ObjectManager::OnGcStartedStatic (Isolate *isolate, GCType type, GCCallbackFlags flags) {
639
648
try {
649
+ tns::instrumentation::Frame frame;
650
+
640
651
auto runtime = Runtime::GetRuntime (isolate);
641
652
auto objectManager = runtime->GetObjectManager ();
642
653
objectManager->OnGcStarted (type, flags);
654
+
655
+ if (frame.check ()){
656
+ frame.log (" OnGcStartedStatic" );
657
+ }
643
658
} catch (NativeScriptException &e) {
644
659
e.ReThrowToV8 ();
645
660
} catch (std::exception e) {
@@ -655,9 +670,15 @@ void ObjectManager::OnGcStartedStatic(Isolate *isolate, GCType type, GCCallbackF
655
670
656
671
void ObjectManager::OnGcFinishedStatic (Isolate *isolate, GCType type, GCCallbackFlags flags) {
657
672
try {
673
+ tns::instrumentation::Frame frame;
674
+
658
675
auto runtime = Runtime::GetRuntime (isolate);
659
676
auto objectManager = runtime->GetObjectManager ();
660
677
objectManager->OnGcFinished (type, flags);
678
+
679
+ if (frame.check ()){
680
+ frame.log (" OnGcFinishedStatic" );
681
+ }
661
682
} catch (NativeScriptException &e) {
662
683
e.ReThrowToV8 ();
663
684
} catch (std::exception e) {
0 commit comments