@SuppressWarnings("unchecked") protected ObjCSuper getSuper() { if (zuper == null) { Class<? extends ObjCObject> javaClass = (Class<? extends ObjCObject>) getClass().getSuperclass(); ObjCClass objCClass = ObjCClass.getByType(javaClass); while (objCClass.isCustom()) { javaClass = (Class<? extends ObjCObject>) javaClass.getSuperclass(); objCClass = ObjCClass.getByType(javaClass); } zuper = new ObjCSuper(this, objCClass); } return zuper; }
protected ObjCObject(long handle) { initObject(handle); customClass = getObjCClass().isCustom(); }
protected ObjCObject() { long handle = alloc(); setHandle(handle); if (handle != 0) { // Make sure the peer is set immediately even if a different handle // is set later with initObject(). setPeerObject(handle, this); } customClass = getObjCClass().isCustom(); }
private static void registerCallbackMethod(long cls, long selector, long newSelector, Method method) { long superMethod = ObjCRuntime.class_getInstanceMethod(cls, selector); long typeEncoding = ObjCRuntime.method_getTypeEncoding(superMethod); if (!ObjCRuntime.class_addMethod(cls, selector, VM.getCallbackMethodImpl(method), typeEncoding)) { throw new Error( "Failed to register callback method on the ObjectOwnershipHelper: class_addMethod(...) failed"); } // find the super class that is a native class and cache it long superClass = ObjCRuntime.class_getSuperclass(cls); long nativeSuper = 0; while (superClass != 0) { ObjCClass objCClass = ObjCClass.toObjCClass(superClass); if (!objCClass.isCustom()) { nativeSuper = superClass; break; } superClass = ObjCRuntime.class_getSuperclass(superClass); } if (nativeSuper == 0) { throw new Error("Couldn't find native super class for " + VM.newStringUTF(ObjCRuntime.class_getName(cls))); } synchronized (customClassToNativeSuper) { customClassToNativeSuper.put(cls, nativeSuper); } }
/** * Creates a new instance of the specified {@link ObjCClass}. If * {@code makePeer == true} this method MUST be called while the * {@link #objcBridgeLock} is held. */ @SuppressWarnings("unchecked") private static <T extends ObjCObject> T createInstance(ObjCClass objCClass, long handle, int afterMarshaledFlags, boolean makePeer) { Class<T> c = (Class<T>) objCClass.getType(); T o = VM.allocateObject(c); o.setHandle(handle); if (makePeer) { setPeerObject(handle, o); } if (objCClass.isCustom()) { VM.setBoolean(VM.getObjectAddress(o) + CUSTOM_CLASS_OFFSET, true); } o.afterMarshaled(afterMarshaledFlags); return o; }
@SuppressWarnings("unchecked") protected ObjCSuper getSuper() { if (zuper == null) { Class<? extends ObjCObject> javaClass = (Class<? extends ObjCObject>) getClass().getSuperclass(); ObjCClass objCClass = ObjCClass.getByType(javaClass); while (objCClass.isCustom()) { javaClass = (Class<? extends ObjCObject>) javaClass.getSuperclass(); objCClass = ObjCClass.getByType(javaClass); } zuper = new ObjCSuper(this, objCClass); } return zuper; }
protected ObjCObject(long handle) { initObject(handle); customClass = getObjCClass().isCustom(); }
protected ObjCObject() { long handle = alloc(); setHandle(handle); if (handle != 0) { // Make sure the peer is set immediately even if a different handle // is set later with initObject(). setPeerObject(handle, this); } customClass = getObjCClass().isCustom(); }
private static void registerCallbackMethod(long cls, long selector, long newSelector, Method method) { long superMethod = ObjCRuntime.class_getInstanceMethod(cls, selector); long typeEncoding = ObjCRuntime.method_getTypeEncoding(superMethod); if (!ObjCRuntime.class_addMethod(cls, selector, VM.getCallbackMethodImpl(method), typeEncoding)) { throw new Error( "Failed to register callback method on the ObjectOwnershipHelper: class_addMethod(...) failed"); } // find the super class that is a native class and cache it long superClass = ObjCRuntime.class_getSuperclass(cls); long nativeSuper = 0; while (superClass != 0) { ObjCClass objCClass = ObjCClass.toObjCClass(superClass); if (!objCClass.isCustom()) { nativeSuper = superClass; break; } superClass = ObjCRuntime.class_getSuperclass(superClass); } if (nativeSuper == 0) { throw new Error("Couldn't find native super class for " + VM.newStringUTF(ObjCRuntime.class_getName(cls))); } synchronized (customClassToNativeSuper) { customClassToNativeSuper.put(cls, nativeSuper); } }
/** * Creates a new instance of the specified {@link ObjCClass}. If * {@code makePeer == true} this method MUST be called while the * {@link #objcBridgeLock} is held. */ @SuppressWarnings("unchecked") private static <T extends ObjCObject> T createInstance(ObjCClass objCClass, long handle, int afterMarshaledFlags, boolean makePeer) { Class<T> c = (Class<T>) objCClass.getType(); T o = VM.allocateObject(c); o.setHandle(handle); if (makePeer) { setPeerObject(handle, o); } if (objCClass.isCustom()) { VM.setBoolean(VM.getObjectAddress(o) + CUSTOM_CLASS_OFFSET, true); } o.afterMarshaled(afterMarshaledFlags); return o; }