java-gobject-introspection r45 - in trunk: src/org/gnome/gir/compiler src/org/gnome/gir/gobject src/org/gnome/gir/repository stub-examples



Author: walters
Date: Mon Sep  8 23:32:35 2008
New Revision: 45
URL: http://svn.gnome.org/viewvc/java-gobject-introspection?rev=45&view=rev

Log:
Require namespace in static initializer; recursively search for proxy parents

This fixes the HelloClutter code.


Modified:
   trunk/src/org/gnome/gir/compiler/CodeFactory.java
   trunk/src/org/gnome/gir/gobject/GType.java
   trunk/src/org/gnome/gir/gobject/NativeObject.java
   trunk/src/org/gnome/gir/repository/Repository.java
   trunk/stub-examples/Test.java

Modified: trunk/src/org/gnome/gir/compiler/CodeFactory.java
==============================================================================
--- trunk/src/org/gnome/gir/compiler/CodeFactory.java	(original)
+++ trunk/src/org/gnome/gir/compiler/CodeFactory.java	Mon Sep  8 23:32:35 2008
@@ -1695,7 +1695,12 @@
 		mv.visitInsn(DUP);
 		mv.visitMethodInsn(INVOKESPECIAL, internalsInner.internalName, "<init>", "()V");
 		mv.visitFieldInsn(PUTSTATIC, internals.internalName, "invocationOptions", "Ljava/util/Map;");
-		globals.clinit = mv;		
+
+		mv.visitMethodInsn(INVOKESTATIC, "org/gnome/gir/repository/Repository", "getDefault", "()Lorg/gnome/gir/repository/Repository;");
+		mv.visitLdcInsn(globals.namespace);
+		mv.visitMethodInsn(INVOKEVIRTUAL, "org/gnome/gir/repository/Repository", "requireNoFail", "(Ljava/lang/String;)V");		
+		
+		globals.clinit = mv;
 	}
 	
 	private void compileNamespaceSingle(String namespace) {

Modified: trunk/src/org/gnome/gir/gobject/GType.java
==============================================================================
--- trunk/src/org/gnome/gir/gobject/GType.java	(original)
+++ trunk/src/org/gnome/gir/gobject/GType.java	Mon Sep  8 23:32:35 2008
@@ -165,7 +165,7 @@
     /* If we haven't yet seen a GType, we do a full search of the repository.  This
      * is VERY slow right now, so it's cached.
      */
-    private static synchronized final Class<?> lookupProxyClass(NativeLong g_type) {
+    public static synchronized final Class<?> lookupProxyClass(NativeLong g_type) {
     	Class<?> klass = classTypeMap.get(g_type);
     	if (klass != null)
     		return klass;
@@ -186,10 +186,15 @@
     	return lookupProxyClass((NativeLong) this);
     }
     
-    public static final Class<?> lookupProxyClass(Pointer ptr) {
+    public static final GType objectPeekType(Pointer ptr) {
     	Pointer g_class = ptr.getPointer(0);
     	NativeLong g_type = g_class.getNativeLong(0);
-    	return lookupProxyClass(g_type);
+    	return valueOf(g_type.longValue());
+    }
+    
+    public static final Class<?> lookupProxyClass(Pointer ptr) {
+    	GType gtype = objectPeekType(ptr);
+    	return lookupProxyClass(gtype);
     };
     
     /**
@@ -274,6 +279,10 @@
         return valueOf(((Number) nativeValue).longValue());
     }
     
+    public GType getParent() {
+    	return GObjectAPI.gobj.g_type_parent(this);
+    }
+    
     public String toString() {
     	return "GType(" + GObjectAPI.gobj.g_type_name(this) + ")";
     }

Modified: trunk/src/org/gnome/gir/gobject/NativeObject.java
==============================================================================
--- trunk/src/org/gnome/gir/gobject/NativeObject.java	(original)
+++ trunk/src/org/gnome/gir/gobject/NativeObject.java	Mon Sep  8 23:32:35 2008
@@ -238,8 +238,19 @@
     }
     
     @SuppressWarnings("unchecked")
+	protected static Class<?> lookupProxyChain(GType gtype) {
+    	Class<?> ret = null;
+    	while (ret == null && !gtype.equals(GType.OBJECT)) {
+    		ret = GType.lookupProxyClass(gtype);
+    		gtype = gtype.getParent();
+    	}
+    	return ret;
+    }
+    
+    @SuppressWarnings("unchecked")
 	protected static <T extends NativeObject> Class<T> classFor(Pointer ptr, Class<T> defaultClass) {
-    	Class<?> cls = GType.lookupProxyClass(ptr);
+    	GType gtype = GType.objectPeekType(ptr);
+    	Class<?> cls = lookupProxyChain(gtype);
     	return (cls != null && defaultClass.isAssignableFrom(cls)) ? (Class<T>) cls : defaultClass; 
     }    
 

Modified: trunk/src/org/gnome/gir/repository/Repository.java
==============================================================================
--- trunk/src/org/gnome/gir/repository/Repository.java	(original)
+++ trunk/src/org/gnome/gir/repository/Repository.java	Mon Sep  8 23:32:35 2008
@@ -28,6 +28,14 @@
 		}
 	}
 	
+	public void requireNoFail(String namespace) {
+		try {
+			require(namespace);
+		} catch (GErrorException e) {
+			throw new RuntimeException(e);
+		}
+	}
+	
 	public BaseInfo[] getInfos(String namespace) {
 		int nInfos = GIntrospectionAPI.gi.g_irepository_get_n_infos(this, namespace);
 		BaseInfo[] ret = new BaseInfo[nInfos];

Modified: trunk/stub-examples/Test.java
==============================================================================
--- trunk/stub-examples/Test.java	(original)
+++ trunk/stub-examples/Test.java	Mon Sep  8 23:32:35 2008
@@ -103,6 +103,10 @@
 				put(Library.OPTION_TYPE_MAPPER, new GTypeMapper());
 			}
 		};
+		
+		static {
+			Repository.getDefault().requireNoFail(namespace);
+		}
 	};
 
 	public static final void init() {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]