X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/45bc27ef837b88ddabbf6f944c6176d995a56ecf..97bec96b43b66ab78af95d2b6c6c24f0d0a8006a:/Execute.cpp diff --git a/Execute.cpp b/Execute.cpp index b2397d8..18bdce6 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -198,6 +198,7 @@ JSStringRef constructor_s; JSStringRef cy_s; JSStringRef cyi_s; JSStringRef cyt_s; +JSStringRef cyt__s; JSStringRef length_s; JSStringRef message_s; JSStringRef name_s; @@ -671,6 +672,24 @@ bool CYGetOffset(CYPool &pool, JSContextRef context, JSStringRef value, ssize_t return CYGetOffset(CYPoolCString(pool, context, value), index); } +// XXX: this is a horrible back added for CFType +void *CYCastPointerEx_(JSContextRef context, JSObjectRef value) { + JSObjectRef object((JSObjectRef) value); + if (JSValueIsObjectOfClass(context, value, CYPrivate::Class_)) { + Pointer *internal(reinterpret_cast(JSObjectGetPrivate(object))); + return internal->value_; + } + + JSValueRef toPointer(CYGetProperty(context, object, toPointer_s)); + if (CYIsCallable(context, toPointer)) { + JSValueRef value(CYCallAsFunction(context, (JSObjectRef) toPointer, object, 0, NULL)); + _assert(value != NULL); + return CYCastPointer_(context, value); + } + + return NULL; +} + void *CYCastPointer_(JSContextRef context, JSValueRef value, bool *guess) { if (value == NULL) return NULL; @@ -856,31 +875,39 @@ void Function::PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void * _assert(false); } +// XXX: this code is getting worse, not better :/ + #define CYFromFFI_(Type_) \ template <> \ JSValueRef Primitive::FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const { \ JSValueRef value(CYCastJSValue(context, *reinterpret_cast(data))); \ JSObjectRef typed(_jsccall(JSObjectCallAsConstructor, context, CYGetCachedObject(context, CYJSString("Number")), 1, &value)); \ - CYSetProperty(context, typed, cyt_s, CYMakeType(context, *this), kJSPropertyAttributeDontEnum); \ + CYSetProperty(context, typed, cyt__s, CYMakeType(context, *this), kJSPropertyAttributeDontEnum); \ return typed; \ } +#define CYFromFFI_2(Type_) \ +template <> \ +JSValueRef Primitive::FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const { \ + return CYCastJSValue(context, *reinterpret_cast(data)); \ +} + CYFromFFI_(wchar_t) CYFromFFI_(float) CYFromFFI_(double) CYFromFFI_(long double) -CYFromFFI_(signed char) -CYFromFFI_(signed int) +CYFromFFI_2(signed char) +CYFromFFI_2(signed int) CYFromFFI_(signed long int) CYFromFFI_(signed long long int) -CYFromFFI_(signed short int) +CYFromFFI_2(signed short int) -CYFromFFI_(unsigned char) -CYFromFFI_(unsigned int) +CYFromFFI_2(unsigned char) +CYFromFFI_2(unsigned int) CYFromFFI_(unsigned long int) CYFromFFI_(unsigned long long int) -CYFromFFI_(unsigned short int) +CYFromFFI_2(unsigned short int) #ifdef __SIZEOF_INT128__ CYFromFFI_(signed __int128) @@ -1255,7 +1282,10 @@ static sig::Type *CYGetType(CYPool &pool, JSContextRef context, JSValueRef value if (JSValueIsNull(context, value)) return &PointerToVoid_; JSObjectRef object(CYCastJSObject(context, value)); - JSObjectRef type(CYCastJSObject(context, CYGetProperty(context, object, cyt_s))); + JSValueRef check(CYGetProperty(context, object, cyt_s)); + if (JSValueIsUndefined(context, check)) + CYThrow("could not infer type of argument '%s'", CYPoolCString(pool, context, value)); + JSObjectRef type(CYCastJSObject(context, check)); _assert(JSValueIsObjectOfClass(context, type, CYPrivate::Class_)); Type_privateData *internal(reinterpret_cast(JSObjectGetPrivate(type))); return internal->type_; @@ -2216,6 +2246,7 @@ void CYInitializeDynamic() { cy_s = JSStringCreateWithUTF8CString("$cy"); cyi_s = JSStringCreateWithUTF8CString("$cyi"); cyt_s = JSStringCreateWithUTF8CString("$cyt"); + cyt__s = JSStringCreateWithUTF8CString("$cyt_"); length_s = JSStringCreateWithUTF8CString("length"); message_s = JSStringCreateWithUTF8CString("message"); name_s = JSStringCreateWithUTF8CString("name");