@@ -25,6 +25,21 @@ void MetadataNode::Init(Isolate* isolate) {
25
25
cache->MetadataKey = new Persistent<String>(isolate, key);
26
26
}
27
27
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
+
28
43
MetadataNode::MetadataNode (MetadataTreeNode* treeNode) :
29
44
m_treeNode(treeNode) {
30
45
uint8_t nodeType = s_metadataReader.GetNodeType (treeNode);
@@ -195,9 +210,7 @@ Local<Object> MetadataNode::CreateArrayWrapper(Isolate* isolate) {
195
210
auto node = GetOrCreate (" java/lang/Object" );
196
211
auto ctorFunc = node->GetConstructorFunction (isolate);
197
212
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);
201
214
202
215
auto context = isolate->GetCurrentContext ();
203
216
auto arr = arrayObjectTemplate->NewInstance (context).ToLocalChecked ();
@@ -1908,4 +1921,5 @@ std::map<std::string, MetadataTreeNode*> MetadataNode::s_name2TreeNodeCache;
1908
1921
std::map<MetadataTreeNode*, MetadataNode*> MetadataNode::s_treeNode2NodeCache;
1909
1922
map<Isolate*, MetadataNode::MetadataNodeCache*> MetadataNode::s_metadata_node_cache;
1910
1923
bool MetadataNode::s_profilerEnabled = false ;
1924
+ std::map<Isolate*, Persistent<ObjectTemplate>*> MetadataNode::s_arrayObjectTemplates;
1911
1925
0 commit comments