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: 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).