From 97bec96b43b66ab78af95d2b6c6c24f0d0a8006a Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Wed, 13 Jan 2016 10:00:26 -0800 Subject: [PATCH] Use C int promotion rule to work around BOOL cast. --- Execute.cpp | 29 +++++++++++++++++++++-------- JavaScript.hpp | 1 + libcycript.cy | 7 +++++++ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/Execute.cpp b/Execute.cpp index 5669730..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; @@ -874,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) @@ -1273,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_; @@ -2234,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"); diff --git a/JavaScript.hpp b/JavaScript.hpp index 64dcbac..3265b2e 100644 --- a/JavaScript.hpp +++ b/JavaScript.hpp @@ -46,6 +46,7 @@ extern JSStringRef constructor_s; extern JSStringRef cy_s; extern JSStringRef cyi_s; extern JSStringRef cyt_s; +extern JSStringRef cyt__s; extern JSStringRef length_s; extern JSStringRef message_s; extern JSStringRef name_s; diff --git a/libcycript.cy b/libcycript.cy index 5c80940..7690a29 100644 --- a/libcycript.cy +++ b/libcycript.cy @@ -21,6 +21,13 @@ (function() { +Number.prototype.__defineGetter__('$cyt', function() { + if (this.$cyt_) + return this.$cyt_; + if ((this|0) == this) + return int; +}); + this.typeid = function(object) { return object.$cyt; }; -- 2.45.2