11#include " Interop.h"
2+ #include " Metadata.h"
23#include " ObjCBridge.h"
34#include " Util.h"
45#include " js_native_api.h"
56#include " js_native_api_types.h"
67#include " node_api_util.h"
78
89#import < Foundation/Foundation.h>
10+ #include < memory>
911
1012namespace objc_bridge {
1113
@@ -63,6 +65,8 @@ void registerInterop(napi_env env, napi_value global) {
6365 napi_value Reference = Reference::defineJSClass (env);
6466 bridgeState->referenceClass = make_ref (env, Reference);
6567
68+ napi_value FunctionReference = FunctionReference::defineJSClass (env);
69+
6670 const napi_property_descriptor properties[] = {
6771 {
6872 .utf8name = " Pointer" ,
@@ -82,6 +86,15 @@ void registerInterop(napi_env env, napi_value global) {
8286 .data = nullptr ,
8387 .method = nullptr ,
8488 },
89+ {
90+ .utf8name = " FunctionReference" ,
91+ .attributes = napi_enumerable,
92+ .getter = nullptr ,
93+ .setter = nullptr ,
94+ .value = FunctionReference,
95+ .data = nullptr ,
96+ .method = nullptr ,
97+ },
8598 {
8699 .utf8name = " types" ,
87100 .attributes = napi_enumerable,
@@ -600,4 +613,52 @@ napi_value interop_bufferFromData(napi_env env, napi_callback_info info) {
600613 }
601614}
602615
616+ napi_value FunctionReference::defineJSClass (napi_env env) {
617+ napi_value constructor;
618+ napi_define_class (env, " FunctionReference" , NAPI_AUTO_LENGTH,
619+ FunctionReference::constructor, nullptr , 0 , nullptr ,
620+ &constructor);
621+
622+ return constructor;
623+ }
624+
625+ FunctionReference *FunctionReference::unwrap (napi_env env, napi_value value) {
626+ FunctionReference *ref = nullptr ;
627+ napi_unwrap (env, value, (void **)&ref);
628+ return ref;
629+ }
630+
631+ void FunctionReference::finalize (napi_env env, void *data, void *hint) {
632+ FunctionReference *ref = (FunctionReference *)data;
633+ delete ref;
634+ }
635+
636+ napi_value FunctionReference::constructor (napi_env env,
637+ napi_callback_info info) {
638+ napi_value jsThis;
639+ size_t argc = 1 ;
640+ napi_value arg;
641+ napi_get_cb_info (env, info, &argc, &arg, &jsThis, nullptr );
642+
643+ FunctionReference *reference = new FunctionReference (env, make_ref (env, arg));
644+
645+ napi_ref ref;
646+ napi_wrap (env, jsThis, reference, FunctionReference::finalize, nullptr , &ref);
647+
648+ return jsThis;
649+ }
650+
651+ FunctionReference::~FunctionReference () { napi_delete_reference (env, ref); }
652+
653+ void *FunctionReference::getFunctionPointer (MDSectionOffset offset) {
654+ if (closure == nullptr ) {
655+ closure = std::make_shared<Closure>(
656+ ObjCBridgeState::InstanceData (env)->metadata , offset, true );
657+ closure->env = env;
658+ closure->func = ref;
659+ }
660+
661+ return closure->fnptr ;
662+ }
663+
603664} // namespace objc_bridge
0 commit comments