java-gobject-introspection r95 - in trunk/src/org/gnome/gir: compiler gobject repository



Author: walters
Date: Tue Oct 21 02:49:25 2008
New Revision: 95
URL: http://svn.gnome.org/viewvc/java-gobject-introspection?rev=95&view=rev

Log:
Support abstract objects; write abstract flag, also proxy stub


Modified:
   trunk/src/org/gnome/gir/compiler/CodeFactory.java
   trunk/src/org/gnome/gir/gobject/NativeObject.java
   trunk/src/org/gnome/gir/repository/GIntrospectionAPI.java
   trunk/src/org/gnome/gir/repository/ObjectInfo.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	Tue Oct 21 02:49:25 2008
@@ -1199,7 +1199,23 @@
 			interfaces[i] = getInternalNameMapped(giInterfaces.get(i));
 		}
 		
-		compilation.writer.visit(V1_6, ACC_PUBLIC + ACC_SUPER, internalName, null, parentInternalName, interfaces);
+		int flags = ACC_PUBLIC + ACC_SUPER;
+		boolean isAbstract = info.isAbstract();
+		if (isAbstract)
+			flags += ACC_ABSTRACT;
+		compilation.writer.visit(V1_6, flags, internalName, null, parentInternalName, interfaces);
+		
+		if (isAbstract) {
+			/* We need to write out a concrete implementation, just in case a method returns an abstract
+			 * class and we don't have one mapped.  An example is GFileMonitor from Gio.  This
+			 * is similar to the interface case.
+			 */			
+			InnerClassCompilation anonProxy = compilation.newInner("AnonStub");
+			compilation.writer.visitInnerClass(anonProxy.internalName,
+					compilation.internalName, "AnonStub", ACC_PUBLIC + ACC_FINAL + ACC_STATIC);
+			anonProxy.writer.visit(V1_6, ACC_PUBLIC + ACC_SUPER + ACC_FINAL, anonProxy.internalName, null, compilation.internalName, null);
+			writeHandleInitializer(anonProxy, compilation.internalName);
+		}
 		
 		for (SignalInfo sig : info.getSignals()) {
 			CallableCompilationContext ctx = tryCompileCallable(sig);

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	Tue Oct 21 02:49:25 2008
@@ -48,6 +48,7 @@
 import java.lang.ref.WeakReference;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Modifier;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -207,6 +208,9 @@
          */        	
         else if (GObject.class.isAssignableFrom(cls)) {
         	cls = classFor(ptr, cls);
+        	/* If it's abstract, pull out the stub */
+        	if ((cls.getModifiers() & Modifier.ABSTRACT) != 0)
+        		cls = (Class<T>) getStubClassFor(cls);
         }        
         /* Ok, let's try to find an Initializer constructor
          */

Modified: trunk/src/org/gnome/gir/repository/GIntrospectionAPI.java
==============================================================================
--- trunk/src/org/gnome/gir/repository/GIntrospectionAPI.java	(original)
+++ trunk/src/org/gnome/gir/repository/GIntrospectionAPI.java	Tue Oct 21 02:49:25 2008
@@ -146,6 +146,7 @@
 	
 	String          g_object_info_get_type_name 	    (ObjectInfo    info);
 	String          g_object_info_get_type_init 	    (ObjectInfo    info);
+	boolean         g_object_info_get_abstract             (ObjectInfo    info);	
 	ObjectInfo      g_object_info_get_parent             (ObjectInfo    info);
 	int                   g_object_info_get_n_interfaces      (ObjectInfo    info);
 	InterfaceInfo       g_object_info_get_interface          (ObjectInfo    info,

Modified: trunk/src/org/gnome/gir/repository/ObjectInfo.java
==============================================================================
--- trunk/src/org/gnome/gir/repository/ObjectInfo.java	(original)
+++ trunk/src/org/gnome/gir/repository/ObjectInfo.java	Tue Oct 21 02:49:25 2008
@@ -14,6 +14,10 @@
 		return GIntrospectionAPI.gi.g_object_info_get_parent(this);
 	}
 	
+	public boolean isAbstract() {
+		return GIntrospectionAPI.gi.g_object_info_get_abstract(this);
+	}
+	
 	public boolean isAssignableFrom(ObjectInfo other) {
 		if (other == this)
 			return true;



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