public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Wrap the jobject in a jnixx::object; extend that.
@ 2008-05-05 21:47 cagney
  0 siblings, 0 replies; only message in thread
From: cagney @ 2008-05-05 21:47 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  a7987b6792fe41af2e15ffe0074e785e2bb4a386 (commit)
      from  a92d0b3824f9d328d49e4f849d5b94d5a1c0118f (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit a7987b6792fe41af2e15ffe0074e785e2bb4a386
Author: Andrew Cagney <cagney@redhat.com>
Date:   Mon May 5 17:45:32 2008 -0400

    Wrap the jobject in a jnixx::object; extend that.
    
    frysk-sys/frysk/jnixx/ChangeLog
    2008-05-05  Andrew Cagney  <cagney@redhat.com>
    
    	* jnixx.hxx (jnixx::object): New.
    	* Main.java: Generate each class extending jnixx::object instead
    	of __jobject.
    	* PrintDeclarations.java: Ditto
    	* PrintDefinitions.java: Ditto.
    	* PrintNamespaces.java: Ditto.
    	* Printer.java: Ditto.
    	* PrintIncludes.java: New; same.
    	* print.cxx: Convert to jnixx::object.
    	* print.cxx: Ditto.
    
    frysk-sys/frysk/rsl/ChangeLog
    2008-05-05  Andrew Cagney  <cagney@redhat.com>
    
    	* jni/Log.hxx: Use jnixx::object.
    	* jni/Log.cxx: Ditto.
    
    frysk-sys/frysk/sys/ChangeLog
    2008-05-05  Andrew Cagney  <cagney@redhat.com>
    
    	* jni/PseudoTerminal.cxx: Use jnixx::object.
    	* jni/Signal.cxx-sh: Ditto.
    
    frysk-sys/lib/stdcpp/ChangeLog
    2008-05-05  Andrew Cagney  <cagney@redhat.com>
    
    	* jni/Demangler.cxx: Use jnixx::object.

-----------------------------------------------------------------------

Summary of changes:
 frysk-sys/frysk/jnixx/ChangeLog                    |   11 ++
 frysk-sys/frysk/jnixx/Main.java                    |   58 +++++++---
 frysk-sys/frysk/jnixx/PrintDeclarations.java       |   16 +---
 frysk-sys/frysk/jnixx/PrintDefinitions.java        |  122 ++++++++++++--------
 .../{PrintNamespaces.java => PrintIncludes.java}   |   45 +++----
 frysk-sys/frysk/jnixx/PrintNamespaces.java         |   14 ++-
 frysk-sys/frysk/jnixx/Printer.java                 |  113 +++++++++++++------
 frysk-sys/frysk/jnixx/jnixx.hxx                    |   92 ++++++++++++---
 frysk-sys/frysk/jnixx/print.cxx                    |   20 ++--
 frysk-sys/frysk/jnixx/print.hxx                    |    4 +-
 frysk-sys/frysk/rsl/ChangeLog                      |    3 +
 frysk-sys/frysk/rsl/jni/Log.cxx                    |   35 +++---
 frysk-sys/frysk/rsl/jni/Log.hxx                    |   12 ++-
 frysk-sys/frysk/sys/ChangeLog                      |    3 +
 frysk-sys/frysk/sys/jni/PseudoTerminal.cxx         |    2 +-
 frysk-sys/frysk/sys/jni/Signal.cxx-sh              |    6 +-
 frysk-sys/lib/stdcpp/ChangeLog                     |    2 +
 frysk-sys/lib/stdcpp/jni/Demangler.cxx             |    5 +-
 18 files changed, 368 insertions(+), 195 deletions(-)
 copy frysk-sys/frysk/jnixx/{PrintNamespaces.java => PrintIncludes.java} (77%)

First 500 lines of diff:
diff --git a/frysk-sys/frysk/jnixx/ChangeLog b/frysk-sys/frysk/jnixx/ChangeLog
index 622b119..62bb250 100644
--- a/frysk-sys/frysk/jnixx/ChangeLog
+++ b/frysk-sys/frysk/jnixx/ChangeLog
@@ -1,5 +1,16 @@
 2008-05-05  Andrew Cagney  <cagney@redhat.com>
 
+	* jnixx.hxx (jnixx::object): New.
+	* Main.java: Generate each class extending jnixx::object instead
+	of __jobject.
+	* PrintDeclarations.java: Ditto
+	* PrintDefinitions.java: Ditto.
+	* PrintNamespaces.java: Ditto.
+	* Printer.java: Ditto.
+	* PrintIncludes.java: New; same.
+	* print.cxx: Convert to jnixx::object.
+	* print.cxx: Ditto.
+	
 	* Printer(dent(int,String,String)): New.
 	* PrintNamespaces.java: Clean up generated indentation.
 	* PrintDefinitions.java: Ditto.
diff --git a/frysk-sys/frysk/jnixx/Main.java b/frysk-sys/frysk/jnixx/Main.java
index 2b2e2db..43ee1ab 100644
--- a/frysk-sys/frysk/jnixx/Main.java
+++ b/frysk-sys/frysk/jnixx/Main.java
@@ -41,41 +41,65 @@ package frysk.jnixx;
 
 class Main {
 
+    static void printHxxBody(Printer p, Class klass,
+			     PrintNamespaces printNamespaces) {
+	Class parent = klass.getSuperclass();
+	p.println();
+	WalkClass.visit(klass, printNamespaces);
+	p.println();
+	p.print("struct ");
+	p.printQualifiedCxxName(klass);
+	p.print(" : public ");
+	if (parent == Object.class) {
+	    p.print("jnixx::object");
+	} else if (parent == null) {
+	    p.print("jnixx::interface");
+	} else {
+	    p.printQualifiedCxxName(parent);
+	}
+	while(p.dent(0, "{", "};")) {
+	    // Constructor.
+	    p.printUnqualifiedCxxName(klass);
+	    p.print("(jobject o)");
+	    p.print(" : ");
+	    if (parent == Object.class) {
+		p.print("jnixx::object(o)");
+	    } else if (parent == null) {
+		p.print("jnixx::interface(o)");
+	    } else {
+		p.printQualifiedCxxName(parent);
+		p.print("(o)");
+	    }
+	    p.println(" { }");
+	    // Static get-class method - a class knows its own class.
+	    p.println("static jclass Class(jnixx::env& env);");
+	    WalkClass.visit(klass, new PrintDeclarations(p));
+	    p.println();
+	}
+    }
+
     private static void printHxxFile(Printer p, Class klass) {
 	String header = klass.getName().replaceAll("\\.", "_") + "_jni_hxx";
 	p.println("#ifndef " + header);
 	p.println("#define " + header);
 	p.println();
 	p.println("#include \"frysk/jnixx/jnixx.hxx\"");
-	WalkClass.visit(klass, new PrintNamespaces(p));
-	p.println();
 	Class parent = klass.getSuperclass();
 	if (parent != Object.class) {
+	    p.println();
 	    p.print("#include \"");
 	    p.printHeaderFileName(parent);
 	    p.print("\"");
 	    p.println();
 	}
-	p.print("struct ");
-	p.printQualifiedCxxName(klass);
-	if (parent == Object.class) {
-	    p.print(" : public __jobject");
-	} else if (parent != null) {
-	    p.print(" : public ");
-	    p.printQualifiedCxxName(parent);
-	}
-	while(p.dent(0, "{", "};")) {
-	    WalkClass.visit(klass, new PrintDeclarations(p));
-	    p.println();
-	}
+	printHxxBody(p, klass, new PrintNamespaces(p));
 	p.println();
 	p.println("#endif");
     }
 
     private static void printCxxFile(Printer p, Class klass) {
-	p.print("#include \"");
-	p.printHeaderFileName(klass);
-	p.println("\"");
+	p.println("#include \"frysk/jnixx/jnixx.hxx\"");
+	WalkClass.visit(klass, new PrintIncludes(p, new PrintNamespaces(p)));
 	WalkClass.visit(klass, new PrintDefinitions(p));
     }
 
diff --git a/frysk-sys/frysk/jnixx/PrintDeclarations.java b/frysk-sys/frysk/jnixx/PrintDeclarations.java
index d37b04b..9ed4bfc 100644
--- a/frysk-sys/frysk/jnixx/PrintDeclarations.java
+++ b/frysk-sys/frysk/jnixx/PrintDeclarations.java
@@ -52,21 +52,16 @@ class PrintDeclarations implements ClassWalker {
     }
 
     public boolean acceptClass(Class klass) {
-	// Static get-class method - a class knows its own class.
-	p.println();
-	p.println("public: static jclass Class(jnixx::env& env);");
 	return true;
     }
 
     public void acceptConstructor(Constructor constructor) {
-	p.println();
 	p.printModifiers(constructor);
 	p.print(" ");
 	p.printCxxType(constructor.getDeclaringClass());
 	p.print(" New(");
 	p.printFormalCxxParameters(constructor, false);
-	p.print(");");
-	p.println();
+	p.println(");");
     }
 
     private void printCxxFieldAccessorDeclaration(Field field, boolean get) {
@@ -82,10 +77,6 @@ class PrintDeclarations implements ClassWalker {
 	p.print(Character.toUpperCase(name.charAt(0)));
 	p.print(name.substring(1));
 	p.print("(jnixx::env&");
-	if (!Modifier.isStatic(field.getModifiers())) {
-	    p.print(", ");
-	    p.printCxxType(field.getDeclaringClass());
-	}
 	if (!get) {
 	    p.print(", ");
 	    p.printCxxType(field.getType());
@@ -95,7 +86,6 @@ class PrintDeclarations implements ClassWalker {
     }
 
     public void acceptField(Field field) {
-	p.println();
 	printCxxFieldAccessorDeclaration(field, true);
 	if (!Modifier.isFinal(field.getModifiers())) {
 	    printCxxFieldAccessorDeclaration(field, false);
@@ -103,7 +93,6 @@ class PrintDeclarations implements ClassWalker {
     }
 
     public void acceptMethod(Method method) {
-	p.println();
 	p.printModifiers(method);
 	p.print(" ");
 	p.printCxxType(method.getReturnType());
@@ -111,7 +100,6 @@ class PrintDeclarations implements ClassWalker {
 	p.print(method.getName());
 	p.print("(");
 	p.printFormalCxxParameters(method, false);
-	p.print(");");
-	p.println();
+	p.println(");");
     }
 }
diff --git a/frysk-sys/frysk/jnixx/PrintDefinitions.java b/frysk-sys/frysk/jnixx/PrintDefinitions.java
index 6aa97d8..9aaf230 100644
--- a/frysk-sys/frysk/jnixx/PrintDefinitions.java
+++ b/frysk-sys/frysk/jnixx/PrintDefinitions.java
@@ -54,18 +54,18 @@ class PrintDefinitions implements ClassWalker {
     public boolean acceptClass(Class klass) {
 	// The class, via reflection.
 	p.println();
-	p.println("static jclass _Class;");
+	p.println("static jclass _class;");
 	p.println();
 	p.println("jclass");
 	p.printQualifiedCxxName(klass);
 	p.print("::Class(jnixx::env& env)");
 	while (p.dent(0, "{", "}")) {
-	    p.print("if (_Class == NULL)");
+	    p.print("if (_class == NULL)");
 	    while (p.dent(1, "{", "}")) {
-		p.println("_Class = env.findClass(\""
+		p.println("_class = env.findClass(\""
 			  + klass.getName().replace("\\.", "/") + "\");");
 	    }
-	    p.println("return _Class;");
+	    p.println("return _class;");
 	}
 	return true;
     }
@@ -85,24 +85,24 @@ class PrintDefinitions implements ClassWalker {
 		p.printJniSignature(constructor.getParameterTypes());
 		p.println(")V\");");
 	    }
-	    p.printCxxType(constructor.getDeclaringClass());
-	    p.print("object = (");
-	    p.printCxxType(constructor.getDeclaringClass());
-	    p.print(") env.newObject(");
+	    p.print("jobject object = env.newObject(");
 	    p.printActualJniParameters(constructor);
 	    p.println(");");
 	    while (p.dent(1, "if (object == NULL) {", "}")) {
 		p.println("throw jnixx::exception();");
 	    }
-	    p.println("return object;");
+	    p.print("return ");
+	    p.printCxxType(constructor.getDeclaringClass());
+	    p.println("(object);");
 	}
     }
 
     private void printCxxFieldAccessorDefinition(Field field, boolean get) {
 	boolean isStatic = Modifier.isStatic(field.getModifiers());
+	Class type = field.getType();
 	p.println();
 	if (get) {
-	    p.printCxxType(field.getType());
+	    p.printCxxType(type);
 	    p.println();
 	} else { 
 	    p.println("void");
@@ -118,15 +118,10 @@ class PrintDefinitions implements ClassWalker {
 	p.print(Character.toUpperCase(name.charAt(0)));
 	p.print(name.substring(1));
 	p.print("(jnixx::env& env");
-	if (!isStatic) {
-	    p.print(", ");
-	    p.printCxxType(field.getDeclaringClass());
-	    p.print(" object");
-	}
 	if (!get) {
 	    p.print(", ");
-	    p.printCxxType(field.getType());
-	    p.print(" value");
+	    p.printCxxType(type);
+	    p.print(" p0");
 	}
 	p.print(")");
 	while (p.dent(0, "{", "}")) {
@@ -138,17 +133,16 @@ class PrintDefinitions implements ClassWalker {
 		p.print("FieldID(Class(env), \"");
 		p.print(name);
 		p.print("\", \"");
-		p.printJniSignature(field.getType());
+		p.printJniSignature(type);
 		p.print("\"");
 		p.println(");");
 	    }
 	    if (get) {
-		p.print("return");
-		if (!field.getType().isPrimitive()) {
-		    p.print(" (");
-		    p.printCxxType(field.getType());
-		    p.print(")");
-		}
+		p.printJniType(type);
+		p.print(" ret = ");
+		p.print("(");
+		p.printJniType(type);
+		p.print(")");
 		p.print(" env.get");
 	    } else {
 		p.print("env.set");
@@ -156,22 +150,28 @@ class PrintDefinitions implements ClassWalker {
 	    if (isStatic) {
 		p.print("Static");
 	    }
-	    p.printJniReturnTypeName(field.getType());
+	    p.printJniReturnTypeName(type);
 	    p.print("Field(");
-	    if (isStatic) {
-		p.print("_Class");
+	    if (get) {
+		p.printActualJniParameters(isStatic, name + "ID",
+					   new Class[0]);
 	    } else {
-		p.print("object");
+		p.printActualJniParameters(isStatic, name + "ID",
+					   new Class[] { type });
 	    }
-	    p.print(", " + name + "ID");
-	    if (!get) {
-		p.print(",");
-		if (!field.getType().isPrimitive()) {
-		    p.print(" (jobject)");
+	    p.println(");");
+	    if (get) {
+		p.print("return ");
+		if (type.isPrimitive()) {
+		    p.print("ret");
+		} else if (type.getName().startsWith("java.")) {
+		    p.print("ret");
+		} else {
+		    p.printCxxType(type);
+		    p.print("(ret)");
 		}
-		p.print(" value");
+		p.println(";");
 	    }
-	    p.println(");");
 	}
     }
 
@@ -197,7 +197,7 @@ class PrintDefinitions implements ClassWalker {
 	p.print(method.getName());
 	p.print("(");
 	p.printFormalCxxParameters(method, true);
-	p.println(")");
+	p.print(")");
 	while (p.dent(0, "{", "}")) {
 	    p.println("static jmethodID id;");
 	    while (p.dent(1, "if (id == NULL) {", "}")) {
@@ -212,13 +212,12 @@ class PrintDefinitions implements ClassWalker {
 		p.println("\");");
 	    }
 	    if (returnType != Void.TYPE) {
-		p.printCxxType(returnType);
-		p.print(" ret = ");
-		if (!returnType.isPrimitive()) {
-		    p.print("(");
-		    p.printCxxType(returnType);
-		    p.print(") ");
+		if (returnType.isPrimitive()) {
+		    p.printJniType(returnType);
+		} else {
+		    p.print("jobject");
 		}
+		p.print(" ret = ");
 	    }
 	    p.print("env.call");
 	    if (isStatic) {
@@ -229,12 +228,20 @@ class PrintDefinitions implements ClassWalker {
 	    p.printActualJniParameters(method);
 	    p.println(");");
 	    if (returnType != Void.TYPE) {
-		p.println("  return ret;");
+		p.print("return ");
+		if (returnType.isPrimitive()) {
+		    p.print("ret;");
+		} else {
+		    p.printCxxType(returnType);
+		    p.print("(ret)");
+		}
+		p.println(";");
 	    }
 	}
     }
 
     private void printNativeMethodDefinition(Method method) {
+	boolean isStatic = Modifier.isStatic(method.getModifiers());
 	p.println();
 	while (p.dent(0, "extern \"C\" {", "};")) {
 	    p.print("JNIEXPORT ");
@@ -256,14 +263,35 @@ class PrintDefinitions implements ClassWalker {
 	    p.println("try {");
 	    {
 		p.indent();
-		p.println("jnixx::env jnixxEnv = jnixx::env(jniEnv);");
-		if (method.getReturnType() != Void.TYPE) {
-		    p.print("return ");
+		p.println("jnixx::env env = jnixx::env(jni);");
+		Class returnType = method.getReturnType();
+		if (returnType != Void.TYPE) {
+		    p.printCxxType(returnType);
+		    p.print(" ret = ");
+		}
+		if (isStatic) {
+		    p.printQualifiedCxxName(method);
+		} else {
+		    p.printCxxType(method.getDeclaringClass());
+		    p.print("(object).");
+		    p.print(method.getName());
 		}
-		p.printQualifiedCxxName(method);
 		p.print("(");
 		p.printActualCxxParameters(method);
 		p.println(");");
+		if (returnType != Void.TYPE) {
+		    p.print("return ");
+		    if (returnType.isPrimitive()) {
+			p.print("ret");
+		    } else if (returnType == String.class) {
+			p.print("(jstring) ret._object");
+		    } else if (returnType.isArray()) {
+			p.print("(jobjectArray) ret._object");
+		    } else {
+			p.print("ret._object");
+		    }
+		    p.println(";");
+		}
 		p.outdent();
 	    }
 	    p.println("} catch (jnixx::exception) {");
diff --git a/frysk-sys/frysk/jnixx/PrintNamespaces.java b/frysk-sys/frysk/jnixx/PrintIncludes.java
similarity index 77%
copy from frysk-sys/frysk/jnixx/PrintNamespaces.java
copy to frysk-sys/frysk/jnixx/PrintIncludes.java
index edbc6a6..3a4a746 100644
--- a/frysk-sys/frysk/jnixx/PrintNamespaces.java
+++ b/frysk-sys/frysk/jnixx/PrintIncludes.java
@@ -44,40 +44,33 @@ import java.lang.reflect.Method;
 import java.util.HashSet;
 import java.lang.reflect.Constructor;
 
-class PrintNamespaces implements ClassWalker {
+class PrintIncludes implements ClassWalker {
 
     private final Printer p;
-    PrintNamespaces(Printer p) {
+    private final PrintNamespaces printNamespaces;
+    PrintIncludes(Printer p, PrintNamespaces printNamespaces) {
 	this.p = p;
+	this.printNamespaces = printNamespaces;
     }
 
     /**
-     * Print the namespace spec for the klass.
+     * Print #includes for any non system headers..
      */
-    private void printCxxNamespace(Class klass) {
+    private void printCxxInclude(Class klass) {
 	while (klass.isArray()) {
 	    klass = klass.getComponentType();
 	}
 	if (klass.isPrimitive())
 	    return;
+	if (klass.getName().startsWith("java."))
+	    return;
 	if (printedNamespaces.contains(klass))
 	    return;
-	p.println();
-	String[] names = klass.getName().split("\\.");
-	for (int i = 0; i < names.length - 1; i++) {
-	    p.print("namespace ");
-	    p.print(names[i]);
-	    p.println("{");
-	    p.indent();
-	}
-	p.print("struct ");
-	p.print(names[names.length - 1]);
-	p.print(";");
-	p.println();
-	for (int i = names.length - 2; i >= 0; i--) {
-	    p.outdent();
-	    p.println("}");
+	Class superclass = klass.getSuperclass();
+	if (superclass != null) {
+	    printCxxInclude(superclass);
 	}
+	Main.printHxxBody(p, klass, printNamespaces);
 	printedNamespaces.add(klass);
     }
     private HashSet printedNamespaces = new HashSet();
@@ -85,28 +78,28 @@ class PrintNamespaces implements ClassWalker {
     /**
      * Iterate over the klasses printing any referenced name spaces.
      */
-    private void printCxxNamespaces(Class[] klasses) {
+    private void printCxxIncludes(Class[] klasses) {
 	for (int i = 0; i < klasses.length; i++) {
 	    // Should this recurse?
-	    printCxxNamespace(klasses[i]);
+	    printCxxInclude(klasses[i]);
 	}
     }
 
     public boolean acceptClass(Class klass) {
-	printCxxNamespace(klass);
+	printCxxInclude(klass);
 	return true;
     }
 
     public void acceptConstructor(Constructor constructor) {
-	printCxxNamespaces(constructor.getParameterTypes());
+	printCxxIncludes(constructor.getParameterTypes());
     }
 
     public void acceptField(Field field) {
-	printCxxNamespace(field.getType());
+	printCxxInclude(field.getType());
     }
 
     public void acceptMethod(Method method) {
-	printCxxNamespace(method.getReturnType());
-	printCxxNamespaces(method.getParameterTypes());
+	printCxxInclude(method.getReturnType());
+	printCxxIncludes(method.getParameterTypes());
     }
 }
diff --git a/frysk-sys/frysk/jnixx/PrintNamespaces.java b/frysk-sys/frysk/jnixx/PrintNamespaces.java
index edbc6a6..405a534 100644
--- a/frysk-sys/frysk/jnixx/PrintNamespaces.java


hooks/post-receive
--
frysk system monitor/debugger


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-05-05 21:47 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-05 21:47 [SCM] master: Wrap the jobject in a jnixx::object; extend that cagney

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).