X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/efce3bc9fef18190cea1aff33d8ab3f1fa6e8381..96d36aaa89e579a53bd5848c22a462ca8eb13f80:/Execute.cpp diff --git a/Execute.cpp b/Execute.cpp index 5669730..b92b478 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -144,18 +144,6 @@ CYUTF16String CYCastUTF16String(JSStringRef value) { return CYUTF16String(JSStringGetCharactersPtr(value), JSStringGetLength(value)); } -const char *CYPoolCString(CYPool &pool, CYUTF8String utf8) { - return pool.strndup(utf8.data, utf8.size); -} - -CYUTF8String CYPoolUTF8String(CYPool &pool, CYUTF8String utf8) { - return {pool.strndup(utf8.data, utf8.size), utf8.size}; -} - -_visible CYUTF8String CYPoolUTF8String(CYPool &pool, const std::string &value) { - return {pool.strndup(value.data(), value.size()), value.size()}; -} - CYUTF8String CYPoolUTF8String(CYPool &pool, JSContextRef context, JSStringRef value) { return CYPoolUTF8String(pool, CYCastUTF16String(value)); } @@ -198,6 +186,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; @@ -874,31 +863,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) @@ -1273,7 +1270,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_; @@ -2125,11 +2125,11 @@ _visible const char *CYExecute(JSContextRef context, CYPool &pool, CYUTF8String } } -#ifndef __ANDROID__ _visible void CYCancel() { +#ifndef __ANDROID__ cancel_ = true; -} #endif +} const char *CYPoolLibraryPath(CYPool &pool); @@ -2234,6 +2234,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");