public inbox for frysk-cvs@sourceware.org help / color / mirror / Atom feed
From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Generate bindings for all classes in the .jar. Date: Fri, 09 May 2008 21:17:00 -0000 [thread overview] Message-ID: <20080509211739.28614.qmail@sourceware.org> (raw) 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 <cagney@redhat.com> 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 <cagney@redhat.com> * (jni.hxx, jni.cxx): Pass the entire jar to jnixx. frysk-sys/frysk/jnixx/ChangeLog 2008-05-09 Andrew Cagney <cagney@redhat.com> * 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 <cagney@redhat.com> + * (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 <cagney@redhat.com> + * 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 <header-filename> <class-name> ..."); + public static void main(String[] args) + throws ClassNotFoundException, IOException + { + if (args.length != 3) { + throw new RuntimeException("Usage: jnixx cxx|hxx <header-filename> <jar-file>"); } 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<array<Component>>". + print(" "); } print(">"); } hooks/post-receive -- frysk system monitor/debugger
reply other threads:[~2008-05-09 21:17 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=20080509211739.28614.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: linkBe 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).