}
static void *CYCastSymbol(const char *name) {
+ for (CYHook *hook : GetHooks())
+ if (hook->CastSymbol != NULL)
+ if (void *value = (*hook->CastSymbol)(name))
+ return value;
return dlsym(RTLD_DEFAULT, name);
}
bool (*PoolFFI)(CYPool *, JSContextRef, sig::Type *, ffi_type *, void *, JSValueRef);
JSValueRef (*FromFFI)(JSContextRef, sig::Type *, ffi_type *, void *, bool, JSObjectRef);
+
+ void *(*CastSymbol)(const char *);
};
struct CYRegisterHook {
imp = NULL;
CYPoolTry {
- NSMethodSignature *method([self methodSignatureForSelector:_cmd]);
- if (method == nil)
- throw CYJSError(context, "unrecognized selector %s sent to object %p", sel_getName(_cmd), self);
- type = CYPoolCString(pool, context, [method _typeString]);
+ if (NSMethodSignature *method = [self methodSignatureForSelector:_cmd])
+ type = CYPoolCString(pool, context, [method _typeString]);
+ else
+ type = NULL;
} CYPoolCatch(NULL)
+
+ if (type == NULL)
+ throw CYJSError(context, "unrecognized selector %s sent to object %p", sel_getName(_cmd), self);
}
void *setup[2];
CYSetPrototype(context, CYCastJSObject(context, CYGetProperty(context, Selector, prototype_s)), Function_prototype);
} CYPoolCatch() }
+static void *CYObjectiveC_CastSymbol(const char *name) {
+ if (false);
+#ifdef __GNU_LIBOBJC__
+ else if (strcmp(name, "object_getClass") == 0)
+ return reinterpret_cast<void *>(&object_getClass);
+#endif
+ return NULL;
+}
+
static CYHook CYObjectiveCHook = {
&CYObjectiveC_ExecuteStart,
&CYObjectiveC_ExecuteEnd,
&CYObjectiveC_SetupContext,
&CYObjectiveC_PoolFFI,
&CYObjectiveC_FromFFI,
+ &CYObjectiveC_CastSymbol,
};
CYRegisterHook CYObjectiveC(&CYObjectiveCHook);