Skip to content

Commit a6a0d89

Browse files
committed
Refactor NativeCall into ClassMember and CFunction
1 parent 850e7ed commit a6a0d89

File tree

9 files changed

+51
-50
lines changed

9 files changed

+51
-50
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ set(LIB_SOURCE_FILES
8989
src/Block.mm
9090
src/Class.mm
9191
src/Closure.mm
92-
src/NativeCall.mm
92+
src/ClassMember.mm
9393
src/MethodCif.mm
9494
src/TypeConv.mm
9595
src/Util.mm

include/CFunction.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ typedef struct CFunction {
1010
MethodCif *cif;
1111
} CFunction;
1212

13+
napi_value JS_CFunction(napi_env env, napi_callback_info cbinfo);
14+
1315
} // namespace objc_bridge
1416

1517
#endif /* C_FUNCTION_H */

include/Class.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#ifndef BRIDGED_CLASS_H
22
#define BRIDGED_CLASS_H
33

4+
#include "ClassMember.h"
45
#include "MetadataReader.h"
5-
#include "NativeCall.h"
66
#include "node_api_util.h"
77
#include "objc/message.h"
88
#include "objc/runtime.h"
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
namespace objc_bridge {
88

9-
napi_value JS_CFunction(napi_env env, napi_callback_info cbinfo);
109
napi_value JS_BridgedMethod(napi_env env, napi_callback_info cbinfo);
1110
napi_value JS_BridgedGetter(napi_env env, napi_callback_info cbinfo);
1211
napi_value JS_BridgedSetter(napi_env env, napi_callback_info cbinfo);

src/CFunction.mm

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#include "CFunction.h"
2-
#include "NativeCall.h"
2+
#include "ClassMember.h"
33
#include "ObjCBridge.h"
44

55
namespace objc_bridge {
@@ -54,4 +54,46 @@
5454
return cFunction;
5555
}
5656

57+
NAPI_FUNCTION(CFunction) {
58+
void *_offset;
59+
60+
napi_get_cb_info(env, cbinfo, nullptr, nullptr, nullptr, &_offset);
61+
62+
auto bridgeState = ObjCBridgeState::InstanceData(env);
63+
MDSectionOffset offset = (MDSectionOffset)((size_t)_offset);
64+
65+
auto func = bridgeState->getCFunction(env, offset);
66+
auto cif = func->cif;
67+
68+
size_t argc = cif->argc;
69+
napi_get_cb_info(env, cbinfo, &argc, cif->argv, nullptr, nullptr);
70+
71+
void *avalues[cif->argc];
72+
void *rvalue = cif->rvalue;
73+
74+
bool shouldFreeAny = false;
75+
bool shouldFree[cif->argc];
76+
77+
if (cif->argc > 0) {
78+
for (unsigned int i = 0; i < cif->argc; i++) {
79+
shouldFree[i] = false;
80+
avalues[i] = cif->avalues[i];
81+
cif->argTypes[i]->toNative(env, cif->argv[i], avalues[i], &shouldFree[i],
82+
&shouldFreeAny);
83+
}
84+
}
85+
86+
cif->call(func->fnptr, rvalue, avalues);
87+
88+
if (shouldFreeAny) {
89+
for (unsigned int i = 0; i < cif->argc; i++) {
90+
if (shouldFree[i]) {
91+
cif->argTypes[i]->free(env, *((void **)avalues[i]));
92+
}
93+
}
94+
}
95+
96+
return cif->returnType->toJS(env, rvalue);
97+
}
98+
5799
} // namespace objc_bridge

src/Class.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "Class.h"
2+
#include "ClassMember.h"
23
#include "Metadata.h"
34
#include "MetadataReader.h"
4-
#include "NativeCall.h"
55
#include "ObjCBridge.h"
66
#include "Protocol.h"
77
#include "Util.h"
Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "NativeCall.h"
1+
#include "ClassMember.h"
22
#include "MetadataReader.h"
33
#include "ObjCBridge.h"
44
#include "TypeConv.h"
@@ -12,48 +12,6 @@
1212

1313
namespace objc_bridge {
1414

15-
NAPI_FUNCTION(CFunction) {
16-
void *_offset;
17-
18-
napi_get_cb_info(env, cbinfo, nullptr, nullptr, nullptr, &_offset);
19-
20-
auto bridgeState = ObjCBridgeState::InstanceData(env);
21-
MDSectionOffset offset = (MDSectionOffset)((size_t)_offset);
22-
23-
auto func = bridgeState->getCFunction(env, offset);
24-
auto cif = func->cif;
25-
26-
size_t argc = cif->argc;
27-
napi_get_cb_info(env, cbinfo, &argc, cif->argv, nullptr, nullptr);
28-
29-
void *avalues[cif->argc];
30-
void *rvalue = cif->rvalue;
31-
32-
bool shouldFreeAny = false;
33-
bool shouldFree[cif->argc];
34-
35-
if (cif->argc > 0) {
36-
for (unsigned int i = 0; i < cif->argc; i++) {
37-
shouldFree[i] = false;
38-
avalues[i] = cif->avalues[i];
39-
cif->argTypes[i]->toNative(env, cif->argv[i], avalues[i], &shouldFree[i],
40-
&shouldFreeAny);
41-
}
42-
}
43-
44-
cif->call(func->fnptr, rvalue, avalues);
45-
46-
if (shouldFreeAny) {
47-
for (unsigned int i = 0; i < cif->argc; i++) {
48-
if (shouldFree[i]) {
49-
cif->argTypes[i]->free(env, *((void **)avalues[i]));
50-
}
51-
}
52-
}
53-
54-
return cif->returnType->toJS(env, rvalue);
55-
}
56-
5715
inline void objcNativeCall(napi_env env, napi_value jsThis, MethodCif *cif,
5816
id self, void **avalues, void *rvalue) {
5917
// TODO: This seems bad for performance. Is there a better way?

src/ObjCBridge.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
#include "AutoreleasePool.h"
33
#include "Block.h"
44
#include "Class.h"
5+
#include "ClassMember.h"
56
#include "Enum.h"
67
#include "InlineFunctions.h"
78
#include "Interop.h"
89
#include "Metadata.h"
910
#include "MetadataReader.h"
10-
#include "NativeCall.h"
1111
#include "ObjectRef.h"
1212
#include "Struct.h"
1313
#include "TypeConv.h"

src/Protocol.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include "Protocol.h"
2+
#include "ClassMember.h"
23
#include "MetadataReader.h"
3-
#include "NativeCall.h"
44
#include "ObjCBridge.h"
55
#include "Util.h"
66
#include "node_api_util.h"

0 commit comments

Comments
 (0)