Skip to content

Commit 0f8e7b6

Browse files
authored
Merge pull request #1367 from NativeScript/trifonov/array-memory-leak
reuse ObjectTemplate reuse to avoid memory leak
2 parents 1568df7 + 0221d9e commit 0f8e7b6

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,21 @@ void MetadataNode::Init(Isolate* isolate) {
2525
cache->MetadataKey = new Persistent<String>(isolate, key);
2626
}
2727

28+
Local<ObjectTemplate> MetadataNode::GetOrCreateArrayObjectTemplate(Isolate* isolate) {
29+
auto it = s_arrayObjectTemplates.find(isolate);
30+
if (it != s_arrayObjectTemplates.end()) {
31+
return it->second->Get(isolate);
32+
}
33+
34+
auto arrayObjectTemplate = ObjectTemplate::New(isolate);
35+
arrayObjectTemplate->SetInternalFieldCount(static_cast<int>(ObjectManager::MetadataNodeKeys::END));
36+
arrayObjectTemplate->SetIndexedPropertyHandler(ArrayIndexedPropertyGetterCallback, ArrayIndexedPropertySetterCallback);
37+
38+
s_arrayObjectTemplates.emplace(std::make_pair(isolate, new Persistent<ObjectTemplate>(isolate, arrayObjectTemplate)));
39+
40+
return arrayObjectTemplate;
41+
}
42+
2843
MetadataNode::MetadataNode(MetadataTreeNode* treeNode) :
2944
m_treeNode(treeNode) {
3045
uint8_t nodeType = s_metadataReader.GetNodeType(treeNode);
@@ -195,9 +210,7 @@ Local<Object> MetadataNode::CreateArrayWrapper(Isolate* isolate) {
195210
auto node = GetOrCreate("java/lang/Object");
196211
auto ctorFunc = node->GetConstructorFunction(isolate);
197212

198-
auto arrayObjectTemplate = ObjectTemplate::New(isolate);
199-
arrayObjectTemplate->SetInternalFieldCount(static_cast<int>(ObjectManager::MetadataNodeKeys::END));
200-
arrayObjectTemplate->SetIndexedPropertyHandler(ArrayIndexedPropertyGetterCallback, ArrayIndexedPropertySetterCallback);
213+
auto arrayObjectTemplate = GetOrCreateArrayObjectTemplate(isolate);
201214

202215
auto context = isolate->GetCurrentContext();
203216
auto arr = arrayObjectTemplate->NewInstance(context).ToLocalChecked();
@@ -1908,4 +1921,5 @@ std::map<std::string, MetadataTreeNode*> MetadataNode::s_name2TreeNodeCache;
19081921
std::map<MetadataTreeNode*, MetadataNode*> MetadataNode::s_treeNode2NodeCache;
19091922
map<Isolate*, MetadataNode::MetadataNodeCache*> MetadataNode::s_metadata_node_cache;
19101923
bool MetadataNode::s_profilerEnabled = false;
1924+
std::map<Isolate*, Persistent<ObjectTemplate>*> MetadataNode::s_arrayObjectTemplates;
19111925

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class MetadataNode {
7878
v8::Local<v8::FunctionTemplate> GetConstructorFunctionTemplate(v8::Isolate* isolate, MetadataTreeNode* treeNode);
7979
v8::Local<v8::FunctionTemplate> GetConstructorFunctionTemplate(v8::Isolate* isolate, MetadataTreeNode* treeNode, std::vector<MethodCallbackData*>& instanceMethodsCallbackData);
8080
v8::Persistent<v8::Function>* GetPersistentConstructorFunction(v8::Isolate* isolate);
81+
v8::Local<v8::ObjectTemplate> GetOrCreateArrayObjectTemplate(v8::Isolate* isolate);
8182

8283
std::vector<MethodCallbackData*> SetInstanceMembers(v8::Isolate* isolate, v8::Local<v8::FunctionTemplate>& ctorFuncTemplate, v8::Local<v8::ObjectTemplate>& prototypeTemplate, std::vector<MethodCallbackData*>& instanceMethodsCallbackData, const std::vector<MethodCallbackData*>& baseInstanceMethodsCallbackData, MetadataTreeNode* treeNode);
8384
std::vector<MethodCallbackData*> SetInstanceMethodsFromStaticMetadata(v8::Isolate* isolate, v8::Local<v8::FunctionTemplate>& ctorFuncTemplate, v8::Local<v8::ObjectTemplate>& prototypeTemplate, std::vector<MethodCallbackData*>& instanceMethodsCallbackData, const std::vector<MethodCallbackData*>& baseInstanceMethodsCallbackData, MetadataTreeNode* treeNode);
@@ -152,6 +153,7 @@ class MetadataNode {
152153
static std::map<std::string, MetadataTreeNode*> s_name2TreeNodeCache;
153154
static std::map<MetadataTreeNode*, MetadataNode*> s_treeNode2NodeCache;
154155
static std::map<v8::Isolate*, MetadataNodeCache*> s_metadata_node_cache;
156+
static std::map<v8::Isolate*, v8::Persistent<v8::ObjectTemplate>*> s_arrayObjectTemplates;
155157
static bool s_profilerEnabled;
156158

157159
struct MethodCallbackData {

0 commit comments

Comments
 (0)