From 0b5f88f67491643e48cfb14b28a4e894296ae98f Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Tue, 5 Jan 2016 01:04:22 -0800 Subject: [PATCH] Try a new (safer) mechanism to get object private. --- Execute.cpp | 11 ++++++++--- Internal.hpp | 5 +++++ Java/Execute.cpp | 40 ++++++++++++++++++++-------------------- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/Execute.cpp b/Execute.cpp index 78aaf1b..375facf 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -634,10 +634,13 @@ JSObjectRef CYMakePointer(JSContextRef context, void *pointer, const sig::Type & return Pointer::Make(context, pointer, type, context, owner); } -static JSObjectRef CYMakeFunctor(JSContextRef context, void (*function)(), bool variadic, const sig::Signature &signature) { +static JSValueRef CYMakeFunctor(JSContextRef context, void (*function)(), bool variadic, const sig::Signature &signature) { + if (function == NULL) + return CYJSNull(context); return JSObjectMake(context, Functor_, new cy::Functor(function, variadic, signature)); } +// XXX: remove this, as it is really stupid static JSObjectRef CYMakeFunctor(JSContextRef context, const char *symbol, const char *encoding) { void (*function)()(reinterpret_cast(CYCastSymbol(symbol))); if (function == NULL) @@ -967,7 +970,7 @@ JSObjectRef CYGetCachedObject(JSContextRef context, JSStringRef name) { return CYCastJSObject(context, CYGetCachedValue(context, name)); } -static JSObjectRef CYMakeFunctor(JSContextRef context, JSValueRef value, bool variadic, const sig::Signature &signature) { +static JSValueRef CYMakeFunctor(JSContextRef context, JSValueRef value, bool variadic, const sig::Signature &signature) { JSObjectRef Function(CYGetCachedObject(context, CYJSString("Function"))); bool function(_jsccall(JSValueIsInstanceOfConstructor, context, value, Function)); @@ -1682,6 +1685,7 @@ static JSObjectRef Type_callAsConstructor(JSContextRef context, JSObjectRef obje return pointer; } CYCatch(NULL) } +// XXX: I don't even think the user should be allowed to do this static JSObjectRef Functor_new(JSContextRef context, JSObjectRef object, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { if (count != 2) throw CYJSError(context, "incorrect number of arguments to Functor constructor"); @@ -1689,7 +1693,8 @@ static JSObjectRef Functor_new(JSContextRef context, JSObjectRef object, size_t const char *encoding(CYPoolCString(pool, context, arguments[1])); sig::Signature signature; sig::Parse(pool, &signature, encoding, &Structor_); - return CYMakeFunctor(context, arguments[0], false, signature); + // XXX: this can try to return null, and I guess then it just fails + return CYCastJSObject(context, CYMakeFunctor(context, arguments[0], false, signature)); } CYCatch(NULL) } static JSValueRef CArray_callAsFunction_toPointer(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { diff --git a/Internal.hpp b/Internal.hpp index 9228379..464fe93 100644 --- a/Internal.hpp +++ b/Internal.hpp @@ -62,6 +62,11 @@ struct CYPrivate : CYSetPrototype(context, object, prototype); return object; } + + static Internal_ *Get(JSContextRef context, JSObjectRef object) { + _assert(JSValueIsObjectOfClass(context, object, Class_)); + return static_cast(JSObjectGetPrivate(object)); + } }; struct Type_privateData : diff --git a/Java/Execute.cpp b/Java/Execute.cpp index f450a5d..f382bc9 100644 --- a/Java/Execute.cpp +++ b/Java/Execute.cpp @@ -940,7 +940,7 @@ static bool CYCastJavaArguments(const CYJavaFrame &frame, const CYJavaShorty &sh } static JSValueRef JavaMethod_callAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { - CYJavaMethod *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaMethod::Get(context, object)); CYJavaObject *self(CYGetJavaObject(context, _this)); CYJavaEnv jni(self->value_); @@ -970,7 +970,7 @@ CYJavaForEachPrimitive } CYCatch(NULL) } static JSValueRef JavaStaticMethod_callAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { - CYJavaMethod *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaStaticMethod::Get(context, object)); CYJavaClass *table(CYGetJavaTable(context, _this)); CYJavaEnv jni(table->value_); @@ -1000,7 +1000,7 @@ CYJavaForEachPrimitive } CYCatch(NULL) } static JSObjectRef JavaClass_callAsConstructor(JSContextRef context, JSObjectRef object, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { - CYJavaClass *table(reinterpret_cast(JSObjectGetPrivate(object))); + auto table(CYJavaClass::Get(context, object)); CYJavaEnv jni(table->value_); jclass _class(table->value_); @@ -1025,7 +1025,7 @@ static JSObjectRef JavaClass_callAsConstructor(JSContextRef context, JSObjectRef } CYCatch(NULL) } static bool JavaStaticInterior_hasProperty(JSContextRef context, JSObjectRef object, JSStringRef property) { - CYJavaStaticInterior *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaStaticInterior::Get(context, object)); CYJavaClass *table(internal->table_); CYPool pool; auto name(CYPoolUTF8String(pool, context, property)); @@ -1036,7 +1036,7 @@ static bool JavaStaticInterior_hasProperty(JSContextRef context, JSObjectRef obj } static JSValueRef JavaStaticInterior_getProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry { - CYJavaStaticInterior *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaStaticInterior::Get(context, object)); CYJavaClass *table(internal->table_); CYJavaEnv jni(table->value_); CYPool pool; @@ -1058,7 +1058,7 @@ CYJavaForEachPrimitive } CYCatch(NULL) } static bool JavaStaticInterior_setProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef value, JSValueRef *exception) { CYTry { - CYJavaStaticInterior *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaStaticInterior::Get(context, object)); CYJavaClass *table(internal->table_); CYJavaEnv jni(table->value_); CYPool pool; @@ -1083,19 +1083,19 @@ CYJavaForEachPrimitive } CYCatch(false) } static void JavaStaticInterior_getPropertyNames(JSContextRef context, JSObjectRef object, JSPropertyNameAccumulatorRef names) { - CYJavaStaticInterior *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaStaticInterior::Get(context, object)); CYJavaClass *table(internal->table_); for (const auto &field : table->static_) JSPropertyNameAccumulatorAddName(names, CYJSString(field.first)); } static JSValueRef JavaClass_getProperty_class(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry { - CYJavaClass *table(reinterpret_cast(JSObjectGetPrivate(object))); + auto table(CYJavaClass::Get(context, object)); return CYCastJSValue(context, table->value_); } CYCatch(NULL) } static bool JavaInterior_hasProperty(JSContextRef context, JSObjectRef object, JSStringRef property) { - CYJavaInterior *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaInterior::Get(context, object)); CYJavaClass *table(internal->table_); CYPool pool; auto name(CYPoolUTF8String(pool, context, property)); @@ -1106,7 +1106,7 @@ static bool JavaInterior_hasProperty(JSContextRef context, JSObjectRef object, J } static JSValueRef JavaInterior_getProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry { - CYJavaInterior *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaInterior::Get(context, object)); CYJavaEnv jni(internal->value_); CYJavaClass *table(internal->table_); CYPool pool; @@ -1128,7 +1128,7 @@ CYJavaForEachPrimitive } CYCatch(NULL) } static bool JavaInterior_setProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef value, JSValueRef *exception) { CYTry { - CYJavaInterior *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaInterior::Get(context, object)); CYJavaEnv jni(internal->value_); CYJavaClass *table(internal->table_); CYPool pool; @@ -1153,30 +1153,30 @@ CYJavaForEachPrimitive } CYCatch(false) } static void JavaInterior_getPropertyNames(JSContextRef context, JSObjectRef object, JSPropertyNameAccumulatorRef names) { - CYJavaInterior *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaInterior::Get(context, object)); CYJavaClass *table(internal->table_); for (const auto &field : table->instance_) JSPropertyNameAccumulatorAddName(names, CYJSString(field.first)); } static JSValueRef JavaObject_getProperty_constructor(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry { - CYJavaObject *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaObject::Get(context, object)); CYJavaEnv jni(internal->value_); return CYGetJavaClass(context, jni.GetObjectClass(internal->value_)); } CYCatch(NULL) } static JSValueRef JavaClass_getProperty_$cyi(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry { - CYJavaClass *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaClass::Get(context, object)); return CYJavaStaticInterior::Make(context, internal->value_, internal); } CYCatch(NULL) } static JSValueRef JavaObject_getProperty_$cyi(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry { - CYJavaObject *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaObject::Get(context, object)); return CYJavaInterior::Make(context, internal->value_, internal->table_); } CYCatch(NULL) } static JSValueRef JavaClass_callAsFunction_toCYON(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { - CYJavaClass *internal(reinterpret_cast(JSObjectGetPrivate(_this))); + auto internal(CYJavaClass::Get(context, _this)); CYJavaEnv jni(internal->value_); auto Class$(jni.FindClass("java/lang/Class")); auto Class$getCanonicalName(jni.GetMethodID(Class$, "getCanonicalName", "()Ljava/lang/String;")); @@ -1194,7 +1194,7 @@ static JSValueRef JavaStaticMethod_callAsFunction_toCYON(JSContextRef context, J } CYCatch(NULL) } static JSValueRef JavaArray_getProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry { - CYJavaArray *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaArray::Get(context, object)); CYJavaEnv jni(internal->value_); if (JSStringIsEqual(property, length_s)) return CYCastJSValue(context, jni.GetArrayLength(internal->value_)); @@ -1220,7 +1220,7 @@ CYJavaForEachPrimitive } CYCatch(NULL) } static bool JavaArray_setProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef value, JSValueRef *exception) { CYTry { - CYJavaArray *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaArray::Get(context, object)); CYJavaEnv jni(internal->value_); CYPool pool; @@ -1246,7 +1246,7 @@ CYJavaForEachPrimitive } CYCatch(false) } static JSValueRef JavaPackage_callAsFunction_toCYON(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { - CYJavaPackage *internal(reinterpret_cast(JSObjectGetPrivate(_this))); + auto internal(CYJavaPackage::Get(context, _this)); std::ostringstream name; for (auto &package : internal->package_) name << package << '.'; @@ -1259,7 +1259,7 @@ static bool CYJavaPackage_hasProperty(JSContextRef context, JSObjectRef object, } static JSValueRef CYJavaPackage_getProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry { - CYJavaPackage *internal(reinterpret_cast(JSObjectGetPrivate(object))); + auto internal(CYJavaPackage::Get(context, object)); CYJavaPackage::Path package(internal->package_); CYPool pool; -- 2.45.2