|
3 | 3 |
|
4 | 4 | #include "MethodCif.h" |
5 | 5 | #include "objc/runtime.h" |
| 6 | +#include <iostream> |
6 | 7 |
|
7 | 8 | namespace objc_bridge { |
8 | 9 |
|
9 | | -napi_value JS_BridgedMethod(napi_env env, napi_callback_info cbinfo); |
10 | | -napi_value JS_BridgedGetter(napi_env env, napi_callback_info cbinfo); |
11 | | -napi_value JS_BridgedSetter(napi_env env, napi_callback_info cbinfo); |
12 | | - |
13 | 10 | class ObjCBridgeState; |
14 | 11 |
|
| 12 | +enum MethodDescriptorKind : uint8_t { |
| 13 | + kMethodDescSignatureOffset, |
| 14 | + kMethodDescEncoding, |
| 15 | +}; |
| 16 | + |
| 17 | +class MethodDescriptor { |
| 18 | +public: |
| 19 | + SEL selector; |
| 20 | + |
| 21 | + MethodDescriptorKind kind; |
| 22 | + |
| 23 | + MDSectionOffset signatureOffset; |
| 24 | + std::string encoding; |
| 25 | + |
| 26 | + MethodDescriptor() {} |
| 27 | + |
| 28 | + MethodDescriptor(SEL selector, MDSectionOffset offset) |
| 29 | + : selector(selector), kind(kMethodDescSignatureOffset), |
| 30 | + signatureOffset(offset) {} |
| 31 | + |
| 32 | + MethodDescriptor(SEL selector, char *encoding) |
| 33 | + : selector(selector), kind(kMethodDescEncoding), encoding(encoding) {} |
| 34 | + |
| 35 | + MethodDescriptor(SEL selector, std::string encoding) |
| 36 | + : kind(kMethodDescEncoding), encoding(encoding) { |
| 37 | + this->selector = selector; |
| 38 | + } |
| 39 | +}; |
| 40 | + |
| 41 | +typedef std::unordered_map<std::string, MethodDescriptor> MethodMap; |
| 42 | + |
| 43 | +class ObjCClassMember; |
| 44 | + |
| 45 | +typedef std::unordered_map<std::string, ObjCClassMember> ObjCClassMemberMap; |
| 46 | + |
15 | 47 | class ObjCClassMember { |
16 | 48 | public: |
| 49 | + static void defineMembers(napi_env env, ObjCClassMemberMap &memberMap, |
| 50 | + MDSectionOffset offset, napi_value constructor); |
| 51 | + |
| 52 | + static napi_value JSCall(napi_env env, napi_callback_info cbinfo); |
| 53 | + static napi_value JSGetter(napi_env env, napi_callback_info cbinfo); |
| 54 | + static napi_value JSSetter(napi_env env, napi_callback_info cbinfo); |
| 55 | + |
| 56 | + ObjCClassMember(ObjCBridgeState *bridgeState, SEL selector, |
| 57 | + MDSectionOffset offset, MDMemberFlag flags) |
| 58 | + : bridgeState(bridgeState), |
| 59 | + methodOrGetter(MethodDescriptor(selector, offset)), |
| 60 | + returnOwned((flags & metagen::mdMemberReturnOwned) != 0), |
| 61 | + classMethod((flags & metagen::mdMemberStatic) != 0) {} |
| 62 | + |
| 63 | + ObjCClassMember(ObjCBridgeState *bridgeState, SEL getterSelector, |
| 64 | + SEL setterSelector, MDSectionOffset getterOffset, |
| 65 | + MDSectionOffset setterOffset, MDMemberFlag flags) |
| 66 | + : bridgeState(bridgeState), |
| 67 | + methodOrGetter(MethodDescriptor(getterSelector, getterOffset)), |
| 68 | + setter(MethodDescriptor(setterSelector, setterOffset)), |
| 69 | + returnOwned((flags & metagen::mdMemberReturnOwned) != 0), |
| 70 | + classMethod((flags & metagen::mdMemberStatic) != 0) {} |
| 71 | + |
17 | 72 | ObjCBridgeState *bridgeState; |
18 | | - // Can be either method selector or property getter selector |
19 | | - SEL selector; |
20 | | - SEL setterSelector; |
21 | | - MDSectionOffset signature; |
22 | | - MDSectionOffset setterSignature; |
| 73 | + MethodDescriptor methodOrGetter; |
| 74 | + MethodDescriptor setter; |
23 | 75 | MethodCif *methodCif = nullptr; |
24 | 76 | MethodCif *setterMethodCif = nullptr; |
25 | 77 | bool returnOwned; |
|
0 commit comments