From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26507 invoked by alias); 7 May 2008 04:31:42 -0000 Received: (qmail 26481 invoked by uid 367); 7 May 2008 04:31:41 -0000 Date: Wed, 07 May 2008 04:31:00 -0000 Message-ID: <20080507043141.26465.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Eliminate duplicate jnixx objects in jni.so. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 7dd6af4f54fc1403a55014883ddc6cd73985f688 X-Git-Newrev: 263254a7939cf7db35ef7d85cc781e88bca232b0 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/msg00191.txt.bz2 The branch, master has been updated via 263254a7939cf7db35ef7d85cc781e88bca232b0 (commit) via e7ca5bfd19d38d59e76e05923f9967292c4f4083 (commit) from 7dd6af4f54fc1403a55014883ddc6cd73985f688 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 263254a7939cf7db35ef7d85cc781e88bca232b0 Author: Andrew Cagney Date: Wed May 7 00:30:23 2008 -0400 Eliminate duplicate jnixx objects in jni.so. frysk-common/ChangeLog 2008-05-06 Andrew Cagney * Makefile.gen.sh (generate_jnixx_sources): Delete. (files.jnixx): New; eliminate duplicate jnixx files. (jni): Depend on ${GEN_DIRNAME}.jar. frysk-sys/frysk/jnixx/ChangeLog 2008-05-07 Andrew Cagney * print.cxx: Include Errno-jni.hxx. * exceptions.cxx: Include Errno-jni.hxx. * Main.java: Move jnixx::exception definition to ... * jnixx.hxx (jnixx::exception): ... here. commit e7ca5bfd19d38d59e76e05923f9967292c4f4083 Author: Andrew Cagney Date: Tue May 6 23:15:57 2008 -0400 Generate inlined C++. frysk-sys/frysk/jnixx/ChangeLog 2008-05-06 Andrew Cagney Generate inlined C++ headers. * ClassWalker.java: Replace WalkClass. * ClassVisitor.java: Replace ClassWalker. * PrintDefinitions.java: Delete; split into ... * PrintCxxDefinitions.java: New; ... this ... * PrintHxxDefinitions.java: New; ... and this. * Main.java: Use. * PrintDeclarations.java: Extend ClassWalker. * PrintNamespaces.java: Extend ClassWalker. * Printer.java: Update. * jnixx.hxx: Simplify. * PrintIncludes.java: Delete. frysk-sys/frysk/rsl/ChangeLog 2008-05-06 Andrew Cagney * jni/Log.cxx: Replace jnixx::object with java::lang::Object. * jni/Log.hxx: Ditto. frysk-sys/frysk/sys/ChangeLog 2008-05-06 Andrew Cagney * jni/PseudoTerminal.cxx: Update, jboolean -> bool. ----------------------------------------------------------------------- Summary of changes: frysk-common/ChangeLog | 6 + frysk-common/Makefile.gen.sh | 101 ++++----- frysk-sys/frysk/jnixx/ChangeLog | 20 ++ .../jnixx/{WalkClass.java => ClassVisitor.java} | 49 +++-- frysk-sys/frysk/jnixx/ClassWalker.java | 61 +++++- frysk-sys/frysk/jnixx/Main.java | 67 ++---- ...PrintIncludes.java => PrintCxxDefinitions.java} | 123 +++++++---- frysk-sys/frysk/jnixx/PrintDeclarations.java | 141 +++++++++--- ...ntDefinitions.java => PrintHxxDefinitions.java} | 234 ++++++++------------ frysk-sys/frysk/jnixx/PrintNamespaces.java | 75 +++---- frysk-sys/frysk/jnixx/Printer.java | 132 +++++++---- frysk-sys/frysk/jnixx/exceptions.cxx | 3 +- frysk-sys/frysk/jnixx/jnixx.hxx | 75 +------ frysk-sys/frysk/jnixx/print.cxx | 4 +- frysk-sys/frysk/rsl/ChangeLog | 5 + frysk-sys/frysk/rsl/jni/Log.cxx | 14 +- frysk-sys/frysk/rsl/jni/Log.hxx | 14 +- frysk-sys/frysk/sys/ChangeLog | 4 + frysk-sys/frysk/sys/jni/PseudoTerminal.cxx | 2 +- 19 files changed, 606 insertions(+), 524 deletions(-) rename frysk-sys/frysk/jnixx/{WalkClass.java => ClassVisitor.java} (65%) rename frysk-sys/frysk/jnixx/{PrintIncludes.java => PrintCxxDefinitions.java} (52%) rename frysk-sys/frysk/jnixx/{PrintDefinitions.java => PrintHxxDefinitions.java} (56%) First 500 lines of diff: diff --git a/frysk-common/ChangeLog b/frysk-common/ChangeLog index bb3411a..a4b1758 100644 --- a/frysk-common/ChangeLog +++ b/frysk-common/ChangeLog @@ -1,3 +1,9 @@ +2008-05-06 Andrew Cagney + + * Makefile.gen.sh (generate_jnixx_sources): Delete. + (files.jnixx): New; eliminate duplicate jnixx files. + (jni): Depend on ${GEN_DIRNAME}.jar. + 2008-05-02 Andrew Cagney * Makefile.gen.sh (generate_jnixx_sources): Order build so that diff --git a/frysk-common/Makefile.gen.sh b/frysk-common/Makefile.gen.sh index 928c119..e45f312 100755 --- a/frysk-common/Makefile.gen.sh +++ b/frysk-common/Makefile.gen.sh @@ -137,6 +137,15 @@ else mv files.tmp files.list fi +# It is assumed that each file is of the form DIRNAME/BASENAME.SUFFIX, +# pre-process each into: FILE DIRNAME BASENAME SUFFIX + +sed -e 's,^\(\(.*\)/\([^/]*\)\.\([a-zA-Z-]*\)\),\1 \2 \3 \4,' \ + -e 's,-in$,,' \ + -e 's,-sh$,,' \ + < files.list \ + > files.base + # echo Creating Makefile.gen from directories ${dirs} ... @@ -666,29 +675,30 @@ jnixx_sources = \$(wildcard \$(root_srcdir)/frysk-sys/frysk/jnixx/*.java) # If any of the JNI sources change, re-generate everything. \$(JNIXX_BUILT): \$(jnixx_sources) EOF -generate_jnixx_sources () { - local file=$1 - local d=$2 - local b=$3 - local suffix=$4 - local sources=$5 - local _file=`echo $file | tr '[/.]' '[__]'` - sed -n \ - -e 's,#include "\(.*\)-jni\.hxx".*,include - \1,p' \ - -e 's,#include \([A-Z][A-Z0-9_]*\).*,minclude \1 -,p' \ - -e 's,#define \([A-Z0-9_]*\) "\(.*\)-jni\.hxx".*,define \1 \2,p' \ - < $file > $$.tmp - while read action m h j; do - echo "# file=$file action=$action m=$m h=$h" - if test "$action" = "minclude" ; then - # Assume file defining macro depends on this file - automake_variable $m = \$\($_file\) - elif has_java_source ${h} ; then - j=`echo ${h} | tr '[_]' '[/]'` - cat < files.jnixx +while read action m h j; do + echo "# action=$action m=$m h=$h" + if test "$action" = "minclude" ; then + # Assume file defining macro depends on this file + automake_variable $m = \$\($_file\) + elif has_java_source ${h} ; then + j=`echo ${h} | tr '[_]' '[/]'` + automake_variable lib${GEN_MAKENAME}_jni_a_SOURCES += ${h}-jni.cxx + cat < files.base - print_header "bulk processing" while read file dir base suffix ; do @@ -967,10 +968,8 @@ while read file dir base suffix ; do generate_cni_header $file $dir $base $suffix generate_compile $file $dir $base $suffix ${sources} ;; - */jni/*.cxx | */jni/*.cxx-in | */jni/*.cxx-sh) + */jni/*.cxx | */jni/*.cxx-in | */jni/*.cxx-sh | */jnixx/*.cxx ) generate_jni_dependency $file $dir $base $suffix - generate_jnixx_sources $file $dir $base $suffix \ - lib${GEN_MAKENAME}_jni_a_SOURCES generate_compile $file $dir $base $suffix \ lib${GEN_MAKENAME}_jni_a_SOURCES ;; @@ -994,6 +993,6 @@ lib${GEN_MAKENAME}_jni_so_SOURCES = solib_PROGRAMS += lib${GEN_DIRNAME}-jni.so lib${GEN_DIRNAME}-jni.so: lib${GEN_DIRNAME}-jni.a .PHONY: jni -jni: lib${GEN_DIRNAME}-jni.so +jni: lib${GEN_DIRNAME}-jni.so ${GEN_DIRNAME}.jar EOF fi diff --git a/frysk-sys/frysk/jnixx/ChangeLog b/frysk-sys/frysk/jnixx/ChangeLog index b38a94c..5efff6c 100644 --- a/frysk-sys/frysk/jnixx/ChangeLog +++ b/frysk-sys/frysk/jnixx/ChangeLog @@ -1,5 +1,25 @@ +2008-05-07 Andrew Cagney + + * print.cxx: Include Errno-jni.hxx. + * exceptions.cxx: Include Errno-jni.hxx. + * Main.java: Move jnixx::exception definition to ... + * jnixx.hxx (jnixx::exception): ... here. + 2008-05-06 Andrew Cagney + Generate inlined C++ headers. + * ClassWalker.java: Replace WalkClass. + * ClassVisitor.java: Replace ClassWalker. + * PrintDefinitions.java: Delete; split into ... + * PrintCxxDefinitions.java: New; ... this ... + * PrintHxxDefinitions.java: New; ... and this. + * Main.java: Use. + * PrintDeclarations.java: Extend ClassWalker. + * PrintNamespaces.java: Extend ClassWalker. + * Printer.java: Update. + * jnixx.hxx: Simplify. + * PrintIncludes.java: Delete. + * jnixx.hxx (jnixx::env): Add Array methods. * PrintDefinitions.java: Don't cast primitive array results. diff --git a/frysk-sys/frysk/jnixx/WalkClass.java b/frysk-sys/frysk/jnixx/ClassVisitor.java similarity index 65% rename from frysk-sys/frysk/jnixx/WalkClass.java rename to frysk-sys/frysk/jnixx/ClassVisitor.java index a76996d..2a883d0 100644 --- a/frysk-sys/frysk/jnixx/WalkClass.java +++ b/frysk-sys/frysk/jnixx/ClassVisitor.java @@ -43,21 +43,40 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Constructor; -class WalkClass { - static void visit(Class klass, ClassWalker walker) { - if (walker.acceptClass(klass)) { - Constructor[] constructors = klass.getDeclaredConstructors(); - for (int i = 0; i < constructors.length; i++) { - walker.acceptConstructor(constructors[i]); - } - Field[] fields = klass.getDeclaredFields(); - for (int i = 0; i < fields.length; i++) { - walker.acceptField(fields[i]); - } - Method[] methods = klass.getDeclaredMethods(); - for (int i = 0; i < methods.length; i++) { - walker.acceptMethod(methods[i]); - } +abstract class ClassVisitor { + void visit(Class klass) { + acceptComponent(klass.getComponentType()); + Class[] interfaces = klass.getInterfaces(); + for (int i = 0; i < interfaces.length; i++) { + acceptInterface(interfaces[i]); + } + Constructor[] constructors = klass.getDeclaredConstructors(); + for (int i = 0; i < constructors.length; i++) { + Constructor constructor = constructors[i]; + if (constructor.isSynthetic()) + continue; + acceptConstructor(constructor); + } + Field[] fields = klass.getDeclaredFields(); + for (int i = 0; i < fields.length; i++) { + Field field = fields[i]; + if (field.isSynthetic()) + continue; + acceptField(field); + } + Method[] methods = klass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + Method method = methods[i]; + if (method.isSynthetic()) + continue; + acceptMethod(method); } } + + abstract void acceptInterface(Class constructor); + abstract void acceptConstructor(Constructor constructor); + abstract void acceptField(Field field); + abstract void acceptMethod(Method method); + abstract void acceptComponent(Class klass); + abstract void acceptNested(Class klass); } diff --git a/frysk-sys/frysk/jnixx/ClassWalker.java b/frysk-sys/frysk/jnixx/ClassWalker.java index 244b0bb..ae85ca3 100644 --- a/frysk-sys/frysk/jnixx/ClassWalker.java +++ b/frysk-sys/frysk/jnixx/ClassWalker.java @@ -42,16 +42,59 @@ package frysk.jnixx; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Constructor; +import java.util.Set; +import java.util.HashSet; -interface ClassWalker { - +abstract class ClassWalker { + private final Set visited = new HashSet(); + private void walk(Class[] klasses) { + for (int i = 0; i < klasses.length; i++) { + walk(klasses[i]); + } + } + private final ClassVisitor visitor = new ClassVisitor() { + void acceptComponent(Class klass) { + } + void acceptInterface(Class klass) { + walk(klass); + } + void acceptConstructor(Constructor constructor) { + walk(constructor.getParameterTypes()); + } + void acceptField(Field field) { + walk(field.getType()); + } + void acceptMethod(Method method) { + walk(method.getReturnType()); + walk(method.getParameterTypes()); + } + void acceptNested(Class klass) { + walk(klass); + } + }; + void walk(Class klass) { + if (klass == null) + return; + if (visited.contains(klass)) + return; + visited.add(klass); + walk(klass.getSuperclass()); + if (klass.isArray()) { + acceptArray(klass); + } else if (klass.isPrimitive()) { + acceptPrimitive(klass); + } else if (klass.isInterface()) { + acceptInterface(klass); + } else { + acceptClass(klass); + } + visitor.visit(klass); + } /** - * Returns true to indicate the need to walk this classes - * internals. + * Accept/visit the specified class. */ - boolean acceptClass(Class klass); - void acceptConstructor(Constructor constructor); - void acceptField(Field field); - void acceptMethod(Method method); - + abstract void acceptArray(Class klass); + abstract void acceptPrimitive(Class klass); + abstract void acceptClass(Class klass); + abstract void acceptInterface(Class klass); } diff --git a/frysk-sys/frysk/jnixx/Main.java b/frysk-sys/frysk/jnixx/Main.java index 43ee1ab..e2a6453 100644 --- a/frysk-sys/frysk/jnixx/Main.java +++ b/frysk-sys/frysk/jnixx/Main.java @@ -41,66 +41,35 @@ 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 "); + p.println("#include "); + p.println(); + p.println("namespace jnixx {"); + p.println(" struct exception;"); + p.println(" struct env;"); + p.println("}"); + new PrintNamespaces(p).walk(klass); + new PrintDeclarations(p).walk(klass); + p.println(); p.println("#include \"frysk/jnixx/jnixx.hxx\""); - Class parent = klass.getSuperclass(); - if (parent != Object.class) { - p.println(); - p.print("#include \""); - p.printHeaderFileName(parent); - p.print("\""); - p.println(); - } - printHxxBody(p, klass, new PrintNamespaces(p)); + new PrintHxxDefinitions(p).walk(klass); p.println(); p.println("#endif"); } private static void printCxxFile(Printer p, Class klass) { - p.println("#include \"frysk/jnixx/jnixx.hxx\""); - WalkClass.visit(klass, new PrintIncludes(p, new PrintNamespaces(p))); - WalkClass.visit(klass, new PrintDefinitions(p)); + p.print("#include \""); + p.printHeaderFileName(klass); + p.println("\""); + p.print("jclass "); + p.printQualifiedCxxName(klass); + p.println("::_class$;"); + new PrintCxxDefinitions(p).visit(klass); } public static void main(String[] args) throws ClassNotFoundException { diff --git a/frysk-sys/frysk/jnixx/PrintIncludes.java b/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java similarity index 52% rename from frysk-sys/frysk/jnixx/PrintIncludes.java rename to frysk-sys/frysk/jnixx/PrintCxxDefinitions.java index 3a4a746..9325b32 100644 --- a/frysk-sys/frysk/jnixx/PrintIncludes.java +++ b/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java @@ -39,67 +39,100 @@ package frysk.jnixx; -import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.util.HashSet; +import java.lang.reflect.Field; import java.lang.reflect.Constructor; +import java.lang.reflect.Modifier; -class PrintIncludes implements ClassWalker { +class PrintCxxDefinitions extends ClassVisitor { private final Printer p; - private final PrintNamespaces printNamespaces; - PrintIncludes(Printer p, PrintNamespaces printNamespaces) { + PrintCxxDefinitions(Printer p) { this.p = p; - this.printNamespaces = printNamespaces; } - /** - * Print #includes for any non system headers.. - */ - private void printCxxInclude(Class klass) { - while (klass.isArray()) { - klass = klass.getComponentType(); + + private void printNativeMethodDefinition(Method method) { + boolean isStatic = Modifier.isStatic(method.getModifiers()); + p.println(); + while (p.dent(0, "extern \"C\" {", "};")) { + p.print("JNIEXPORT "); + p.printJniType(method.getReturnType()); + p.print(" JNICALL "); + p.printJniName(method); + p.print("("); + p.printFormalJniParameters(method, false); + p.println(");"); } - if (klass.isPrimitive()) - return; - if (klass.getName().startsWith("java.")) - return; - if (printedNamespaces.contains(klass)) - return; - Class superclass = klass.getSuperclass(); - if (superclass != null) { - printCxxInclude(superclass); + p.println(); + p.printJniType(method.getReturnType()); + p.println(); + p.printJniName(method); + p.print("("); + p.printFormalJniParameters(method, true); + p.print(")"); + while (p.dent(0, "{", "};")) { + p.println("try {"); + { + p.indent(); + 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()); + } hooks/post-receive -- frysk system monitor/debugger