]> git.saurik.com Git - cycript.git/commitdiff
Slightly (sort of) improve proxy objects tracking.
authorJay Freeman (saurik) <saurik@saurik.com>
Sun, 3 Jan 2016 10:33:51 +0000 (02:33 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Sun, 3 Jan 2016 10:33:51 +0000 (02:33 -0800)
Java/Cycript.java
Java/Execute.cpp
Utility.hpp

index 79ebe8e29109e79b0b9e6b885da24155a7ee8bea..8fb7817f14e4c2e309ceaf2f07c46fadb61fe12a 100644 (file)
@@ -80,16 +80,18 @@ public static class Wrapper
         if (false)
             return null;
         else if (method.equals(Object$equals))
+            // XXX: this assumes there is only one proxy
             return proxy == args[0];
         else if (method == Object$hashCode)
-            return System.identityHashCode(proxy);
+            // XXX: this assumes there is only one wrapper
+            return hashCode();
         else
             return handle(protect_, method.getName(), args);
     }
 }
 
-public static Object proxy(Class proxy, long protect) {
-    return Proxy.newProxyInstance(proxy.getClassLoader(), new Class[] {proxy}, new Wrapper(protect));
+public static Object proxy(Class proxy, Wrapper wrapper) {
+    return Proxy.newProxyInstance(proxy.getClassLoader(), new Class[] {proxy}, wrapper);
 }
 
 }
index 688de687ae7c20a1a9be242f248dca21760c0dfa..2156045b75063076140cf17f4e66295338c3715c 100644 (file)
@@ -97,6 +97,15 @@ CYJavaForEachPrimitive
 #undef CYJavaForEachPrimitive_
 };
 
+template <typename Type_>
+struct IsJavaPrimitive { static const bool value = false; };
+
+#define CYJavaForEachPrimitive_(T, t, Typ, Type, type) \
+    template <> \
+    struct IsJavaPrimitive<j ## type> { static const bool value = true; };
+CYJavaForEachPrimitive
+#undef CYJavaForEachPrimitive_
+
 // Java References {{{
 template <typename Value_>
 struct CYJavaRef {
@@ -117,6 +126,7 @@ struct CYJavaRef {
         return jni_;
     }
 
+    // XXX: this is only needed to support CYJavaEnv relying on C variadics
     _finline Value_ get() const {
         return value_;
     }
@@ -394,7 +404,7 @@ CYJavaForEachPrimitive
 
 #define CYJavaEnv_(Code) \
     template <typename... Args_> \
-    auto Code(Args_ &&... args) const -> decltype(jni->Code(args...)) { \
+    auto Code(Args_ &&... args) const -> decltype(jni->Code(cy::Forward<Args_>(args)...)) { \
         return _envcall(jni, Code(cy::Forward<Args_>(args)...)); \
     }
 
@@ -993,11 +1003,9 @@ static JSObjectRef JavaClass_callAsConstructor(JSContextRef context, JSObjectRef
     jclass _class(table->value_);
 
     if (table->interface_ && count == 1) {
-        JSObjectRef target(CYCastJSObject(context, arguments[0]));
         auto Cycript$(jni.FindClass("Cycript"));
-        auto Cycript$Make(jni.GetStaticMethodID(Cycript$, "proxy", "(Ljava/lang/Class;J)Ljava/lang/Object;"));
-        auto protect(new CYProtect(context, target));
-        return CYCastJSObject(context, jni.CallObjectMethod<jobject>(Cycript$, Cycript$Make, _class, reinterpret_cast<jlong>(protect)));
+        auto Cycript$Make(jni.GetStaticMethodID(Cycript$, "proxy", "(Ljava/lang/Class;LCycript$Wrapper;)Ljava/lang/Object;"));
+        return CYCastJSObject(context, jni.CallObjectMethod<jobject>(Cycript$, Cycript$Make, _class, CYCastJavaObject(jni, context, CYCastJSObject(context, arguments[0])).get()));
     }
 
     CYJavaSignature bound(count);
index 69d07123a1136343965d7ad594849862d8ce1209..5cfe6abe9ef2debaf67324c2adccced4904efea7 100644 (file)
@@ -49,6 +49,9 @@ inline typename cy::remove_reference<T>::type &&Move(T &&t) {
     return static_cast<typename cy::remove_reference<T>::type &&>(t);
 }
 
+template<bool B, typename T = void> struct EnableIf {};
+template<typename T>                struct EnableIf<true, T> { typedef T type; };
+
 }
 
 #endif/*CYCRIPT_UTILITY_HPP*/