Skip to content

Commit 6a6e6dd

Browse files
committed
fix classMethod flag in native call
1 parent f7873d6 commit 6a6e6dd

File tree

5 files changed

+20
-18
lines changed

5 files changed

+20
-18
lines changed

include/MethodCif.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ class MethodCif {
3131
MethodCif(napi_env env, std::string typeEncoding);
3232
MethodCif(napi_env env, MDMetadataReader *reader, MDSectionOffset offset,
3333
bool isMethod = false);
34-
35-
void call(void *fnptr, void *rvalue, void **avalues);
3634
};
3735

3836
} // namespace objc_bridge

src/CFunction.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
}
8282
}
8383

84-
cif->call(func->fnptr, rvalue, avalues);
84+
ffi_call(&cif->cif, FFI_FN(func->fnptr), rvalue, avalues);
8585

8686
if (shouldFreeAny) {
8787
for (unsigned int i = 0; i < cif->argc; i++) {

src/ClassMember.mm

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,9 @@
124124
}
125125

126126
inline void objcNativeCall(napi_env env, napi_value jsThis, MethodCif *cif,
127-
id self, void **avalues, void *rvalue,
128-
bool classMethod) {
127+
id self, void **avalues, void *rvalue) {
128+
bool classMethod = class_isMetaClass(object_getClass(self));
129+
129130
bool supercall =
130131
classMethod
131132
? class_conformsToProtocol(self,
@@ -148,12 +149,12 @@ inline void objcNativeCall(napi_env env, napi_value jsThis, MethodCif *cif,
148149
if (!supercall) {
149150
#if defined(__x86_64__)
150151
if (isStret) {
151-
cif->call((void *)objc_msgSend_stret, rvalue, avalues);
152+
ffi_call(&cif->cif, FFI_FN(objc_msgSend_stret), rvalue, avalues);
152153
} else {
153-
cif->call((void *)objc_msgSend, rvalue, avalues);
154+
ffi_call(&cif->cif, FFI_FN(objc_msgSend), rvalue, avalues);
154155
}
155156
#else
156-
cif->call((void *)objc_msgSend, rvalue, avalues);
157+
ffi_call(&cif->cif, FFI_FN(objc_msgSend), rvalue, avalues);
157158
#endif
158159
} else {
159160
struct objc_super superobj = {self,
@@ -162,12 +163,12 @@ inline void objcNativeCall(napi_env env, napi_value jsThis, MethodCif *cif,
162163
avalues[0] = (void *)&superobjPtr;
163164
#if defined(__x86_64__)
164165
if (isStret) {
165-
cif->call((void *)objc_msgSendSuper_stret, rvalue, avalues);
166+
ffi_call(&cif->cif, FFI_FN(objc_msgSendSuper_stret), rvalue, avalues);
166167
} else {
167-
cif->call((void *)objc_msgSendSuper, rvalue, avalues);
168+
ffi_call(&cif->cif, FFI_FN(objc_msgSendSuper), rvalue, avalues);
168169
}
169170
#else
170-
cif->call((void *)objc_msgSendSuper, rvalue, avalues);
171+
ffi_call(&cif->cif, FFI_FN(objc_msgSendSuper), rvalue, avalues);
171172
#endif
172173
}
173174
}
@@ -212,7 +213,7 @@ inline void objcNativeCall(napi_env env, napi_value jsThis, MethodCif *cif,
212213
}
213214
}
214215

215-
objcNativeCall(env, jsThis, cif, self, avalues, rvalue, method->classMethod);
216+
objcNativeCall(env, jsThis, cif, self, avalues, rvalue);
216217

217218
for (unsigned int i = 0; i < cif->argc; i++) {
218219
if (shouldFree[i]) {
@@ -252,7 +253,7 @@ inline void objcNativeCall(napi_env env, napi_value jsThis, MethodCif *cif,
252253
void *avalues[2] = {&self, &method->methodOrGetter.selector};
253254
void *rvalue = cif->rvalue;
254255

255-
objcNativeCall(env, jsThis, cif, self, avalues, rvalue, method->classMethod);
256+
objcNativeCall(env, jsThis, cif, self, avalues, rvalue);
256257

257258
if (cif->returnType->kind == mdTypeInstanceObject) {
258259
napi_value constructor = jsThis;
@@ -290,7 +291,7 @@ inline void objcNativeCall(napi_env env, napi_value jsThis, MethodCif *cif,
290291
bool shouldFree = false;
291292
cif->argTypes[0]->toNative(env, argv, avalues[2], &shouldFree, &shouldFree);
292293

293-
objcNativeCall(env, jsThis, cif, self, avalues, rvalue, method->classMethod);
294+
objcNativeCall(env, jsThis, cif, self, avalues, rvalue);
294295

295296
if (shouldFree) {
296297
cif->argTypes[0]->free(env, *((void **)avalues[2]));

src/MethodCif.mm

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,4 @@
154154
rvalueLength = cif.rtype->size;
155155
}
156156

157-
void MethodCif::call(void *fnptr, void *rvalue, void **avalues) {
158-
ffi_call(&cif, FFI_FN(fnptr), rvalue, avalues);
159-
}
160-
161157
} // namespace objc_bridge

src/Object.mm

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "node_api_util.h"
55

66
#import <Foundation/Foundation.h>
7+
#include <objc/runtime.h>
78

89
namespace objc_bridge {
910

@@ -70,6 +71,8 @@ void finalize_objc_object_borrowed(napi_env, void *data, void *hint) {
7071
bridgeState->objectRefs.erase(object);
7172
}
7273

74+
Class UIPlaceholderColorClass = objc_getClass("UIPlaceholderColor");
75+
7376
napi_value ObjCBridgeState::getObject(napi_env env, id obj,
7477
napi_value constructor,
7578
ObjectOwnership ownership) {
@@ -97,6 +100,10 @@ void finalize_objc_object_borrowed(napi_env, void *data, void *hint) {
97100
return nullptr;
98101
}
99102

103+
if (cls == UIPlaceholderColorClass) {
104+
ownership = kBorrowedObject;
105+
}
106+
100107
bool isClass = false;
101108

102109
if (class_isMetaClass(cls)) {

0 commit comments

Comments
 (0)