Skip to content

Commit 51c6d97

Browse files
committed
runtime: fix mem leak when creating metadata tree nodes
1 parent bc9997d commit 51c6d97

1 file changed

Lines changed: 27 additions & 7 deletions

File tree

test-app/runtime/src/main/cpp/runtime/metadata/MetadataNode.cpp

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ napi_value MetadataNode::GetImplementationObject(napi_env env, napi_value object
310310
void MetadataNode::SetInstanceMetadata(napi_env env, napi_value object, MetadataNode *node) {
311311
auto cache = GetMetadataNodeCache(env);
312312
napi_value external;
313-
napi_create_external(env, node, [](napi_env env, void*d1,void*d2){}, node, &external);
313+
napi_create_external(env, node, [](napi_env env, void *d1, void *d2) {}, node, &external);
314314
napi_set_named_property(env, object, "#instance_metadata", external);
315315
// napi_wrap(env, object, node, nullptr, nullptr, nullptr);
316316
}
@@ -728,7 +728,7 @@ string MetadataNode::GetName() {
728728

729729
MetadataNode *MetadataNode::GetOrCreate(const string &className) {
730730
MetadataNode *node = nullptr;
731-
731+
732732
auto it = s_name2NodeCache.find(className);
733733

734734
if (it == s_name2NodeCache.end()) {
@@ -752,8 +752,25 @@ MetadataNode *MetadataNode::GetOrCreateInternal(MetadataTreeNode *treeNode) {
752752
if (it != s_treeNode2NodeCache.end()) {
753753
result = it->second;
754754
} else {
755-
result = new MetadataNode(treeNode);
755+
auto name = GetJniClassName(treeNode);
756+
if (!name.empty()) {
757+
auto it2 = s_name2NodeCache.find(name);
758+
if ( it2 != s_name2NodeCache.end()) {
759+
result = it2->second;
760+
}
761+
}
762+
763+
if (!result) {
764+
result = new MetadataNode(treeNode);
765+
s_treeNode2NodeCache.emplace(treeNode, result);
766+
if (!result->m_name.empty()) {
767+
s_name2NodeCache.emplace(result->m_name, result);
768+
}
769+
}
770+
}
756771

772+
auto found = s_treeNode2NodeCache.find(treeNode);
773+
if (found == s_treeNode2NodeCache.end()) {
757774
s_treeNode2NodeCache.emplace(treeNode, result);
758775
}
759776

@@ -905,7 +922,7 @@ void MetadataNode::RegisterSymbolHasInstanceCallback(napi_env env, const Metadat
905922
napi_value method;
906923
napi_create_function(env, "hasInstance", NAPI_AUTO_LENGTH, SymbolHasInstanceCallback, clazz,
907924
&method);
908-
925+
909926
napi_property_descriptor desc = {
910927
nullptr, // utf8name
911928
hasInstance, // name
@@ -1528,7 +1545,8 @@ napi_value MetadataNode::NullObjectAccessorGetterCallback(napi_env env, napi_cal
15281545
if (!value) {
15291546
auto node = reinterpret_cast<MetadataNode *>(data);
15301547
napi_value external;
1531-
napi_create_external(env, node, [](napi_env env, void* d1, void*d2) {}, node, &external);
1548+
napi_create_external(env, node, [](napi_env env, void *d1, void *d2) {}, node,
1549+
&external);
15321550
napi_set_named_property(env, jsThis, PROP_KEY_NULL_NODE_NAME, external);
15331551

15341552
napi_util::napi_set_function(env,
@@ -1583,7 +1601,8 @@ napi_value MetadataNode::FieldAccessorGetterCallback(napi_env env, napi_callback
15831601
if (isHolder) {
15841602
return UNDEFINED;
15851603
} else {
1586-
napi_set_named_property(env, jsThis, "__napi::this", napi_util::get_true(env));
1604+
napi_set_named_property(env, jsThis, "__napi::this",
1605+
napi_util::get_true(env));
15871606
}
15881607
}
15891608
}
@@ -1627,7 +1646,8 @@ napi_value MetadataNode::FieldAccessorSetterCallback(napi_env env, napi_callback
16271646
if (isHolder) {
16281647
return UNDEFINED;
16291648
} else {
1630-
napi_set_named_property(env, jsThis, "__napi::this", napi_util::get_true(env));
1649+
napi_set_named_property(env, jsThis, "__napi::this",
1650+
napi_util::get_true(env));
16311651
}
16321652
}
16331653
}

0 commit comments

Comments
 (0)