1313#include " ClassBuilder.h"
1414#include " Closure.h"
1515#include " Interop.h"
16+ #include " HermesFastCallbackInfo.h"
1617#include " MetadataReader.h"
1718#include " ObjCBridge.h"
1819#include " SignatureDispatch.h"
@@ -1419,13 +1420,51 @@ explicit CifReturnStorage(Cif* cif) {
14191420}
14201421
14211422napi_value ObjCClassMember::jsCall (napi_env env, napi_callback_info cbinfo) {
1423+ #ifdef TARGET_ENGINE_HERMES
1424+ if (auto * fastInfo = TryGetHermesFastCallbackInfo (env, cbinfo)) {
1425+ napi_value stackArgs[16 ];
1426+ std::vector<napi_value> heapArgs;
1427+ napi_value* args = stackArgs;
1428+ const size_t actualArgc = fastInfo->argc ;
1429+ if (actualArgc > 16 ) {
1430+ heapArgs.resize (actualArgc);
1431+ args = heapArgs.data ();
1432+ }
1433+ for (size_t i = 0 ; i < actualArgc; i++) {
1434+ args[i] = HermesFastArg (fastInfo, i);
1435+ }
1436+
1437+ return jsCallDirect (env, static_cast <ObjCClassMember*>(fastInfo->data ),
1438+ HermesFastThisArg (fastInfo), actualArgc, args);
1439+ }
1440+ #endif
1441+
14221442 napi_value jsThis;
1423- ObjCClassMember* method;
1443+ ObjCClassMember* method = nullptr ;
14241444
14251445 size_t actualArgc = 16 ;
14261446 napi_value stackArgs[16 ];
14271447 napi_get_cb_info (env, cbinfo, &actualArgc, stackArgs, &jsThis, (void **)&method);
14281448
1449+ if (actualArgc > 16 ) {
1450+ std::vector<napi_value> dynamicArgs (actualArgc);
1451+ size_t argcRetry = actualArgc;
1452+ napi_get_cb_info (env, cbinfo, &argcRetry, dynamicArgs.data (), &jsThis, (void **)&method);
1453+ dynamicArgs.resize (argcRetry);
1454+ return jsCallDirect (env, method, jsThis, argcRetry, dynamicArgs.data ());
1455+ }
1456+
1457+ return jsCallDirect (env, method, jsThis, actualArgc, stackArgs);
1458+ }
1459+
1460+ napi_value ObjCClassMember::jsCallDirect (napi_env env, ObjCClassMember* method,
1461+ napi_value jsThis, size_t actualArgc,
1462+ const napi_value* rawCallArgs) {
1463+ if (method == nullptr ) {
1464+ napi_throw_error (env, " NativeScriptException" , " Missing Objective-C method metadata." );
1465+ return nullptr ;
1466+ }
1467+
14291468 id self = assertSelf (env, jsThis, method);
14301469
14311470 if (self == nullptr ) {
@@ -1461,17 +1500,10 @@ explicit CifReturnStorage(Cif* cif) {
14611500 return resolved;
14621501 };
14631502
1464- const napi_value* callArgs = stackArgs ;
1503+ const napi_value* callArgs = actualArgc > 0 ? rawCallArgs : nullptr ;
14651504 std::vector<napi_value> dynamicArgs;
1466- if (actualArgc > 16 ) {
1467- dynamicArgs.resize (actualArgc);
1468- size_t argcRetry = actualArgc;
1469- napi_get_cb_info (env, cbinfo, &argcRetry, dynamicArgs.data (), &jsThis, (void **)&method);
1470- dynamicArgs.resize (argcRetry);
1471- actualArgc = argcRetry;
1472- callArgs = dynamicArgs.data ();
1473- } else if (!method->overloads .empty ()) {
1474- dynamicArgs.assign (stackArgs, stackArgs + actualArgc);
1505+ if (!method->overloads .empty () && actualArgc > 0 && rawCallArgs != nullptr ) {
1506+ dynamicArgs.assign (rawCallArgs, rawCallArgs + actualArgc);
14751507 callArgs = dynamicArgs.data ();
14761508 }
14771509
@@ -1756,11 +1788,28 @@ NativeScriptException nativeScriptException(errorMessage != nullptr ? errorMessa
17561788}
17571789
17581790napi_value ObjCClassMember::jsGetter (napi_env env, napi_callback_info cbinfo) {
1791+ #ifdef TARGET_ENGINE_HERMES
1792+ if (auto * fastInfo = TryGetHermesFastCallbackInfo (env, cbinfo)) {
1793+ return jsGetterDirect (env, static_cast <ObjCClassMember*>(fastInfo->data ),
1794+ HermesFastThisArg (fastInfo));
1795+ }
1796+ #endif
1797+
17591798 napi_value jsThis;
1760- ObjCClassMember* method;
1799+ ObjCClassMember* method = nullptr ;
17611800
17621801 napi_get_cb_info (env, cbinfo, nullptr , nullptr , &jsThis, (void **)&method);
17631802
1803+ return jsGetterDirect (env, method, jsThis);
1804+ }
1805+
1806+ napi_value ObjCClassMember::jsGetterDirect (napi_env env, ObjCClassMember* method,
1807+ napi_value jsThis) {
1808+ if (method == nullptr ) {
1809+ napi_throw_error (env, " NativeScriptException" , " Missing Objective-C getter metadata." );
1810+ return nullptr ;
1811+ }
1812+
17641813 id self = assertSelf (env, jsThis, method);
17651814
17661815 if (self == nullptr ) {
@@ -1822,17 +1871,44 @@ NativeScriptException nativeScriptException(errorMessage != nullptr ? errorMessa
18221871}
18231872
18241873napi_value ObjCClassMember::jsReadOnlySetter (napi_env env, napi_callback_info cbinfo) {
1874+ return jsReadOnlySetterDirect (env);
1875+ }
1876+
1877+ napi_value ObjCClassMember::jsReadOnlySetterDirect (napi_env env) {
18251878 napi_throw_error (env, nullptr , " Attempted to assign to readonly property." );
18261879 return nullptr ;
18271880}
18281881
18291882napi_value ObjCClassMember::jsSetter (napi_env env, napi_callback_info cbinfo) {
1883+ #ifdef TARGET_ENGINE_HERMES
1884+ if (auto * fastInfo = TryGetHermesFastCallbackInfo (env, cbinfo)) {
1885+ napi_value value = nullptr ;
1886+ if (fastInfo->argc > 0 ) {
1887+ value = HermesFastArg (fastInfo, 0 );
1888+ } else {
1889+ napi_get_undefined (env, &value);
1890+ }
1891+ return jsSetterDirect (env, static_cast <ObjCClassMember*>(fastInfo->data ),
1892+ HermesFastThisArg (fastInfo), value);
1893+ }
1894+ #endif
1895+
18301896 napi_value jsThis, argv;
18311897 size_t argc = 1 ;
1832- ObjCClassMember* method;
1898+ ObjCClassMember* method = nullptr ;
18331899
18341900 napi_get_cb_info (env, cbinfo, &argc, &argv, &jsThis, (void **)&method);
18351901
1902+ return jsSetterDirect (env, method, jsThis, argv);
1903+ }
1904+
1905+ napi_value ObjCClassMember::jsSetterDirect (napi_env env, ObjCClassMember* method,
1906+ napi_value jsThis, napi_value value) {
1907+ if (method == nullptr ) {
1908+ napi_throw_error (env, " NativeScriptException" , " Missing Objective-C setter metadata." );
1909+ return nullptr ;
1910+ }
1911+
18361912 id self = assertSelf (env, jsThis, method);
18371913
18381914 if (self == nullptr ) {
@@ -1850,7 +1926,7 @@ NativeScriptException nativeScriptException(errorMessage != nullptr ? errorMessa
18501926 }
18511927
18521928 if (cif->argc > 0 ) {
1853- cif->argv [0 ] = argv ;
1929+ cif->argv [0 ] = value ;
18541930 }
18551931
18561932 bool didDirectInvoke = false ;
@@ -1875,7 +1951,7 @@ NativeScriptException nativeScriptException(errorMessage != nullptr ? errorMessa
18751951 void * rvalue = nullptr ;
18761952
18771953 bool shouldFree = false ;
1878- cif->argTypes [0 ]->toNative (env, argv , avalues[2 ], &shouldFree, &shouldFree);
1954+ cif->argTypes [0 ]->toNative (env, value , avalues[2 ], &shouldFree, &shouldFree);
18791955
18801956 if (!objcNativeCall (env, cif, self, receiverIsClass, &method->setter ,
18811957 method->setter .dispatchFlags , avalues, rvalue)) {
0 commit comments