@@ -488,12 +488,17 @@ std::vector<MetadataNode::MethodCallbackData*> MetadataNode::SetInstanceMembers(
488488 }
489489}
490490
491- vector<MetadataNode::MethodCallbackData*> MetadataNode::SetInstanceMethodsFromStaticMetadata (Isolate* isolate, Local<FunctionTemplate>& ctorFuncTemplate, Local<ObjectTemplate>& prototypeTemplate, vector<MethodCallbackData*>& instanceMethodsCallbackData, const vector<MethodCallbackData*>& baseInstanceMethodsCallbackData, MetadataTreeNode* treeNode) {
491+ vector<MetadataNode::MethodCallbackData *> MetadataNode::SetInstanceMethodsFromStaticMetadata (Isolate *isolate,
492+ Local<FunctionTemplate> &ctorFuncTemplate,
493+ Local<ObjectTemplate> &prototypeTemplate,
494+ vector<MethodCallbackData *> &instanceMethodsCallbackData,
495+ const vector<MethodCallbackData *> &baseInstanceMethodsCallbackData,
496+ MetadataTreeNode *treeNode) {
492497 SET_PROFILER_FRAME ();
493498
494- std::vector<MethodCallbackData*> instanceMethodData;
499+ std::vector<MethodCallbackData *> instanceMethodData;
495500
496- uint8_t * curPtr = s_metadataReader.GetValueData () + treeNode->offsetValue + 1 ;
501+ uint8_t * curPtr = s_metadataReader.GetValueData () + treeNode->offsetValue + 1 ;
497502
498503 auto nodeType = s_metadataReader.GetNodeType (treeNode);
499504
@@ -505,27 +510,55 @@ vector<MetadataNode::MethodCallbackData*> MetadataNode::SetInstanceMethodsFromSt
505510 curPtr += sizeof (uint8_t ) + sizeof (uint32_t );
506511 }
507512
508- // get candidates from instance methods metadata
509- auto instanceMethodCount = *reinterpret_cast <uint16_t *>(curPtr);
510- curPtr += sizeof (uint16_t );
511513 string lastMethodName;
512- MethodCallbackData* callbackData = nullptr ;
514+ MethodCallbackData * callbackData = nullptr ;
513515
514516 auto context = isolate->GetCurrentContext ();
515-
516517 auto origin = Constants::APP_ROOT_FOLDER_PATH + GetOrCreateInternal (treeNode)->m_name ;
518+
519+ std::unordered_map<std::string, MethodCallbackData *> collectedExtensionMethodDatas;
520+
521+ auto extensionFunctionsCount = *reinterpret_cast <uint16_t *>(curPtr);
522+ curPtr += sizeof (uint16_t );
523+ for (auto i = 0 ; i < extensionFunctionsCount; i++) {
524+ auto entry = s_metadataReader.ReadExtensionFunctionEntry (&curPtr);
525+
526+ if (entry.name != lastMethodName) {
527+ callbackData = new MethodCallbackData (this );
528+ auto funcData = External::New (isolate, callbackData);
529+ auto funcTemplate = FunctionTemplate::New (isolate, MethodCallback, funcData);
530+ auto funcName = ArgConverter::ConvertToV8String (isolate, entry.name );
531+ prototypeTemplate->Set (funcName, funcTemplate);
532+
533+ lastMethodName = entry.name ;
534+ std::pair<std::string, MethodCallbackData *> p (entry.name , callbackData);
535+ collectedExtensionMethodDatas.insert (p);
536+ }
537+ callbackData->candidates .push_back (entry);
538+ }
539+
540+
541+ // get candidates from instance methods metadata
542+ auto instanceMethodCount = *reinterpret_cast <uint16_t *>(curPtr);
543+ curPtr += sizeof (uint16_t );
544+
517545 for (auto i = 0 ; i < instanceMethodCount; i++) {
518546 auto entry = s_metadataReader.ReadInstanceMethodEntry (&curPtr);
519547
520548 // attach a function to the prototype of a javascript Object
521549 if (entry.name != lastMethodName) {
522- callbackData = new MethodCallbackData (this );
550+ callbackData = tryGetExtensionMethodCallbackData (collectedExtensionMethodDatas,
551+ entry.name );
552+ if (callbackData == nullptr ) {
553+ callbackData = new MethodCallbackData (this );
554+ }
555+
523556 instanceMethodData.push_back (callbackData);
524557
525558 instanceMethodsCallbackData.push_back (callbackData);
526559 auto itBegin = baseInstanceMethodsCallbackData.begin ();
527560 auto itEnd = baseInstanceMethodsCallbackData.end ();
528- auto itFound = find_if (itBegin, itEnd, [&entry] (MethodCallbackData *x) {
561+ auto itFound = find_if (itBegin, itEnd, [&entry](MethodCallbackData *x) {
529562 return x->candidates .front ().name == entry.name ;
530563 });
531564 if (itFound != itEnd) {
@@ -539,10 +572,13 @@ vector<MetadataNode::MethodCallbackData*> MetadataNode::SetInstanceMethodsFromSt
539572
540573 if (s_profilerEnabled) {
541574 auto func = funcTemplate->GetFunction (context).ToLocalChecked ();
542- Local<Function> wrapperFunc = Wrap (isolate, func, entry.name , origin, false /* isCtorFunc */ );
575+ Local<Function> wrapperFunc = Wrap (isolate, func, entry.name , origin,
576+ false /* isCtorFunc */ );
543577 Local<Function> ctorFunc = ctorFuncTemplate->GetFunction (context).ToLocalChecked ();
544578 Local<Value> protoVal;
545- ctorFunc->Get (context, ArgConverter::ConvertToV8String (isolate, " prototype" )).ToLocal (&protoVal);
579+ ctorFunc->Get (context,
580+ ArgConverter::ConvertToV8String (isolate, " prototype" )).ToLocal (
581+ &protoVal);
546582 if (!protoVal.IsEmpty () && !protoVal->IsUndefined () && !protoVal->IsNull ()) {
547583 protoVal.As <Object>()->Set (context, funcName, wrapperFunc);
548584 }
@@ -556,23 +592,24 @@ vector<MetadataNode::MethodCallbackData*> MetadataNode::SetInstanceMethodsFromSt
556592 callbackData->candidates .push_back (entry);
557593 }
558594
559- auto extensionFunctionsCount = *reinterpret_cast <uint16_t *>(curPtr);
560- curPtr += sizeof (uint16_t );
561- for (auto i = 0 ; i < extensionFunctionsCount; i++) {
562- auto entry = s_metadataReader.ReadExtensionFunctionEntry (&curPtr);
563- if (entry.name != lastMethodName) {
564- callbackData = new MethodCallbackData (this );
565- auto funcData = External::New (isolate, callbackData);
566- auto funcTemplate = FunctionTemplate::New (isolate, MethodCallback, funcData);
567- auto funcName = ArgConverter::ConvertToV8String (isolate, entry.name );
568- prototypeTemplate->Set (funcName, funcTemplate);
595+ return instanceMethodData;
596+ }
569597
570- lastMethodName = entry.name ;
571- }
572- callbackData->candidates .push_back (entry);
598+ MetadataNode::MethodCallbackData *MetadataNode::tryGetExtensionMethodCallbackData (
599+ std::unordered_map<std::string, MethodCallbackData *> collectedMethodCallbackDatas,
600+ std::string lookupName) {
601+
602+ if (collectedMethodCallbackDatas.size () < 1 ) {
603+ return nullptr ;
573604 }
574605
575- return instanceMethodData;
606+ auto iter = collectedMethodCallbackDatas.find (lookupName);
607+
608+ if (iter != collectedMethodCallbackDatas.end ()) {
609+ return iter->second ;
610+ }
611+
612+ return nullptr ;
576613}
577614
578615void MetadataNode::SetInstanceFieldsFromStaticMetadata (Isolate* isolate, Local<FunctionTemplate>& ctorFuncTemplate, Local<ObjectTemplate>& prototypeTemplate, vector<MethodCallbackData*>& instanceMethodsCallbackData, const vector<MethodCallbackData*>& baseInstanceMethodsCallbackData, MetadataTreeNode* treeNode) {
@@ -592,6 +629,12 @@ void MetadataNode::SetInstanceFieldsFromStaticMetadata(Isolate* isolate, Local<F
592629 curPtr += sizeof (uint8_t ) + sizeof (uint32_t );
593630 }
594631
632+ auto extensionFunctionsCount = *reinterpret_cast <uint16_t *>(curPtr);
633+ curPtr += sizeof (uint16_t );
634+ for (auto i = 0 ; i < extensionFunctionsCount; i++) {
635+ auto entry = s_metadataReader.ReadExtensionFunctionEntry (&curPtr);
636+ }
637+
595638 // get candidates from instance methods metadata
596639 auto instanceMethodCout = *reinterpret_cast <uint16_t *>(curPtr);
597640 curPtr += sizeof (uint16_t );
@@ -601,12 +644,6 @@ void MetadataNode::SetInstanceFieldsFromStaticMetadata(Isolate* isolate, Local<F
601644 auto entry = s_metadataReader.ReadInstanceMethodEntry (&curPtr);
602645 }
603646
604- auto extensionFunctionsCount = *reinterpret_cast <uint16_t *>(curPtr);
605- curPtr += sizeof (uint16_t );
606- for (auto i = 0 ; i < extensionFunctionsCount; i++) {
607- auto entry = s_metadataReader.ReadExtensionFunctionEntry (&curPtr);
608- }
609-
610647 // get candidates from instance fields metadata
611648 auto instanceFieldCout = *reinterpret_cast <uint16_t *>(curPtr);
612649 curPtr += sizeof (uint16_t );
@@ -733,18 +770,19 @@ void MetadataNode::SetStaticMembers(Isolate* isolate, Local<Function>& ctorFunct
733770 if (s_metadataReader.IsNodeTypeInterface (nodeType)) {
734771 curPtr += sizeof (uint8_t ) + sizeof (uint32_t );
735772 }
736- auto instanceMethodCout = *reinterpret_cast <uint16_t *>(curPtr);
737- curPtr += sizeof (uint16_t );
738- for (auto i = 0 ; i < instanceMethodCout; i++) {
739- auto entry = s_metadataReader.ReadInstanceMethodEntry (&curPtr);
740- }
741773
742774 auto extensionFunctionsCount = *reinterpret_cast <uint16_t *>(curPtr);
743775 curPtr += sizeof (uint16_t );
744776 for (auto i = 0 ; i < extensionFunctionsCount; i++) {
745777 auto entry = s_metadataReader.ReadExtensionFunctionEntry (&curPtr);
746778 }
747779
780+ auto instanceMethodCout = *reinterpret_cast <uint16_t *>(curPtr);
781+ curPtr += sizeof (uint16_t );
782+ for (auto i = 0 ; i < instanceMethodCout; i++) {
783+ auto entry = s_metadataReader.ReadInstanceMethodEntry (&curPtr);
784+ }
785+
748786 auto instanceFieldCout = *reinterpret_cast <uint16_t *>(curPtr);
749787 curPtr += sizeof (uint16_t );
750788 for (auto i = 0 ; i < instanceFieldCout; i++) {
0 commit comments