1313#include " Closure.h"
1414#include " MetadataReader.h"
1515#include " ObjCBridge.h"
16+ #include " SignatureDispatch.h"
1617#include " TypeConv.h"
1718#include " Util.h"
1819#include " ffi/Block.h"
@@ -207,7 +208,8 @@ napi_value JS_NSObject_alloc(napi_env env, napi_callback_info cbinfo) {
207208 if (memberIt->second .methodOrGetter .isProperty ) {
208209 continue ;
209210 }
210- memberIt->second .addOverload (methodSelector, signatureOffset);
211+ memberIt->second .addOverload (methodSelector, signatureOffset,
212+ (flags & metagen::mdMemberReturnOwned) != 0 ? 1 : 0 );
211213 member = &memberIt->second ;
212214 } else if (inheritedProperty && superMember != nullptr &&
213215 !superMember->methodOrGetter .isProperty ) {
@@ -216,9 +218,11 @@ napi_value JS_NSObject_alloc(napi_env env, napi_callback_info cbinfo) {
216218 superMember->methodOrGetter .signatureOffset , flags));
217219 member = &inserted.first ->second ;
218220 for (const auto & overload : superMember->overloads ) {
219- member->addOverload (overload.method .selector , overload.method .signatureOffset );
221+ member->addOverload (overload.method .selector , overload.method .signatureOffset ,
222+ overload.method .dispatchFlags );
220223 }
221- member->addOverload (methodSelector, signatureOffset);
224+ member->addOverload (methodSelector, signatureOffset,
225+ (flags & metagen::mdMemberReturnOwned) != 0 ? 1 : 0 );
222226 } else {
223227 const auto & inserted = memberMap.emplace (
224228 name, ObjCClassMember (bridgeState, methodSelector, signatureOffset, flags));
@@ -269,7 +273,7 @@ napi_value JS_NSObject_alloc(napi_env env, napi_callback_info cbinfo) {
269273 }
270274}
271275
272- void ObjCClassMember::addOverload (SEL selector, MDSectionOffset offset) {
276+ void ObjCClassMember::addOverload (SEL selector, MDSectionOffset offset, uint8_t dispatchFlags ) {
273277 if (methodOrGetter.selector == selector) {
274278 return ;
275279 }
@@ -280,11 +284,11 @@ napi_value JS_NSObject_alloc(napi_env env, napi_callback_info cbinfo) {
280284 }
281285 }
282286
283- overloads.emplace_back (selector, offset);
287+ overloads.emplace_back (selector, offset, dispatchFlags );
284288}
285289
286- inline bool objcNativeCall (napi_env env, Cif* cif, id self, bool classMethod, void ** avalues ,
287- void * rvalue) {
290+ inline bool objcNativeCall (napi_env env, Cif* cif, id self, bool classMethod, uint8_t dispatchFlags ,
291+ void ** avalues, void * rvalue) {
288292 SEL selector = avalues != nullptr && cif->cif .nargs >= 2 ? *((SEL *)avalues[1 ]) : nullptr ;
289293
290294 Class receiverClass = nil ;
@@ -310,6 +314,16 @@ inline bool objcNativeCall(napi_env env, Cif* cif, id self, bool classMethod, vo
310314
311315 @try {
312316 if (!supercall) {
317+ if (cif != nullptr && cif->signatureHash != 0 ) {
318+ const uint64_t dispatchId = composeSignatureDispatchId (
319+ cif->signatureHash , SignatureCallKind::ObjCMethod, dispatchFlags);
320+ auto invoker = lookupObjCPreparedInvoker (dispatchId);
321+ if (invoker != nullptr ) {
322+ invoker ((void *)objc_msgSend, avalues, rvalue);
323+ return true ;
324+ }
325+ }
326+
313327#if defined(__x86_64__)
314328 if (isStret) {
315329 ffi_call (&cif->cif , FFI_FN (objc_msgSend_stret), rvalue, avalues);
@@ -1109,7 +1123,8 @@ size_t getCifArgumentStorageSize(Cif* cif, unsigned int argumentIndex,
11091123 retainedReceiver = true ;
11101124 }
11111125
1112- if (!objcNativeCall (env, cif, self, receiverIsClass, avalues, &rvalue)) {
1126+ if (!objcNativeCall (env, cif, self, receiverIsClass, method->methodOrGetter .dispatchFlags ,
1127+ avalues, &rvalue)) {
11131128 if (retainedReceiver) {
11141129 [self release ];
11151130 }
@@ -1375,7 +1390,8 @@ size_t getCifArgumentStorageSize(Cif* cif, unsigned int argumentIndex,
13751390
13761391 // NSLog(@"objcNativeCall: %p, %@", self, NSStringFromSelector(method->methodOrGetter.selector));
13771392
1378- if (!objcNativeCall (env, cif, self, receiverIsClass, avalues, rvalue)) {
1393+ if (!objcNativeCall (env, cif, self, receiverIsClass, selectedMethod->dispatchFlags , avalues,
1394+ rvalue)) {
13791395 for (id block : fallbackBlocksToRelease) {
13801396 [block release ];
13811397 }
@@ -1470,7 +1486,8 @@ NativeScriptException nativeScriptException(errorMessage != nullptr ? errorMessa
14701486
14711487 // NSLog(@"objcNativeCall: %p, %@", self, NSStringFromSelector(method->methodOrGetter.selector));
14721488
1473- if (!objcNativeCall (env, cif, self, receiverIsClass, avalues, rvalue)) {
1489+ if (!objcNativeCall (env, cif, self, receiverIsClass, method->methodOrGetter .dispatchFlags ,
1490+ avalues, rvalue)) {
14741491 return nullptr ;
14751492 }
14761493
@@ -1534,7 +1551,8 @@ NativeScriptException nativeScriptException(errorMessage != nullptr ? errorMessa
15341551 bool shouldFree = false ;
15351552 cif->argTypes [0 ]->toNative (env, argv, avalues[2 ], &shouldFree, &shouldFree);
15361553
1537- if (!objcNativeCall (env, cif, self, receiverIsClass, avalues, rvalue)) {
1554+ if (!objcNativeCall (env, cif, self, receiverIsClass, method->setter .dispatchFlags , avalues,
1555+ rvalue)) {
15381556 return nullptr ;
15391557 }
15401558
0 commit comments