From 0221d9e0fd53830093e6e9902f88174f80595a2b Mon Sep 17 00:00:00 2001 From: Vasil Trifonov Date: Fri, 3 May 2019 18:45:28 +0300 Subject: [PATCH] reuse ObjectTemplate reuse to avoid memory leak --- .../runtime/src/main/cpp/MetadataNode.cpp | 20 ++++++++++++++++--- test-app/runtime/src/main/cpp/MetadataNode.h | 2 ++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/test-app/runtime/src/main/cpp/MetadataNode.cpp b/test-app/runtime/src/main/cpp/MetadataNode.cpp index 5f9846ab6..2526de010 100644 --- a/test-app/runtime/src/main/cpp/MetadataNode.cpp +++ b/test-app/runtime/src/main/cpp/MetadataNode.cpp @@ -25,6 +25,21 @@ void MetadataNode::Init(Isolate* isolate) { cache->MetadataKey = new Persistent(isolate, key); } +Local MetadataNode::GetOrCreateArrayObjectTemplate(Isolate* isolate) { + auto it = s_arrayObjectTemplates.find(isolate); + if (it != s_arrayObjectTemplates.end()) { + return it->second->Get(isolate); + } + + auto arrayObjectTemplate = ObjectTemplate::New(isolate); + arrayObjectTemplate->SetInternalFieldCount(static_cast(ObjectManager::MetadataNodeKeys::END)); + arrayObjectTemplate->SetIndexedPropertyHandler(ArrayIndexedPropertyGetterCallback, ArrayIndexedPropertySetterCallback); + + s_arrayObjectTemplates.emplace(std::make_pair(isolate, new Persistent(isolate, arrayObjectTemplate))); + + return arrayObjectTemplate; +} + MetadataNode::MetadataNode(MetadataTreeNode* treeNode) : m_treeNode(treeNode) { uint8_t nodeType = s_metadataReader.GetNodeType(treeNode); @@ -195,9 +210,7 @@ Local MetadataNode::CreateArrayWrapper(Isolate* isolate) { auto node = GetOrCreate("java/lang/Object"); auto ctorFunc = node->GetConstructorFunction(isolate); - auto arrayObjectTemplate = ObjectTemplate::New(isolate); - arrayObjectTemplate->SetInternalFieldCount(static_cast(ObjectManager::MetadataNodeKeys::END)); - arrayObjectTemplate->SetIndexedPropertyHandler(ArrayIndexedPropertyGetterCallback, ArrayIndexedPropertySetterCallback); + auto arrayObjectTemplate = GetOrCreateArrayObjectTemplate(isolate); auto context = isolate->GetCurrentContext(); auto arr = arrayObjectTemplate->NewInstance(context).ToLocalChecked(); @@ -1908,4 +1921,5 @@ std::map MetadataNode::s_name2TreeNodeCache; std::map MetadataNode::s_treeNode2NodeCache; map MetadataNode::s_metadata_node_cache; bool MetadataNode::s_profilerEnabled = false; +std::map*> MetadataNode::s_arrayObjectTemplates; diff --git a/test-app/runtime/src/main/cpp/MetadataNode.h b/test-app/runtime/src/main/cpp/MetadataNode.h index c46237ddc..86a864abc 100644 --- a/test-app/runtime/src/main/cpp/MetadataNode.h +++ b/test-app/runtime/src/main/cpp/MetadataNode.h @@ -78,6 +78,7 @@ class MetadataNode { v8::Local GetConstructorFunctionTemplate(v8::Isolate* isolate, MetadataTreeNode* treeNode); v8::Local GetConstructorFunctionTemplate(v8::Isolate* isolate, MetadataTreeNode* treeNode, std::vector& instanceMethodsCallbackData); v8::Persistent* GetPersistentConstructorFunction(v8::Isolate* isolate); + v8::Local GetOrCreateArrayObjectTemplate(v8::Isolate* isolate); std::vector SetInstanceMembers(v8::Isolate* isolate, v8::Local& ctorFuncTemplate, v8::Local& prototypeTemplate, std::vector& instanceMethodsCallbackData, const std::vector& baseInstanceMethodsCallbackData, MetadataTreeNode* treeNode); std::vector SetInstanceMethodsFromStaticMetadata(v8::Isolate* isolate, v8::Local& ctorFuncTemplate, v8::Local& prototypeTemplate, std::vector& instanceMethodsCallbackData, const std::vector& baseInstanceMethodsCallbackData, MetadataTreeNode* treeNode); @@ -152,6 +153,7 @@ class MetadataNode { static std::map s_name2TreeNodeCache; static std::map s_treeNode2NodeCache; static std::map s_metadata_node_cache; + static std::map*> s_arrayObjectTemplates; static bool s_profilerEnabled; struct MethodCallbackData {