From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26098 invoked by alias); 7 May 2008 16:27:29 -0000 Received: (qmail 26072 invoked by uid 367); 7 May 2008 16:27:29 -0000 Date: Wed, 07 May 2008 16:27:00 -0000 Message-ID: <20080507162729.26057.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Generate explict jnixx dependencies; push code into jnixx.hxx. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: a058347d11f607149992b34bba5be94ad4cc3355 X-Git-Newrev: 2c900e55f27fffcf7f48a5ecaf439baa4f29abf2 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q2/txt/msg00194.txt.bz2 The branch, master has been updated via 2c900e55f27fffcf7f48a5ecaf439baa4f29abf2 (commit) from a058347d11f607149992b34bba5be94ad4cc3355 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 2c900e55f27fffcf7f48a5ecaf439baa4f29abf2 Author: Andrew Cagney Date: Wed May 7 12:21:47 2008 -0400 Generate explict jnixx dependencies; push code into jnixx.hxx. frysk-common/ChangeLog 2008-05-07 Andrew Cagney * Makefile.gen.sh (jnixx_sources): Replace ordering dependency of jnixx generated files before jnixx objects, with hard dependency based on includes. frysk-sys/frysk/jnixx/ChangeLog 2008-05-07 Andrew Cagney * Printer.java: Parameterize with PrintWriter. * Main.java: Flush the Printer. * PrintDeclarations.java: Generate classes that extend either jnixx::object or jnixx::objectArray. * jnixx.hxx (jnixx): Declare env, exception, object, and objectArray. ----------------------------------------------------------------------- Summary of changes: frysk-common/ChangeLog | 6 +++ frysk-common/Makefile.gen.sh | 18 +++++++-- frysk-sys/frysk/jnixx/ChangeLog | 7 +++ frysk-sys/frysk/jnixx/Main.java | 15 +++---- frysk-sys/frysk/jnixx/PrintDeclarations.java | 31 ++++++--------- frysk-sys/frysk/jnixx/Printer.java | 21 ++++++++-- frysk-sys/frysk/jnixx/jnixx.hxx | 53 +++++++++++++++++++++++--- 7 files changed, 110 insertions(+), 41 deletions(-) First 500 lines of diff: diff --git a/frysk-common/ChangeLog b/frysk-common/ChangeLog index a4b1758..ee75ea8 100644 --- a/frysk-common/ChangeLog +++ b/frysk-common/ChangeLog @@ -1,3 +1,9 @@ +2008-05-07 Andrew Cagney + + * Makefile.gen.sh (jnixx_sources): Replace ordering dependency of + jnixx generated files before jnixx objects, with hard dependency + based on includes. + 2008-05-06 Andrew Cagney * Makefile.gen.sh (generate_jnixx_sources): Delete. diff --git a/frysk-common/Makefile.gen.sh b/frysk-common/Makefile.gen.sh index e45f312..69c5e49 100755 --- a/frysk-common/Makefile.gen.sh +++ b/frysk-common/Makefile.gen.sh @@ -666,6 +666,7 @@ generate_cni_header () { # Assume these are all generated from .class files found in the master # .jar. +print_header "... jnixx headers" cat < + * Printer.java: Parameterize with PrintWriter. + * Main.java: Flush the Printer. + * PrintDeclarations.java: Generate classes that extend either + jnixx::object or jnixx::objectArray. + * jnixx.hxx (jnixx): Declare env, exception, object, and + objectArray. + * PrintCxxDefinitions.java: Generate _class$ variable of nested classes. * Main.java: Ditto. diff --git a/frysk-sys/frysk/jnixx/Main.java b/frysk-sys/frysk/jnixx/Main.java index 42eacac..530e284 100644 --- a/frysk-sys/frysk/jnixx/Main.java +++ b/frysk-sys/frysk/jnixx/Main.java @@ -39,6 +39,8 @@ package frysk.jnixx; +import java.io.PrintWriter; + class Main { private static void printHxxFile(Printer p, Class klass) { @@ -46,16 +48,12 @@ class Main { p.println("#ifndef " + header); p.println("#define " + header); p.println(); - p.println("#include "); - p.println("#include "); - p.println(); - p.println("namespace jnixx {"); - p.println(" struct exception;"); - p.println(" struct env;"); - p.println("}"); + p.println("// Get declarations."); + p.println("#include \"frysk/jnixx/jnixx.hxx\""); new PrintNamespaces(p).walk(klass); new PrintDeclarations(p).walk(klass); p.println(); + p.println("// Get definitions."); p.println("#include \"frysk/jnixx/jnixx.hxx\""); new PrintHxxDefinitions(p).walk(klass); p.println(); @@ -80,11 +78,12 @@ class Main { Class klass = Class.forName(args[0], false, Main.class.getClassLoader()); - Printer p = new Printer(); + Printer p = new Printer(new PrintWriter(System.out)); if (args[1].equals("hxx")) printHxxFile(p, klass); else printCxxFile(p, klass); + p.flush(); } } diff --git a/frysk-sys/frysk/jnixx/PrintDeclarations.java b/frysk-sys/frysk/jnixx/PrintDeclarations.java index 449e42f..28e6e9d 100644 --- a/frysk-sys/frysk/jnixx/PrintDeclarations.java +++ b/frysk-sys/frysk/jnixx/PrintDeclarations.java @@ -127,13 +127,11 @@ class PrintDeclarations extends ClassWalker { p.println(); p.print("struct "); p.printQualifiedCxxName(klass); - p.print(" : public "); - p.printGlobalCxxName(Object.class); + p.print(" : public ::jnixx::objectArray"); while(p.dent(0, "{", "};")) { p.printUnqualifiedCxxName(klass); p.print("(jobject _object)"); - p.print(" : "); - p.printGlobalCxxName(Object.class); + p.print(" : ::jnixx::objectArray"); p.print("(_object)"); p.println(" { }"); } @@ -150,29 +148,24 @@ class PrintDeclarations extends ClassWalker { p.print("struct "); p.printQualifiedCxxName(klass); Class parent = klass.getSuperclass(); - if (parent != null) { - p.print(" : public "); + p.print(" : public "); + if (parent == null) { + p.print("::jnixx::object"); + } else { p.printGlobalCxxName(parent); } while(p.dent(0, "{", "};")) { // Constructor. + p.printUnqualifiedCxxName(klass); + p.print("(jobject _object)"); + p.print(" : "); if (parent == null) { - p.println("jobject _object;"); - p.printUnqualifiedCxxName(klass); - p.println("(jobject _object) {"); - p.println(" this->_object = _object;"); - p.println("}"); - p.println("bool operator==(jobject o) {"); - p.println(" return _object == o;"); - p.println("}"); + p.print("::jnixx::object"); } else { - p.printUnqualifiedCxxName(klass); - p.print("(jobject _object)"); - p.print(" : "); p.printGlobalCxxName(parent); - p.print("(_object)"); - p.println(" { }"); } + p.print("(_object)"); + p.println(" { }"); // Static get-class method - a class knows its own class. p.println("private: static jclass _class$; public:"); p.println("static inline jclass _class(jnixx::env& env);"); diff --git a/frysk-sys/frysk/jnixx/Printer.java b/frysk-sys/frysk/jnixx/Printer.java index ac12fd8..0ec4821 100644 --- a/frysk-sys/frysk/jnixx/Printer.java +++ b/frysk-sys/frysk/jnixx/Printer.java @@ -43,18 +43,24 @@ import java.lang.reflect.Member; import java.lang.reflect.Method; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; +import java.io.PrintWriter; /** * A class for generating indented output. */ class Printer { + private final PrintWriter out; + Printer(PrintWriter out) { + this.out = out; + } + /** * Print CH. If the start of the line, prefix with indent. */ Printer print(char ch) { printIndentation(); - System.out.print(ch); + out.print(ch); return this; } /** @@ -63,14 +69,14 @@ class Printer { */ Printer print(Object o) { printIndentation(); - System.out.print(o.toString()); + out.print(o.toString()); return this; } /** * Start a new line. */ Printer println() { - System.out.println(); + out.println(); indentationNeeded = true; return this; } @@ -132,7 +138,7 @@ class Printer { */ Printer pad(int n) { for (int i = 0 ; i < n; i++) - System.out.print(" "); + out.print(" "); return this; } @@ -543,4 +549,11 @@ class Printer { } return this; } + + /** + * Flush the output. + */ + void flush() { + out.flush(); + } } diff --git a/frysk-sys/frysk/jnixx/jnixx.hxx b/frysk-sys/frysk/jnixx/jnixx.hxx index 635cbeb..2330667 100644 --- a/frysk-sys/frysk/jnixx/jnixx.hxx +++ b/frysk-sys/frysk/jnixx/jnixx.hxx @@ -37,16 +37,60 @@ // version and license this file solely under the GPL without // exception. -#ifndef frysk_jnixx_hxx -#define frysk_jnixx_hxx +/** + * XXX: This header is included twice, first to get the declarations + * and, second, to get the corresponding definitions. + */ + +#if !defined frysk_jnixx_hxx_1 +#define frysk_jnixx_hxx_1 +/** + * First pass, declare everything used by generated code. + */ #include +#include namespace jnixx { + /** + * JNIXX wrapper for the JNIEnv. + */ struct env; - struct exception; + /** + * An exception to throw when JNI makes an exception pending, caught + * by the JNI wrapper stub. + */ + struct exception { + }; + /** + * The JNIXX root, wraps the jobject pointer, all generated object + * wrappers extend this. + */ + struct object { + jobject _object; + object(jobject _object) { + this->_object = _object; + } + inline bool operator==(jobject o) { + return _object == o; + } + }; + /** + * The JNIXX array root, any array object extends this (which + * extends jnixx::object). + */ + struct objectArray : public object { + objectArray(jobject _object) : object(_object) { + } + }; } +#elif !defined frysk_jnixx_hxx_2 +#define frysk_jnixx_hxx_2 +/** + * Second pass, define everything declared above. + */ + namespace java { namespace lang { struct String; @@ -55,9 +99,6 @@ namespace java { } }; -class jnixx::exception { -}; - class jnixx::env { private: hooks/post-receive -- frysk system monitor/debugger