public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Wrap the jobject in a jnixx::object; extend that.
Date: Mon, 05 May 2008 21:47:00 -0000	[thread overview]
Message-ID: <20080505214757.1584.qmail@sourceware.org> (raw)

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


                 reply	other threads:[~2008-05-05 21:47 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080505214757.1584.qmail@sourceware.org \
    --to=cagney@sourceware.org \
    --cc=frysk-cvs@sourceware.org \
    --cc=frysk@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).