public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Generate bindings for all classes in the .jar.
@ 2008-05-09 21:17 cagney
  0 siblings, 0 replies; only message in thread
From: cagney @ 2008-05-09 21:17 UTC (permalink / raw)
  To: frysk-cvs

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


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-05-09 21:17 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-09 21:17 [SCM] master: Generate bindings for all classes in the .jar cagney

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