|
265 | 265 | return std::make_pair(ffiType, data); |
266 | 266 | } |
267 | 267 |
|
268 | | -Local<FunctionTemplate> MetadataBuilder::GetOrCreateConstructorFunctionTemplate(Local<Context> context, const BaseClassMeta* meta, KnownUnknownClassPair pair) { |
| 268 | +Local<FunctionTemplate> MetadataBuilder::GetOrCreateConstructorFunctionTemplate(Local<Context> context, const BaseClassMeta* meta, KnownUnknownClassPair pair, const std::vector<std::string>& additionalProtocols) { |
269 | 269 | robin_hood::unordered_map<std::string, uint8_t> instanceMembers; |
270 | 270 | robin_hood::unordered_map<std::string, uint8_t> staticMembers; |
271 | | - return MetadataBuilder::GetOrCreateConstructorFunctionTemplateInternal(context, meta, pair, instanceMembers, staticMembers); |
| 271 | + return MetadataBuilder::GetOrCreateConstructorFunctionTemplateInternal(context, meta, pair, instanceMembers, staticMembers, additionalProtocols); |
272 | 272 | } |
273 | 273 |
|
274 | | -Local<FunctionTemplate> MetadataBuilder::GetOrCreateConstructorFunctionTemplateInternal(Local<Context> context, const BaseClassMeta* meta, KnownUnknownClassPair pair, robin_hood::unordered_map<std::string, uint8_t>& instanceMembers, robin_hood::unordered_map<std::string, uint8_t>& staticMembers) { |
| 274 | +Local<FunctionTemplate> MetadataBuilder::GetOrCreateConstructorFunctionTemplateInternal(Local<Context> context, const BaseClassMeta* meta, KnownUnknownClassPair pair, robin_hood::unordered_map<std::string, uint8_t>& instanceMembers, robin_hood::unordered_map<std::string, uint8_t>& staticMembers, const std::vector<std::string>& additionalProtocols) { |
275 | 275 | Isolate* isolate = context->GetIsolate(); |
276 | 276 | Local<FunctionTemplate> ctorFuncTemplate; |
277 | 277 | auto cache = Caches::Get(isolate); |
278 | | - auto it = cache->CtorFuncTemplates.find(meta); |
279 | | - if (it != cache->CtorFuncTemplates.end()) { |
280 | | - ctorFuncTemplate = it->second->Get(isolate); |
281 | | - return ctorFuncTemplate; |
| 278 | + |
| 279 | + if (additionalProtocols.empty()) { |
| 280 | + auto it = cache->CtorFuncTemplates.find(meta); |
| 281 | + if (it != cache->CtorFuncTemplates.end()) { |
| 282 | + ctorFuncTemplate = it->second->Get(isolate); |
| 283 | + return ctorFuncTemplate; |
| 284 | + } |
282 | 285 | } |
283 | 286 |
|
284 | 287 | std::string className; |
|
325 | 328 | MetadataBuilder::RegisterInstanceProperties(context, ctorFuncTemplate, meta, meta->name(), pair, instanceMembers); |
326 | 329 | MetadataBuilder::RegisterInstanceMethods(context, ctorFuncTemplate, meta, pair, instanceMembers); |
327 | 330 | MetadataBuilder::RegisterInstanceProtocols(context, ctorFuncTemplate, meta, meta->name(), pair, instanceMembers); |
| 331 | + MetadataBuilder::RegisterAdditionalProtocols(context, ctorFuncTemplate, pair, additionalProtocols, instanceMembers); |
328 | 332 |
|
329 | 333 | ctorFuncTemplate->PrototypeTemplate()->Set(tns::ToV8String(isolate, "toString"), FunctionTemplate::New(isolate, MetadataBuilder::ToStringFunctionCallback)); |
330 | 334 |
|
|
482 | 486 | } |
483 | 487 | } |
484 | 488 |
|
| 489 | +void MetadataBuilder::RegisterAdditionalProtocols(Local<Context> context, Local<FunctionTemplate> ctorFuncTemplate, KnownUnknownClassPair pair, const std::vector<std::string>& additionalProtocols, robin_hood::unordered_map<std::string, uint8_t>& names) { |
| 490 | + for (std::string protocolName : additionalProtocols) { |
| 491 | + const Meta* meta = ArgConverter::GetMeta(protocolName.c_str()); |
| 492 | + if (meta != nullptr) { |
| 493 | + const BaseClassMeta* baseMeta = static_cast<const BaseClassMeta*>(meta); |
| 494 | + MetadataBuilder::RegisterInstanceMethods(context, ctorFuncTemplate, baseMeta, pair, names); |
| 495 | + MetadataBuilder::RegisterInstanceProperties(context, ctorFuncTemplate, baseMeta, baseMeta->name(), pair, names); |
| 496 | + |
| 497 | + std::vector<std::string> metaProtocols; |
| 498 | + for (auto it = baseMeta->protocols->begin(); it != baseMeta->protocols->end(); it++) { |
| 499 | + std::string name = (*it).valuePtr(); |
| 500 | + metaProtocols.push_back(name); |
| 501 | + } |
| 502 | + |
| 503 | + MetadataBuilder::RegisterAdditionalProtocols(context, ctorFuncTemplate, pair, metaProtocols, names); |
| 504 | + } |
| 505 | + } |
| 506 | +} |
| 507 | + |
485 | 508 | void MetadataBuilder::RegisterStaticMethods(Local<Context> context, Local<v8::Function> ctorFunc, const BaseClassMeta* meta, KnownUnknownClassPair pair, robin_hood::unordered_map<std::string, uint8_t>& names) { |
486 | 509 | Isolate* isolate = context->GetIsolate(); |
487 | 510 | for (auto it = meta->staticMethods->begin(); it != meta->staticMethods->end(); it++) { |
|
0 commit comments