@@ -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+
2843MetadataNode::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;
19081921std::map<MetadataTreeNode*, MetadataNode*> MetadataNode::s_treeNode2NodeCache;
19091922map<Isolate*, MetadataNode::MetadataNodeCache*> MetadataNode::s_metadata_node_cache;
19101923bool MetadataNode::s_profilerEnabled = false ;
1924+ std::map<Isolate*, Persistent<ObjectTemplate>*> MetadataNode::s_arrayObjectTemplates;
19111925
0 commit comments