From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28654 invoked by alias); 9 May 2008 21:17:39 -0000 Received: (qmail 28629 invoked by uid 367); 9 May 2008 21:17:39 -0000 Date: Fri, 09 May 2008 21:17:00 -0000 Message-ID: <20080509211739.28614.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Generate bindings for all classes in the .jar. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 88dee672fef4050c808116f20e45765bf5c231d8 X-Git-Newrev: 88e037617835894d075066f6abfdb41fd7175eb6 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/msg00220.txt.bz2 The branch, master has been updated via 88e037617835894d075066f6abfdb41fd7175eb6 (commit) from 88dee672fef4050c808116f20e45765bf5c231d8 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 88e037617835894d075066f6abfdb41fd7175eb6 Author: Andrew Cagney Date: Fri May 9 17:16:03 2008 -0400 Generate bindings for all classes in the .jar. frysk-common/ChangeLog 2008-05-09 Andrew Cagney * (jni.hxx, jni.cxx): Pass the entire jar to jnixx. frysk-sys/frysk/jnixx/ChangeLog 2008-05-09 Andrew Cagney * Main.java: Take a class file; dump all classes; print progress. * Printer.java: Break up <: in "array<::Component>" ----------------------------------------------------------------------- Summary of changes: frysk-common/ChangeLog | 2 + frysk-common/Makefile.gen.sh | 13 ++++--- frysk-sys/frysk/jnixx/ChangeLog | 3 ++ frysk-sys/frysk/jnixx/Main.java | 65 +++++++++++++++++++++++------------- frysk-sys/frysk/jnixx/Printer.java | 11 ++++-- 5 files changed, 63 insertions(+), 31 deletions(-) First 500 lines of diff: diff --git a/frysk-common/ChangeLog b/frysk-common/ChangeLog index 938763a..af4b463 100644 --- a/frysk-common/ChangeLog +++ b/frysk-common/ChangeLog @@ -1,5 +1,7 @@ 2008-05-09 Andrew Cagney + * (jni.hxx, jni.cxx): Pass the entire jar to jnixx. + * Makefile.gen.sh (jni.cxx, jni.hxx): Pass header name to jnixx. (jni.o): Explicitly specify dependencies. diff --git a/frysk-common/Makefile.gen.sh b/frysk-common/Makefile.gen.sh index 5fb1b41..82cee00 100755 --- a/frysk-common/Makefile.gen.sh +++ b/frysk-common/Makefile.gen.sh @@ -672,7 +672,6 @@ generate_jnixx_class() { local suffix=$4 local j=$(echo $(dirname $dir)/$base) if has_java_source $j ; then - automake_variable JNIXX_CLASSES += $(echo $j | tr '[/]' '[.]') echo "${dir}/${base}.o: $j.java | jni.hxx.gch" fi } @@ -900,15 +899,19 @@ jnixx_sources = \$(wildcard \$(root_srcdir)/frysk-sys/frysk/jnixx/*.java) CLEANFILES += jni.hxx jni.cxx jni.hxx.gch \$(lib${GEN_MAKENAME}_jni_a_SOURCES): | jni.hxx jni.hxx.gch jni.hxx: \$(jnixx_sources) | ${GEN_DIRNAME}.jar - CLASSPATH=\$(GEN_DIRNAME).jar:\$(CLASSPATH) \ - \$(JAVA) frysk.jnixx.Main hxx jni.hxx \$(JNIXX_CLASSES) \ + CLASSPATH=\$(GEN_DIRNAME).jar:\$(CLASSPATH) \\ + \$(JAVA) frysk.jnixx.Main \\ + hxx \\ + jni.hxx ${GEN_DIRNAME}.jar \\ > \$@.tmp mv \$@.tmp \$@ jni.hxx.gch: jni.hxx \$(CXXCOMPILE) -c -x c++-header jni.hxx jni.cxx: \$(jnixx_sources) | ${GEN_DIRNAME}.jar - CLASSPATH=\$(GEN_DIRNAME).jar:\$(CLASSPATH) \ - \$(JAVA) frysk.jnixx.Main cxx jni.hxx \$(JNIXX_CLASSES) \ + CLASSPATH=\$(GEN_DIRNAME).jar:\$(CLASSPATH) \\ + \$(JAVA) frysk.jnixx.Main \\ + cxx \\ + jni.hxx ${GEN_DIRNAME}.jar \\ > \$@.tmp mv \$@.tmp \$@ jni.o: jni.hxx | jni.hxx.gch diff --git a/frysk-sys/frysk/jnixx/ChangeLog b/frysk-sys/frysk/jnixx/ChangeLog index 720b855..c80cec6 100644 --- a/frysk-sys/frysk/jnixx/ChangeLog +++ b/frysk-sys/frysk/jnixx/ChangeLog @@ -1,5 +1,8 @@ 2008-05-09 Andrew Cagney + * Main.java: Take a class file; dump all classes; print progress. + * Printer.java: Break up <: in "array<::Component>" + * Main.java: Add a header filename parameter; in .cxx file, generate #include of header, instead of header contents. diff --git a/frysk-sys/frysk/jnixx/Main.java b/frysk-sys/frysk/jnixx/Main.java index 7146d51..3fb4f45 100644 --- a/frysk-sys/frysk/jnixx/Main.java +++ b/frysk-sys/frysk/jnixx/Main.java @@ -43,9 +43,18 @@ import java.io.PrintWriter; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Member; +import java.util.jar.JarFile; +import java.util.jar.JarEntry; +import java.util.Collections; +import java.util.List; +import java.util.HashSet; +import java.util.Iterator; +import java.io.IOException; class Main { + private static HashSet localClasses = new HashSet(); + /** * Does this method require native bindings? Methods that are not * part of this JNI library, that are native, must be treated as @@ -54,13 +63,9 @@ class Main { static boolean treatAsNative(Method method) { // FIXME: Should be filtering based on something smarter than // this. - if (method.getDeclaringClass().getName().startsWith("java.")) - return false; - if (method.getDeclaringClass().getName().startsWith("gnu.")) + if (!localClasses.contains(method.getDeclaringClass())) return false; - if (Modifier.isNative(method.getModifiers())) - return true; - return false; + return Modifier.isNative(method.getModifiers()); } /** @@ -68,26 +73,24 @@ class Main { * methods and fileds and the java package are not visible. */ static boolean treatAsInvisible(Member member) { - if (Modifier.isPrivate(member.getModifiers())) { - // FIXME: Should be filtering based on something smarter - // than is. - if (member.getDeclaringClass().getName().startsWith("java.")) - return true; - if (member.getDeclaringClass().getName().startsWith("gnu.")) - return true; - } - return false; + // Local or defining classea are always visible. + if (localClasses.contains(member.getDeclaringClass())) + return false; + return Modifier.isPrivate(member.getModifiers()); } private static void printHxxFile(Printer p, String headerFile, Class[] classes) { p.println("#include \"frysk/jnixx/jnixx.hxx\""); + System.err.println("Generating namespaces"); new PrintNamespaces(p).walk(classes); p.println(); p.println("\f"); + System.err.println("Generating declarations"); new PrintDeclarations(p).walk(classes); p.println(); p.println("\f"); + System.err.println("Generating definitions"); new PrintHxxDefinitions(p).walk(classes); } @@ -97,23 +100,39 @@ class Main { p.print(headerFile); p.println("\""); p.println(); + System.err.println("Generating definitions"); new PrintCxxDefinitions(p).walk(classes); } - public static void main(String[] args) throws ClassNotFoundException { - if (args.length < 3) { - throw new RuntimeException("Usage: jnixx cxx|hxx ..."); + public static void main(String[] args) + throws ClassNotFoundException, IOException + { + if (args.length != 3) { + throw new RuntimeException("Usage: jnixx cxx|hxx "); } boolean generateHeader = args[0].equals("hxx"); String headerFile = args[1]; - final int firstClass = 2; - Class[] classes = new Class[args.length - firstClass]; - for (int i = 0; i < classes.length; i++) { - classes[i] = Class.forName(args[i + firstClass], false, - Main.class.getClassLoader()); + String jarFile = args[2]; + + System.err.println("Reading " + jarFile); + List entries = Collections.list(new JarFile(jarFile).entries()); + for (Iterator i = entries.iterator(); i.hasNext(); ) { + JarEntry entry = (JarEntry) i.next(); + String name = entry.getName(); + if (!name.endsWith(".class")) + continue; + String className = name + .replaceAll(".class$", "") + .replaceAll("/", "."); + Class klass = Class.forName(className, false, + Main.class.getClassLoader()); + localClasses.add(klass); } + Class[] classes = new Class[localClasses.size()]; + localClasses.toArray(classes); + Printer p = new Printer(new PrintWriter(System.out)); if (generateHeader) printHxxFile(p, headerFile, classes); diff --git a/frysk-sys/frysk/jnixx/Printer.java b/frysk-sys/frysk/jnixx/Printer.java index 007acc2..e5df665 100644 --- a/frysk-sys/frysk/jnixx/Printer.java +++ b/frysk-sys/frysk/jnixx/Printer.java @@ -179,10 +179,15 @@ class Printer { if (global) { print("::"); } - print("jnixx::array<"); - printCxxName(klass.getComponentType(), false); + print("jnixx::array< "); + if (global) { + // Prevents "<:" in "array<::Component>" + print(" "); + } + printCxxName(klass.getComponentType(), global); if (componentType.isArray()) { - print(" "); // prevent's ">>". + // Prevents ">>" in "array>". + print(" "); } print(">"); } hooks/post-receive -- frysk system monitor/debugger