public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Break up jnixx.java.
Date: Fri, 02 May 2008 17:27:00 -0000	[thread overview]
Message-ID: <20080502172716.25036.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  af25ece64f0052558eafb2673a73c972b434ca2a (commit)
      from  f93291d2e47b362bbf2247ac41e5867d64a778f4 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit af25ece64f0052558eafb2673a73c972b434ca2a
Author: Andrew Cagney <cagney@redhat.com>
Date:   Fri May 2 13:25:47 2008 -0400

    Break up jnixx.java.
    
    frysk-common/ChangeLog
    2008-05-02  Andrew Cagney  <cagney@redhat.com>
    
    	* Makefile.rules (JNIXX): Update; frysk.jnixx.jnixx refactored,
    	main in frysk.jnixx.Main.
    
    frysk-sys/frysk/jnixx/ChangeLog
    2008-05-02  Andrew Cagney  <cagney@redhat.com>
    
    	* jnixx.java: Refactor into ...
    	* Main.java: ... this; new.
    	* WalkClass.java: ... this; new.
    	* PrintDeclarations.java: ... this; new.
    	* PrintDefinitions.java: ... this; new.
    	* Printer.java: ... this; new.
    	* PrintNamespaces.java: ... this; new.

-----------------------------------------------------------------------

Summary of changes:
 frysk-common/ChangeLog                       |    3 +
 frysk-common/Makefile.rules                  |    2 +-
 frysk-sys/frysk/jnixx/ChangeLog              |    8 +
 frysk-sys/frysk/jnixx/ClassWalker.java       |   57 ++
 frysk-sys/frysk/jnixx/Main.java              |   96 ++++
 frysk-sys/frysk/jnixx/PrintDeclarations.java |  116 ++++
 frysk-sys/frysk/jnixx/PrintDefinitions.java  |  276 ++++++++++
 frysk-sys/frysk/jnixx/PrintNamespaces.java   |  114 ++++
 frysk-sys/frysk/jnixx/Printer.java           |  440 +++++++++++++++
 frysk-sys/frysk/jnixx/WalkClass.java         |   63 +++
 frysk-sys/frysk/jnixx/jnixx.java             |  744 --------------------------
 11 files changed, 1174 insertions(+), 745 deletions(-)
 create mode 100644 frysk-sys/frysk/jnixx/ClassWalker.java
 create mode 100644 frysk-sys/frysk/jnixx/Main.java
 create mode 100644 frysk-sys/frysk/jnixx/PrintDeclarations.java
 create mode 100644 frysk-sys/frysk/jnixx/PrintDefinitions.java
 create mode 100644 frysk-sys/frysk/jnixx/PrintNamespaces.java
 create mode 100644 frysk-sys/frysk/jnixx/Printer.java
 create mode 100644 frysk-sys/frysk/jnixx/WalkClass.java
 delete mode 100644 frysk-sys/frysk/jnixx/jnixx.java

First 500 lines of diff:
diff --git a/frysk-common/ChangeLog b/frysk-common/ChangeLog
index 84ebce5..ba5bcd8 100644
--- a/frysk-common/ChangeLog
+++ b/frysk-common/ChangeLog
@@ -1,5 +1,8 @@
 2008-05-02  Andrew Cagney  <cagney@redhat.com>
 
+	* Makefile.rules (JNIXX): Update; frysk.jnixx.jnixx refactored,
+	main in frysk.jnixx.Main.
+
 	* Makefile.rules (JNIXX): Update; frysk.jni renamed to
 	frysk.jnixx.
 
diff --git a/frysk-common/Makefile.rules b/frysk-common/Makefile.rules
index 224c4ad..5382b2a 100644
--- a/frysk-common/Makefile.rules
+++ b/frysk-common/Makefile.rules
@@ -402,7 +402,7 @@ JNIXX = \
 	echo "$$class $$suffix => $@" ; \
 	rm -f $@.tmp ; \
 	CLASSPATH=$(GEN_DIRNAME).jar:$(CLASSPATH) \
-	    $(JAVA) frysk.jnixx.jnixx $$class $$suffix \
+	    $(JAVA) frysk.jnixx.Main $$class $$suffix \
 		> $@.tmp ; \
 	mv $@.tmp $@
 %-jni.hxx: %.java
diff --git a/frysk-sys/frysk/jnixx/ChangeLog b/frysk-sys/frysk/jnixx/ChangeLog
index cc35afb..dc7e4d6 100644
--- a/frysk-sys/frysk/jnixx/ChangeLog
+++ b/frysk-sys/frysk/jnixx/ChangeLog
@@ -1,5 +1,13 @@
 2008-05-02  Andrew Cagney  <cagney@redhat.com>
 
+	* jnixx.java: Refactor into ...
+	* Main.java: ... this; new.
+	* WalkClass.java: ... this; new.
+	* PrintDeclarations.java: ... this; new.
+	* PrintDefinitions.java: ... this; new.
+	* Printer.java: ... this; new.
+	* PrintNamespaces.java: ... this; new.
+
 	* Rename directory to frysk/jnixx/
 
 	* jnixx.java: Generate constructors and field accessors.
diff --git a/frysk-sys/frysk/jnixx/ClassWalker.java b/frysk-sys/frysk/jnixx/ClassWalker.java
new file mode 100644
index 0000000..244b0bb
--- /dev/null
+++ b/frysk-sys/frysk/jnixx/ClassWalker.java
@@ -0,0 +1,57 @@
+// This file is part of the program FRYSK.
+//
+// Copyright 2008, Red Hat Inc.
+//
+// FRYSK is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by
+// the Free Software Foundation; version 2 of the License.
+//
+// FRYSK is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+// 
+// You should have received a copy of the GNU General Public License
+// along with FRYSK; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+// 
+// In addition, as a special exception, Red Hat, Inc. gives You the
+// additional right to link the code of FRYSK with code not covered
+// under the GNU General Public License ("Non-GPL Code") and to
+// distribute linked combinations including the two, subject to the
+// limitations in this paragraph. Non-GPL Code permitted under this
+// exception must only link to the code of FRYSK through those well
+// defined interfaces identified in the file named EXCEPTION found in
+// the source code files (the "Approved Interfaces"). The files of
+// Non-GPL Code may instantiate templates or use macros or inline
+// functions from the Approved Interfaces without causing the
+// resulting work to be covered by the GNU General Public
+// License. Only Red Hat, Inc. may make changes or additions to the
+// list of Approved Interfaces. You must obey the GNU General Public
+// License in all respects for all of the FRYSK code and other code
+// used in conjunction with FRYSK except the Non-GPL Code covered by
+// this exception. If you modify this file, you may extend this
+// exception to your version of the file, but you are not obligated to
+// do so. If you do not wish to provide this exception without
+// modification, you must delete this exception statement from your
+// version and license this file solely under the GPL without
+// exception.
+
+package frysk.jnixx;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Constructor;
+
+interface ClassWalker {
+
+    /**
+     * Returns true to indicate the need to walk this classes
+     * internals.
+     */
+    boolean acceptClass(Class klass);
+    void acceptConstructor(Constructor constructor);
+    void acceptField(Field field);
+    void acceptMethod(Method method);
+
+}
diff --git a/frysk-sys/frysk/jnixx/Main.java b/frysk-sys/frysk/jnixx/Main.java
new file mode 100644
index 0000000..c030532
--- /dev/null
+++ b/frysk-sys/frysk/jnixx/Main.java
@@ -0,0 +1,96 @@
+// This file is part of the program FRYSK.
+//
+// Copyright 2008, Red Hat Inc.
+//
+// FRYSK is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by
+// the Free Software Foundation; version 2 of the License.
+//
+// FRYSK is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+// 
+// You should have received a copy of the GNU General Public License
+// along with FRYSK; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+// 
+// In addition, as a special exception, Red Hat, Inc. gives You the
+// additional right to link the code of FRYSK with code not covered
+// under the GNU General Public License ("Non-GPL Code") and to
+// distribute linked combinations including the two, subject to the
+// limitations in this paragraph. Non-GPL Code permitted under this
+// exception must only link to the code of FRYSK through those well
+// defined interfaces identified in the file named EXCEPTION found in
+// the source code files (the "Approved Interfaces"). The files of
+// Non-GPL Code may instantiate templates or use macros or inline
+// functions from the Approved Interfaces without causing the
+// resulting work to be covered by the GNU General Public
+// License. Only Red Hat, Inc. may make changes or additions to the
+// list of Approved Interfaces. You must obey the GNU General Public
+// License in all respects for all of the FRYSK code and other code
+// used in conjunction with FRYSK except the Non-GPL Code covered by
+// this exception. If you modify this file, you may extend this
+// exception to your version of the file, but you are not obligated to
+// do so. If you do not wish to provide this exception without
+// modification, you must delete this exception statement from your
+// version and license this file solely under the GPL without
+// exception.
+
+package frysk.jnixx;
+
+class Main {
+
+    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 \"frysk/jnixx/xx.hxx\"");
+	WalkClass.visit(klass, new PrintNamespaces(p));
+	p.println();
+	Class parent = klass.getSuperclass();
+	if (parent != Object.class) {
+	    p.print("#include \"");
+	    p.printHeaderFileName(parent);
+	    p.print("\"");
+	    p.println();
+	}
+	p.print("struct ");
+	p.printQualifiedCxxName(klass);
+	if (parent == Object.class) {
+	    p.print(" : public __jobject");
+	} else if (parent != null) {
+	    p.print(" : public ");
+	    p.printQualifiedCxxName(parent);
+	}
+	p.println(" {");
+	WalkClass.visit(klass, new PrintDeclarations(p));
+	p.println();
+	p.println("};");
+	p.println();
+	p.println("#endif");
+    }
+
+    private static void printCxxFile(Printer p, Class klass) {
+	p.print("#include \"");
+	p.printHeaderFileName(klass);
+	p.println("\"");
+	WalkClass.visit(klass, new PrintDefinitions(p));
+    }
+
+    public static void main(String[] args) throws ClassNotFoundException {
+	if (args.length != 2) {
+	    throw new RuntimeException("Usage: jnixx <class-name>");
+	}
+
+	Class klass = Class.forName(args[0], false,
+				    Main.class.getClassLoader());
+	Printer p = new Printer();
+
+	if (args[1].equals("hxx"))
+	    printHxxFile(p, klass);
+	else
+	    printCxxFile(p, klass);
+    }
+}
diff --git a/frysk-sys/frysk/jnixx/PrintDeclarations.java b/frysk-sys/frysk/jnixx/PrintDeclarations.java
new file mode 100644
index 0000000..30f14d9
--- /dev/null
+++ b/frysk-sys/frysk/jnixx/PrintDeclarations.java
@@ -0,0 +1,116 @@
+// This file is part of the program FRYSK.
+//
+// Copyright 2008, Red Hat Inc.
+//
+// FRYSK is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by
+// the Free Software Foundation; version 2 of the License.
+//
+// FRYSK is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+// 
+// You should have received a copy of the GNU General Public License
+// along with FRYSK; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+// 
+// In addition, as a special exception, Red Hat, Inc. gives You the
+// additional right to link the code of FRYSK with code not covered
+// under the GNU General Public License ("Non-GPL Code") and to
+// distribute linked combinations including the two, subject to the
+// limitations in this paragraph. Non-GPL Code permitted under this
+// exception must only link to the code of FRYSK through those well
+// defined interfaces identified in the file named EXCEPTION found in
+// the source code files (the "Approved Interfaces"). The files of
+// Non-GPL Code may instantiate templates or use macros or inline
+// functions from the Approved Interfaces without causing the
+// resulting work to be covered by the GNU General Public
+// License. Only Red Hat, Inc. may make changes or additions to the
+// list of Approved Interfaces. You must obey the GNU General Public
+// License in all respects for all of the FRYSK code and other code
+// used in conjunction with FRYSK except the Non-GPL Code covered by
+// this exception. If you modify this file, you may extend this
+// exception to your version of the file, but you are not obligated to
+// do so. If you do not wish to provide this exception without
+// modification, you must delete this exception statement from your
+// version and license this file solely under the GPL without
+// exception.
+
+package frysk.jnixx;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Modifier;
+
+class PrintDeclarations implements ClassWalker {
+
+    private final Printer p;
+    PrintDeclarations(Printer p) {
+	this.p = p;
+    }
+
+    public boolean acceptClass(Class klass) {
+	// Static get-class method - a class knows its own class.
+	p.println();
+	p.print("  public: static jclass Class(JNIEnv* env);");
+	return true;
+    }
+
+    public void acceptConstructor(Constructor constructor) {
+	p.println();
+	p.printModifiers(constructor);
+	p.print(" ");
+	p.printCxxType(constructor.getDeclaringClass());
+	p.print(" New(");
+	p.printFormalCxxParameters(constructor, false);
+	p.print(");");
+	p.println();
+    }
+
+    private void printCxxFieldAccessorDeclaration(Field field, boolean get) {
+	p.printModifiers(field);
+	if (get) {
+	    p.print(" ");
+	    p.printCxxType(field.getType());
+	    p.print(" Get");
+	} else {
+	    p.print(" void Set");
+	}
+	String name = field.getName();
+	p.print(Character.toUpperCase(name.charAt(0)));
+	p.print(name.substring(1));
+	p.print("(JNIEnv*");
+	if (!Modifier.isStatic(field.getModifiers())) {
+	    p.print(", ");
+	    p.printCxxType(field.getDeclaringClass());
+	}
+	if (!get) {
+	    p.print(", ");
+	    p.printCxxType(field.getType());
+	    p.print(" value");
+	}
+	p.println(");");
+    }
+
+    public void acceptField(Field field) {
+	printCxxFieldAccessorDeclaration(field, true);
+	if (!Modifier.isFinal(field.getModifiers())) {
+	    printCxxFieldAccessorDeclaration(field, false);
+	}
+    }
+
+    public void acceptMethod(Method method) {
+	p.println();
+	p.printModifiers(method);
+	p.print(" ");
+	p.printCxxType(method.getReturnType());
+	p.print(" ");
+	p.print(method.getName());
+	p.print("(");
+	p.printFormalCxxParameters(method, false);
+	p.print(");");
+	p.println();
+    }
+}
diff --git a/frysk-sys/frysk/jnixx/PrintDefinitions.java b/frysk-sys/frysk/jnixx/PrintDefinitions.java
new file mode 100644
index 0000000..42f6de6
--- /dev/null
+++ b/frysk-sys/frysk/jnixx/PrintDefinitions.java
@@ -0,0 +1,276 @@
+// This file is part of the program FRYSK.
+//
+// Copyright 2008, Red Hat Inc.
+//
+// FRYSK is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by
+// the Free Software Foundation; version 2 of the License.
+//
+// FRYSK is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+// 
+// You should have received a copy of the GNU General Public License
+// along with FRYSK; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+// 
+// In addition, as a special exception, Red Hat, Inc. gives You the
+// additional right to link the code of FRYSK with code not covered
+// under the GNU General Public License ("Non-GPL Code") and to
+// distribute linked combinations including the two, subject to the
+// limitations in this paragraph. Non-GPL Code permitted under this
+// exception must only link to the code of FRYSK through those well
+// defined interfaces identified in the file named EXCEPTION found in
+// the source code files (the "Approved Interfaces"). The files of
+// Non-GPL Code may instantiate templates or use macros or inline
+// functions from the Approved Interfaces without causing the
+// resulting work to be covered by the GNU General Public
+// License. Only Red Hat, Inc. may make changes or additions to the
+// list of Approved Interfaces. You must obey the GNU General Public
+// License in all respects for all of the FRYSK code and other code
+// used in conjunction with FRYSK except the Non-GPL Code covered by
+// this exception. If you modify this file, you may extend this
+// exception to your version of the file, but you are not obligated to
+// do so. If you do not wish to provide this exception without
+// modification, you must delete this exception statement from your
+// version and license this file solely under the GPL without
+// exception.
+
+package frysk.jnixx;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Modifier;
+
+class PrintDefinitions implements ClassWalker {
+
+    private final Printer p;
+    PrintDefinitions(Printer p) {
+	this.p = p;
+    }
+
+    public boolean acceptClass(Class klass) {
+	// The class, via reflection.
+	p.println();
+	p.println("static jclass _Class;");
+	p.println();
+	p.println("jclass");
+	p.printQualifiedCxxName(klass);
+	p.println("::Class(JNIEnv* env) {");
+	p.println("  if (_Class == NULL) {");
+	p.println("    _Class = findClass(env, \""
+		+ klass.getName().replace("\\.", "/") + "\");");
+	p.println("  }");
+	p.println("  return _Class;");
+	p.println("}");
+	return true;
+    }
+
+    public void acceptConstructor(Constructor constructor) {
+	p.println();
+	p.printCxxType(constructor.getDeclaringClass());
+	p.println();
+	p.printQualifiedCxxName(constructor);
+	p.print("(");
+	p.printFormalCxxParameters(constructor, true);
+	p.println(") {");
+	p.println("  static jmethodID id;");
+	p.println("  if (id == NULL)");
+	p.print("    id = getMethodID(env, Class(env), \"<init>\", \"(");
+	p.printJniSignature(constructor.getParameterTypes());
+	p.println(")V\");");
+	p.print("  ");
+	p.printCxxType(constructor.getDeclaringClass());
+	p.print(" object = (");
+	p.printCxxType(constructor.getDeclaringClass());
+	p.print(") env->NewObject(");
+	p.printActualJniParameters(constructor);
+	p.println(");");
+	p.println("  if (object == NULL)");
+	p.println("    throw jnixx_exception();");
+	p.println("  return object;");
+	p.println("}");
+    }
+
+    private void printCxxFieldAccessorDefinition(Field field, boolean get) {
+	p.println();
+	if (get) {
+	    p.printCxxType(field.getType());
+	    p.println();
+	} else { 
+	    p.println("void");
+	}
+	p.printQualifiedCxxName(field.getDeclaringClass());
+	p.print("::");
+	if (get) {
+	    p.print("Get");
+	} else {
+	    p.print("Set");
+	}
+	String name = field.getName();
+	p.print(Character.toUpperCase(name.charAt(0)));
+	p.print(name.substring(1));
+	p.print("(JNIEnv* env");
+	if (!Modifier.isStatic(field.getModifiers())) {
+	    p.print(", ");
+	    p.printCxxType(field.getDeclaringClass());
+	    p.print(" object");
+	}
+	if (!get) {
+	    p.print(", ");
+	    p.printCxxType(field.getType());
+	    p.print(" value");
+	}
+	p.println(") {");
+	p.println("  if (" + name + "ID == NULL) {");
+	p.print("    " + name + "ID = getFieldID(env, ");
+	if (Modifier.isStatic(field.getModifiers())) {
+	    p.print("Class(env)");
+	} else {
+	    p.print("object");
+	}
+	p.print(", \"" + name + "\"");
+	p.print(", \"");
+	p.printJniSignature(field.getType());
+	p.print("\"");
+	p.println(");");
+	p.println("  }");
+	if (get) {
+	    p.print("  return");
+	    if (!field.getType().isPrimitive()) {
+		p.print(" (");
+		p.printCxxType(field.getType());
+		p.print(")");
+	    }
+	    p.print(" env->Get");
+	} else {
+	    p.print("  env->Set");
+	}
+	if (Modifier.isStatic(field.getModifiers())) {
+	    p.print("Static");
+	}
+	p.printJniReturnTypeName(field.getType());
+	p.print("Field(");
+	if (Modifier.isStatic(field.getModifiers())) {
+	    p.print("_Class");
+	} else {
+	    p.print("object");
+	}
+	p.print(", " + name + "ID");
+	if (!get) {
+	    p.print(",");


hooks/post-receive
--
frysk system monitor/debugger


                 reply	other threads:[~2008-05-02 17:27 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=20080502172716.25036.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).