@@ -363,11 +363,14 @@ inline bool tryObjCNapiDispatch(napi_env env, Cif* cif, id self, bool classMetho
363363 }
364364 }
365365
366- ObjCEngineDirectInvoker engineInvoker =
367- descriptor != nullptr
368- ? reinterpret_cast <ObjCEngineDirectInvoker>(descriptor->engineDirectInvoker )
369- : lookupObjCEngineDirectInvoker (composeSignatureDispatchId (
370- cif->signatureHash , SignatureCallKind::ObjCMethod, dispatchFlags));
366+ ObjCEngineDirectInvoker engineInvoker = nullptr ;
367+ if (!cif->skipGeneratedNapiDispatch ) {
368+ engineInvoker =
369+ descriptor != nullptr
370+ ? reinterpret_cast <ObjCEngineDirectInvoker>(descriptor->engineDirectInvoker )
371+ : lookupObjCEngineDirectInvoker (composeSignatureDispatchId (
372+ cif->signatureHash , SignatureCallKind::ObjCMethod, dispatchFlags));
373+ }
371374 ObjCNapiInvoker invoker =
372375 engineInvoker == nullptr && !cif->skipGeneratedNapiDispatch
373376 ? (descriptor != nullptr
@@ -1474,23 +1477,6 @@ explicit CifReturnStorage(Cif* cif) {
14741477 if (handledDirect) {
14751478 return directResult;
14761479 }
1477-
1478- napi_value stackArgs[16 ];
1479- if (actualArgc <= 16 ) {
1480- for (size_t i = 0 ; i < actualArgc; i++) {
1481- stackArgs[i] = HermesFastArg (fastInfo, i);
1482- }
1483-
1484- return jsCallDirect (env, static_cast <ObjCClassMember*>(HermesFastData (fastInfo)),
1485- HermesFastThisArg (fastInfo), actualArgc, stackArgs);
1486- }
1487-
1488- std::vector<napi_value> heapArgs (actualArgc);
1489- for (size_t i = 0 ; i < actualArgc; i++) {
1490- heapArgs[i] = HermesFastArg (fastInfo, i);
1491- }
1492- return jsCallDirect (env, static_cast <ObjCClassMember*>(HermesFastData (fastInfo)),
1493- HermesFastThisArg (fastInfo), actualArgc, heapArgs.data ());
14941480 }
14951481#endif
14961482
@@ -1567,6 +1553,20 @@ explicit CifReturnStorage(Cif* cif) {
15671553 method->cif = selectedCif;
15681554 }
15691555
1556+ if (selectedCif != nullptr && !selectedCif->isVariadic &&
1557+ selectedCif->argc != actualArgc) {
1558+ Method runtimeMethod = receiverIsClass
1559+ ? class_getClassMethod (receiverClass, selectedMethod->selector )
1560+ : class_getInstanceMethod (receiverClass, selectedMethod->selector );
1561+ if (runtimeMethod != nullptr ) {
1562+ Cif* runtimeCif = method->bridgeState ->getMethodCif (env, runtimeMethod);
1563+ if (runtimeCif != nullptr && runtimeCif->argc == actualArgc) {
1564+ selectedCif = runtimeCif;
1565+ method->cif = selectedCif;
1566+ }
1567+ }
1568+ }
1569+
15701570 if (!method->overloads .empty ()) {
15711571 struct Candidate {
15721572 MethodDescriptor* descriptor;
@@ -1871,8 +1871,6 @@ NativeScriptException nativeScriptException(errorMessage != nullptr ? errorMessa
18711871 if (handledDirect) {
18721872 return directResult;
18731873 }
1874- return jsGetterDirect (env, static_cast <ObjCClassMember*>(HermesFastData (fastInfo)),
1875- HermesFastThisArg (fastInfo));
18761874 }
18771875#endif
18781876
@@ -1986,15 +1984,6 @@ NativeScriptException nativeScriptException(errorMessage != nullptr ? errorMessa
19861984 if (handledDirect) {
19871985 return directResult;
19881986 }
1989-
1990- napi_value value = nullptr ;
1991- if (actualArgc > 0 ) {
1992- value = HermesFastArg (fastInfo, 0 );
1993- } else {
1994- napi_get_undefined (env, &value);
1995- }
1996- return jsSetterDirect (env, static_cast <ObjCClassMember*>(HermesFastData (fastInfo)),
1997- HermesFastThisArg (fastInfo), value);
19981987 }
19991988#endif
20001989
0 commit comments