Skip to content

Commit 38e894a

Browse files
committed
check if array-enclosed elements are empty before trying to release them during GC
1 parent 30bf433 commit 38e894a

2 files changed

Lines changed: 20 additions & 0 deletions

File tree

runtime/src/main/jni/ObjectManager.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,10 @@ void ObjectManager::MarkReachableObjects(Isolate* isolate, const Local<Object>&
460460
NativeScriptExtension::ReleaseClosureObjects(closureObjects);
461461
}
462462

463+
if (o->IsArray()) {
464+
MarkReachableArrayElements(o, s);
465+
}
466+
463467
auto proto = o->GetPrototype();
464468
if (!proto.IsEmpty() && !proto->IsNull() && !proto->IsUndefined() && proto->IsObject()) {
465469
s.push(proto);
@@ -518,6 +522,19 @@ void ObjectManager::MarkReachableObjects(Isolate* isolate, const Local<Object>&
518522
} // while
519523
}
520524

525+
void ObjectManager::MarkReachableArrayElements(Local<Object> &o, stack<Local<Value>> &s) {
526+
auto arr = o.As<Array>();
527+
528+
int arrEnclosedObjectsLength = arr->Length();
529+
for (int i = 0; i < arrEnclosedObjectsLength; i++) {
530+
auto enclosedElement = arr->Get(i);
531+
532+
if (!enclosedElement.IsEmpty() && enclosedElement->IsObject()) {
533+
s.push(enclosedElement);
534+
}
535+
}
536+
}
537+
521538
void ObjectManager::OnGcStartedStatic(Isolate* isolate, GCType type, GCCallbackFlags flags) {
522539
try {
523540
auto runtime = Runtime::GetRuntime(isolate);

runtime/src/main/jni/ObjectManager.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,15 @@ class ObjectManager {
4949

5050
v8::Local<v8::Object> GetEmptyObject(v8::Isolate* isolate);
5151

52+
static void MarkReachableArrayElements(v8::Local<v8::Object> &o, std::stack<v8::Local<v8::Value>> &s);
53+
5254
enum class MetadataNodeKeys {
5355
JsInfo,
5456
CallSuper,
5557
END
5658
};
5759

60+
5861
private:
5962

6063
struct JSInstanceInfo {

0 commit comments

Comments
 (0)