java-gobject-introspection r95 - in trunk/src/org/gnome/gir: compiler gobject repository
- From: walters svn gnome org
- To: svn-commits-list gnome org
- Subject: java-gobject-introspection r95 - in trunk/src/org/gnome/gir: compiler gobject repository
- Date: Tue, 21 Oct 2008 02:49:25 +0000 (UTC)
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]