java-gobject-introspection r43 - in trunk: src/org/gnome/gir/compiler src/org/gnome/gir/gobject src/org/gnome/gir/repository stub-examples
- From: walters svn gnome org
- To: svn-commits-list gnome org
- Subject: java-gobject-introspection r43 - in trunk: src/org/gnome/gir/compiler src/org/gnome/gir/gobject src/org/gnome/gir/repository stub-examples
- Date: Mon, 8 Sep 2008 22:24:32 +0000 (UTC)
Author: walters
Date: Mon Sep 8 22:24:32 2008
New Revision: 43
URL: http://svn.gnome.org/viewvc/java-gobject-introspection?rev=43&view=rev
Log:
Generate property getters and setters.
Modified:
trunk/src/org/gnome/gir/compiler/CodeFactory.java
trunk/src/org/gnome/gir/gobject/GObject.java
trunk/src/org/gnome/gir/gobject/GParamFlags.java
trunk/src/org/gnome/gir/repository/BaseInfo.java
trunk/src/org/gnome/gir/repository/GIntrospectionAPI.java
trunk/src/org/gnome/gir/repository/InterfaceInfo.java
trunk/src/org/gnome/gir/repository/ObjectInfo.java
trunk/src/org/gnome/gir/repository/PropertyInfo.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 22:24:32 2008
@@ -44,6 +44,7 @@
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
@@ -61,6 +62,7 @@
import org.gnome.gir.gobject.GErrorException;
import org.gnome.gir.gobject.GList;
import org.gnome.gir.gobject.GObjectAPI;
+import org.gnome.gir.gobject.GParamFlags;
import org.gnome.gir.gobject.GSList;
import org.gnome.gir.gobject.GType;
import org.gnome.gir.repository.ArgInfo;
@@ -76,6 +78,7 @@
import org.gnome.gir.repository.FunctionInfoFlags;
import org.gnome.gir.repository.InterfaceInfo;
import org.gnome.gir.repository.ObjectInfo;
+import org.gnome.gir.repository.PropertyInfo;
import org.gnome.gir.repository.RegisteredTypeInfo;
import org.gnome.gir.repository.Repository;
import org.gnome.gir.repository.SignalInfo;
@@ -588,6 +591,8 @@
}
private String ucaseToCamel(String ucase) {
+ // So this function works on signal/property names too
+ ucase = ucase.replace('-', '_');
String[] components = ucase.split("_");
for (int i = 1; i < components.length; i++) {
if (components[i].length() > 0)
@@ -869,6 +874,71 @@
mv.visitMaxs(2, 2);
mv.visitEnd();
}
+
+ private void writeProperties(ClassCompilation compilation, PropertyInfo[] props, Set<String> sigs) {
+ for (PropertyInfo prop : props) {
+ Type type = toJava(prop.getType());
+ if (type == null)
+ continue;
+ int propFlags = prop.getFlags();
+ if ((propFlags & GParamFlags.READABLE) != 0) {
+ String getterName = "get" + ucaseToPascal(prop.getName());
+ String descriptor = Type.getMethodDescriptor(type, new Type[] {});
+ String signature = getUniqueSignature(getterName, type, Arrays.asList(new Type[] {}));
+ if (sigs.contains(signature)) {
+ logger.warning("Getter " + getterName + " duplicates signature: "
+ + signature);
+ continue;
+ }
+ sigs.add(signature);
+ MethodVisitor mv = compilation.writer.visitMethod(ACC_PUBLIC, getterName,
+ descriptor, null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(prop.getName());
+ mv.visitMethodInsn(INVOKEVIRTUAL, compilation.internalName, "get",
+ "(Ljava/lang/String;)" + type.getDescriptor());
+ mv.visitTypeInsn(CHECKCAST, type.getInternalName());
+ mv.visitInsn(ARETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("this", "L" + compilation.internalName +";", null, l0, l1, 0);
+ mv.visitMaxs(2, 1);
+ mv.visitEnd();
+ }
+ if ((propFlags & GParamFlags.WRITABLE) != 0 &&
+ (propFlags & GParamFlags.CONSTRUCT_ONLY) == 0) {
+ String setterName = "set" + ucaseToPascal(prop.getName());
+ String descriptor = Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { type });
+ String signature = getUniqueSignature(setterName, Type.VOID_TYPE, Arrays.asList(new Type[] { type }));
+ if (sigs.contains(signature)) {
+ logger.warning("Setter " + setterName + " duplicates signature: "
+ + signature);
+ continue;
+ }
+ sigs.add(signature);
+ MethodVisitor mv = compilation.writer.visitMethod(ACC_PUBLIC, setterName,
+ descriptor, null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(prop.getName());
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(INVOKEVIRTUAL, compilation.internalName, "set",
+ "(Ljava/lang/String;Ljava/lang/Object;)" + type.getDescriptor());
+ mv.visitInsn(RETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("this", "L" + compilation.internalName + ";", null, l0, l1, 0);
+ mv.visitLocalVariable("arg", type.getDescriptor(), null, l0, l1, 1);
+ mv.visitMaxs(3, 2);
+ mv.visitEnd();
+ };
+ }
+ }
private void compile(ObjectInfo info) {
StubClassCompilation compilation = getCompilation(info);
@@ -982,8 +1052,12 @@
// Insert the object as first parameter
ctx.argTypes.add(0, typeFromInfo(iface));
compileSignal(compilation, ctx, sig, false, true);
- }
+ }
+ writeProperties(compilation, iface.getProperties(), sigs);
}
+
+ writeProperties(compilation, info.getProperties(), sigs);
+
compilation.close();
}
@@ -1065,7 +1139,18 @@
return null;
}
return new CallableCompilationContext(returnType, argInfos, args, false);
- }
+ }
+
+ private String getUniqueSignature(String name, Type returnType, List<Type> args) {
+ StringBuilder builder = new StringBuilder(name);
+ builder.append("(");
+ for (Type arg: args)
+ builder.append(arg.getDescriptor());
+ builder.append(")");
+ builder.append(returnType.getDescriptor());
+ String signature = builder.toString();
+ return signature;
+ }
private CallableCompilationContext tryCompileCallable(FunctionInfo fi, Set<String> seenSignatures) {
Type returnType = getCallableReturn(fi);
@@ -1082,13 +1167,8 @@
logger.warning("Skipping function with unhandled arg signature: " + fi.getSymbol());
return null;
}
- StringBuilder builder = new StringBuilder(fi.getName());
- builder.append("(");
- for (Type arg: args)
- builder.append(arg.getDescriptor());
- builder.append(")");
- builder.append(returnType.getDescriptor());
- String signature = builder.toString();
+ String name = ucaseToCamel(fi.getName());
+ String signature = getUniqueSignature(name, returnType, args);
if (seenSignatures.contains(signature)) {
logger.warning("Function " + fi.getSymbol() + " duplicates signature: "
+ signature);
Modified: trunk/src/org/gnome/gir/gobject/GObject.java
==============================================================================
--- trunk/src/org/gnome/gir/gobject/GObject.java (original)
+++ trunk/src/org/gnome/gir/gobject/GObject.java Mon Sep 8 22:24:32 2008
@@ -76,6 +76,13 @@
private Map<Long,Callback> signalHandlers = new HashMap<Long, Callback>();
/**
+ * A tagging interface to mark classes which are GObject property bags.
+ * @author walters
+ *
+ */
+ public static interface GProperties {};
+
+ /**
* A tagging interface used in the code generator - if a method returns an interface,
* we have it extend this interface so we know it's a GObject.
* @author walters
Modified: trunk/src/org/gnome/gir/gobject/GParamFlags.java
==============================================================================
--- trunk/src/org/gnome/gir/gobject/GParamFlags.java (original)
+++ trunk/src/org/gnome/gir/gobject/GParamFlags.java Mon Sep 8 22:24:32 2008
@@ -1,16 +1,13 @@
package org.gnome.gir.gobject;
-public enum GParamFlags implements NativeEnum {
- READABLE,
- WRITABLE,
- CONSTRUCT,
- CONSTRUCT_ONLY,
- LAX_VALIDATION,
- STATIC_NAME,
- STATIC_NICK,
- STATIC_BLURB;
+public interface GParamFlags {
+ public static final int READABLE = 1 << 0;
+ public static final int WRITABLE = 1 << 1;
+ public static final int CONSTRUCT = 1 << 2;
+ public static final int CONSTRUCT_ONLY = 1 << 3;
+ public static final int LAX_VALIDATION = 1 << 4;
+ public static final int STATIC_NAME = 1 << 5;
+ public static final int STATIC_NICK = 1 << 6;
+ public static final int STATIC_BLURB = 1 << 7;
- public int getNative() {
- return 1 << this.ordinal();
- };
}
Modified: trunk/src/org/gnome/gir/repository/BaseInfo.java
==============================================================================
--- trunk/src/org/gnome/gir/repository/BaseInfo.java (original)
+++ trunk/src/org/gnome/gir/repository/BaseInfo.java Mon Sep 8 22:24:32 2008
@@ -37,6 +37,8 @@
return new InterfaceInfo(init);
if (itype == InfoType.CALLBACK.ordinal())
return new CallbackInfo(init);
+ if (itype == InfoType.PROPERTY.ordinal())
+ return new PropertyInfo(init);
return new BaseInfo(new Initializer(ptr));
}
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 Mon Sep 8 22:24:32 2008
@@ -27,7 +27,6 @@
import java.util.HashMap;
-import org.gnome.gir.gobject.GParamFlags;
import org.gnome.gir.gobject.GType;
import org.gnome.gir.gobject.GTypeMapper;
import org.gnome.gir.gobject.ZeroTerminatedArray;
@@ -191,7 +190,7 @@
ConstantInfo g_interface_info_get_constant (InterfaceInfo info,
int n);
- GParamFlags g_property_info_get_flags (PropertyInfo info);
+ int g_property_info_get_flags (PropertyInfo info);
TypeInfo g_property_info_get_type (PropertyInfo info);
int g_signal_info_get_flags (SignalInfo info);
Modified: trunk/src/org/gnome/gir/repository/InterfaceInfo.java
==============================================================================
--- trunk/src/org/gnome/gir/repository/InterfaceInfo.java (original)
+++ trunk/src/org/gnome/gir/repository/InterfaceInfo.java Mon Sep 8 22:24:32 2008
@@ -36,7 +36,7 @@
for (int i = 0; i < n; i++)
ret[i] = GIntrospectionAPI.gi.g_interface_info_get_signal(this, i);
return ret;
- }
+ }
public VFuncInfo[] getVFuncs() {
int n = GIntrospectionAPI.gi.g_interface_info_get_n_vfuncs(this);
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 Mon Sep 8 22:24:32 2008
@@ -44,6 +44,14 @@
return ret;
}
+ public PropertyInfo[] getProperties() {
+ int n = GIntrospectionAPI.gi.g_object_info_get_n_properties(this);
+ PropertyInfo[] ret= new PropertyInfo[n];
+ for (int i = 0; i < n; i++)
+ ret[i] = GIntrospectionAPI.gi.g_object_info_get_property(this, i);
+ return ret;
+ }
+
public InterfaceInfo[] getInterfaces() {
int n = GIntrospectionAPI.gi.g_object_info_get_n_interfaces(this);
InterfaceInfo[] ret= new InterfaceInfo[n];
Modified: trunk/src/org/gnome/gir/repository/PropertyInfo.java
==============================================================================
--- trunk/src/org/gnome/gir/repository/PropertyInfo.java (original)
+++ trunk/src/org/gnome/gir/repository/PropertyInfo.java Mon Sep 8 22:24:32 2008
@@ -1,10 +1,17 @@
package org.gnome.gir.repository;
-import com.sun.jna.Pointer;
-import com.sun.jna.PointerType;
-public class PropertyInfo extends PointerType {
- protected PropertyInfo(Pointer pointer) {
- super(pointer);
+public class PropertyInfo extends BaseInfo {
+
+ protected PropertyInfo(Initializer init) {
+ super(init);
+ }
+
+ public int getFlags() {
+ return GIntrospectionAPI.gi.g_property_info_get_flags(this);
+ }
+
+ public TypeInfo getType() {
+ return GIntrospectionAPI.gi.g_property_info_get_type(this);
}
}
Modified: trunk/stub-examples/Test.java
==============================================================================
--- trunk/stub-examples/Test.java (original)
+++ trunk/stub-examples/Test.java Mon Sep 8 22:24:32 2008
@@ -20,7 +20,15 @@
import com.sun.jna.ptr.PointerByReference;
public class Test extends GObject implements TestIface {
+
+ public String getFoo() {
+ return (String) get("foo");
+ }
+ public void setFoo(String arg) {
+ set("foo", arg);
+ }
+
public void foo(String x, Double y, Integer z) throws GErrorException {
PointerByReference error = new PointerByReference(null);
Function target = Internals.library.getFunction("gtk_foo_bar");
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]