public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Make JNIEnv optional.
Date: Mon, 12 May 2008 13:32:00 -0000	[thread overview]
Message-ID: <20080512133233.23361.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  06bb0d0b805004728277909ab93836e669b8c6cc (commit)
      from  d76e0603fee48fc72eca9b45c3ccb6fc781cbffa (commit)

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

- Log -----------------------------------------------------------------
commit 06bb0d0b805004728277909ab93836e669b8c6cc
Author: Andrew Cagney <cagney@redhat.com>
Date:   Sun May 11 23:06:38 2008 -0400

    Make JNIEnv optional.
    
    frysk-sys/frysk/jnixx/ChangeLog
    2008-05-11  Andrew Cagney  <cagney@redhat.com>
    
    	* Main.java: Set the VM during load.
    	* PrintDeclarations.java: Generate non-env parametered wrappers.
    	* PrintHxxDefinitions.java: Ditto.
    	* Printer.java: Ditto.
    
    frysk-sys/frysk/testbed/ChangeLog
    2008-05-11  Andrew Cagney  <cagney@redhat.com>
    
    	* jni/LocalMemory.cxx (codeAddr): New; use instead of JNI method.

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

Summary of changes:
 frysk-sys/frysk/jnixx/ChangeLog                |    7 +++
 frysk-sys/frysk/jnixx/Main.java                |   22 +++++++-
 frysk-sys/frysk/jnixx/PrintDeclarations.java   |   49 +++++++++++++++--
 frysk-sys/frysk/jnixx/PrintHxxDefinitions.java |   68 ++++++++++++++++++++---
 frysk-sys/frysk/jnixx/Printer.java             |   60 +++++++++++++++------
 frysk-sys/frysk/testbed/ChangeLog              |    4 ++
 frysk-sys/frysk/testbed/jni/LocalMemory.cxx    |   11 +++-
 7 files changed, 183 insertions(+), 38 deletions(-)

First 500 lines of diff:
diff --git a/frysk-sys/frysk/jnixx/ChangeLog b/frysk-sys/frysk/jnixx/ChangeLog
index c80cec6..5c4ea73 100644
--- a/frysk-sys/frysk/jnixx/ChangeLog
+++ b/frysk-sys/frysk/jnixx/ChangeLog
@@ -1,3 +1,10 @@
+2008-05-11  Andrew Cagney  <cagney@redhat.com>
+
+	* Main.java: Set the VM during load.
+	* PrintDeclarations.java: Generate non-env parametered wrappers.
+	* PrintHxxDefinitions.java: Ditto.
+	* Printer.java: Ditto.
+
 2008-05-09  Andrew Cagney  <cagney@redhat.com>
 
 	* Main.java: Take a class file; dump all classes; print progress.
diff --git a/frysk-sys/frysk/jnixx/Main.java b/frysk-sys/frysk/jnixx/Main.java
index 3fb4f45..3d5263d 100644
--- a/frysk-sys/frysk/jnixx/Main.java
+++ b/frysk-sys/frysk/jnixx/Main.java
@@ -70,7 +70,8 @@ class Main {
 
     /**
      * Is the member visible to this generated JNI code.  Private
-     * methods and fileds and the java package are not visible.
+     * methods and Fields outside of the package of interest are not
+     * visible.
      */
     static boolean treatAsInvisible(Member member) {
 	// Local or defining classea are always visible.
@@ -82,10 +83,14 @@ class Main {
     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("namespace jnixx {");
+	p.println("  extern JavaVM* vm;");
+	p.println("}");
 	p.println();
 	p.println("\f");
+	System.err.println("Generating namespaces");
+	new PrintNamespaces(p).walk(classes);
 	System.err.println("Generating declarations");
 	new PrintDeclarations(p).walk(classes);
 	p.println();
@@ -100,6 +105,17 @@ class Main {
 	p.print(headerFile);
 	p.println("\"");
 	p.println();
+	p.println("JavaVM* ::jnixx::vm;");
+	p.println();
+	p.println("JNIEXPORT jint");
+	p.println("JNI_OnLoad(JavaVM* javaVM, void* reserved)");
+	while (p.dent(0, "{", "}")) {
+	    p.println("fprintf(stderr, \"vm loaded\\n\");");
+	    p.println("::jnixx::vm = javaVM;");
+	    p.println("return JNI_VERSION_1_2;");
+	}
+	p.println();
+	p.println("\f");
 	System.err.println("Generating definitions");
 	new PrintCxxDefinitions(p).walk(classes);
     }
diff --git a/frysk-sys/frysk/jnixx/PrintDeclarations.java b/frysk-sys/frysk/jnixx/PrintDeclarations.java
index 3861e6b..5a8401d 100644
--- a/frysk-sys/frysk/jnixx/PrintDeclarations.java
+++ b/frysk-sys/frysk/jnixx/PrintDeclarations.java
@@ -51,22 +51,59 @@ class PrintDeclarations extends ClassWalker {
 	this.p = p;
     }
 
+    private void printWrapperDeclaration(boolean isStatic, Class returnType,
+					 String name, Class[] params) {
+	if (isStatic) {
+	    p.print("static ");
+	}	
+	p.print("inline ");
+	p.printGlobalCxxName(returnType);
+	p.print(" ");
+	p.print(name);
+	p.print("(");
+	for (int i = 0; i < params.length; i++) {
+	    if (i > 0) {
+		p.print(", ");
+	    }
+	    p.printGlobalCxxName(params[i]);
+	}
+	p.println(");");
+    }
+    private void printWrapperDeclaration(Method method) {
+	printWrapperDeclaration(Modifier.isStatic(method.getModifiers()),
+				method.getReturnType(),
+				p.name(method),
+				method.getParameterTypes());
+    }
+    private void printWrapperDeclaration(Constructor constructor) {
+	printWrapperDeclaration(true,
+				constructor.getDeclaringClass(),
+				"New",
+				constructor.getParameterTypes());
+    }
+    private void printWrapperDeclaration(Field field, boolean get) {
+	boolean isStatic = Modifier.isStatic(field.getModifiers());
+	printWrapperDeclaration(isStatic,
+				get ? field.getType() : Void.TYPE,
+				p.name(field, get),
+				get ? new Class[0] : new Class[] { field.getType() });
+    }
+
     private void printCxxFieldAccessorDeclaration(Field field,
 						  boolean get) {
 	p.printlnModifiers(field);
+	printWrapperDeclaration(field, get);
 	if (Modifier.isStatic(field.getModifiers())) {
 	    p.print("static ");
 	}
 	p.print("inline ");
 	if (get) {
 	    p.printGlobalCxxName(field.getType());
-	    p.print(" Get");
 	} else {
-	    p.print("void Set");
+	    p.print("void");
 	}
-	String name = field.getName();
-	p.print(Character.toUpperCase(name.charAt(0)));
-	p.print(name.substring(1));
+	p.print(" ");
+	p.printName(field, get);
 	p.print("(::jnixx::env");
 	if (!get) {
 	    p.print(", ");
@@ -84,6 +121,7 @@ class PrintDeclarations extends ClassWalker {
 	    }
 	    public void acceptConstructor(Constructor constructor) {
 		p.printlnModifiers(constructor);
+		printWrapperDeclaration(constructor);
 		p.print("static inline ");
 		p.printGlobalCxxName(constructor.getDeclaringClass());
 		p.print(" New(");
@@ -102,6 +140,7 @@ class PrintDeclarations extends ClassWalker {
 	    }
 	    public void acceptMethod(Method method) {
 		p.printlnModifiers(method);
+		printWrapperDeclaration(method);
 		if (Modifier.isStatic(method.getModifiers())) {
 		    p.print("static ");
 		}
diff --git a/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java b/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java
index 2c07a7f..a95d7f4 100644
--- a/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java
+++ b/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java
@@ -51,7 +51,62 @@ class PrintHxxDefinitions extends ClassWalker {
 	this.p = p;
     }
 
+    private void printWrapperDefinition(Class klass, boolean isStatic,
+					Class returnType,
+					String name, Class[] params) {
+	p.printGlobalCxxName(returnType);
+	p.println();
+	p.printQualifiedCxxName(klass);
+	p.print("::");
+	p.print(name);
+	p.print("(");
+	for (int i = 0; i < params.length; i++) {
+	    if (i > 0) {
+		p.print(", ");
+	    }
+	    p.printGlobalCxxName(params[i]);
+	    p.print(" p" + i);
+	}
+	p.print(")");
+	while (p.dent(0, "{", "}")) {
+	    p.println("void* _jni;");
+	    p.println("::jnixx::vm->GetEnv(&_jni, JNI_VERSION_1_2);");
+	    p.println("::jnixx::env _env = ::jnixx::env((JNIEnv*)_jni);");
+	    if (returnType != Void.TYPE) {
+		p.print("return ");
+	    }
+	    p.print(name);
+	    p.print("(_env");
+	    for (int i = 0; i < params.length; i++) {
+		p.print(",  p" + i);
+	    }
+	    p.println(");");
+	}
+    }
+    private void printWrapperDefinition(Method method) {
+	printWrapperDefinition(method.getDeclaringClass(),
+			       Modifier.isStatic(method.getModifiers()),
+			       method.getReturnType(),
+			       p.name(method),
+			       method.getParameterTypes());
+    }
+    private void printWrapperDefinition(Constructor constructor) {
+	printWrapperDefinition(constructor.getDeclaringClass(),
+			       true,
+			       constructor.getDeclaringClass(),
+			       "New",
+			       constructor.getParameterTypes());
+    }
+    private void printWrapperDefinition(Field field, boolean get) {
+	printWrapperDefinition(field.getDeclaringClass(),
+			       Modifier.isStatic(field.getModifiers()),
+			       get ? field.getType() : Void.TYPE,
+			       p.name(field, get),
+			       get ? new Class[0] : new Class[] { field.getType() });
+    }
+
     private void printCxxFieldAccessorDefinition(Field field, boolean get) {
+	printWrapperDefinition(field, get);
 	boolean isStatic = Modifier.isStatic(field.getModifiers());
 	Class type = field.getType();
 	p.println();
@@ -63,14 +118,7 @@ class PrintHxxDefinitions extends ClassWalker {
 	}
 	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.printName(field, get);
 	p.print("(::jnixx::env _env");
 	if (!get) {
 	    p.print(", ");
@@ -89,7 +137,7 @@ class PrintHxxDefinitions extends ClassWalker {
 		    p.print("Static");
 		}
 		p.print("FieldID(_class_(_env), \"");
-		p.print(name);
+		p.print(field.getName());
 		p.print("\", \"");
 		p.printJniSignature(type);
 		p.print("\"");
@@ -124,6 +172,7 @@ class PrintHxxDefinitions extends ClassWalker {
     }
 
     private void printCxxMethodDefinition(Method method) {
+	printWrapperDefinition(method);
 	boolean isStatic = Modifier.isStatic(method.getModifiers());
 	Class returnType = method.getReturnType();
 	p.println();
@@ -185,6 +234,7 @@ class PrintHxxDefinitions extends ClassWalker {
 	    }
 	    void acceptConstructor(Constructor constructor) {
 		p.println();
+		printWrapperDefinition(constructor);
 		p.printGlobalCxxName(constructor.getDeclaringClass());
 		p.println();
 		p.printQualifiedCxxName(constructor);
diff --git a/frysk-sys/frysk/jnixx/Printer.java b/frysk-sys/frysk/jnixx/Printer.java
index e5df665..158a327 100644
--- a/frysk-sys/frysk/jnixx/Printer.java
+++ b/frysk-sys/frysk/jnixx/Printer.java
@@ -40,6 +40,7 @@
 package frysk.jnixx;
 
 import java.lang.reflect.Member;
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Modifier;
@@ -228,7 +229,7 @@ class Printer {
      * Print the method's fully qualified C++ name; that is "."
      * replaced by "::".
      */
-    void printQualifiedCxxName(Member member) {
+    void printQualifiedCxxName(Method member) {
 	printQualifiedCxxName(member.getDeclaringClass());
 	print("::");
 	printName(member);
@@ -237,7 +238,7 @@ class Printer {
      * Print the method's fully qualified C++ name; that is "."
      * replaced by "::".
      */
-    void printGlobalCxxName(Member member) {
+    void printGlobalCxxName(Method member) {
 	printGlobalCxxName(member.getDeclaringClass());
 	print("::");
 	printName(member);
@@ -289,21 +290,46 @@ class Printer {
     }
 
     /**
-     * Print tne name (possibly with a few extra chars thrown in).
+     * Print the name (possibly with a few extra chars thrown in).
      */
-    void printName(Member member) {
-	print(member.getName());
-	if (member.getName().equals("delete")
-	    || member.getName().equals("and")
-	    || member.getName().equals("or")
-	    || member.getName().equals("xor")
-	    || member.getName().equals("not")
+    void printName(Method method) {
+	print(name(method));
+    }
+    /**
+     * Print the name (possibly with a few extra chars thrown in).
+     */
+    void printName(Field field, boolean get) {
+	print(name(field, get));
+    }
+
+    /**
+     * Return the name (possibly with a few extra chars thrown in).
+     */
+    String name(Method method) {
+	String name = method.getName();
+	if (name.equals("delete")
+	    || name.equals("and")
+	    || name.equals("or")
+	    || name.equals("xor")
+	    || name.equals("not")
 	    ) {
-	    print("$");
+	    return name + "$";
+	} else {
+	    return name;
 	}
     }
 
     /**
+     * Return the name (possibly with a few extra chars thrown in).
+     */
+    String name(Field field, boolean get) {
+	String name = field.getName();
+	return (get ? "Get" : "Set")
+	    + Character.toUpperCase(name.charAt(0))
+	    + name.substring(1);
+    }
+
+    /**
      * Return the JNI signature for the klass.
      */
     private String jniSignature(Class klass) {
@@ -463,8 +489,7 @@ class Printer {
     /**
      * Print the list actual parameters for FUNC.
      */
-    private Printer printActualCxxParameters(Member func,
-					     Class[] params) {
+    void printActualCxxParameters(Class[] params) {
 	print("_env");
 	for (int i = 0; i < params.length; i++) {
 	    Class param = params[i];
@@ -482,19 +507,18 @@ class Printer {
 		print("(p" + i + ")");
 	    }
 	}
-	return this;
     }
     /**
      * Print the METHOD's list of actual parameters.
      */
-    Printer printActualCxxParameters(Method f) {
-	return printActualCxxParameters(f, f.getParameterTypes());
+    void printActualCxxParameters(Method f) {
+	printActualCxxParameters(f.getParameterTypes());
     }
     /**
      * Print the CONSTRUCOR's list of actual parameters.
      */
-    Printer printActualCxxParameters(Constructor f) {
-	return printActualCxxParameters(f, f.getParameterTypes());
+    void printActualCxxParameters(Constructor f) {
+	printActualCxxParameters(f.getParameterTypes());
     }
 
     /**
diff --git a/frysk-sys/frysk/testbed/ChangeLog b/frysk-sys/frysk/testbed/ChangeLog
index 64ac04f..f177959 100644
--- a/frysk-sys/frysk/testbed/ChangeLog
+++ b/frysk-sys/frysk/testbed/ChangeLog
@@ -1,3 +1,7 @@
+2008-05-11  Andrew Cagney  <cagney@redhat.com>
+
+	* jni/LocalMemory.cxx (codeAddr): New; use instead of JNI method.
+
 2008-05-09  Andrew Cagney  <cagney@redhat.com>
 
 	* jni/LocalMemory.cxx (LocalMemory::getCodeFile): Use String's JNI
diff --git a/frysk-sys/frysk/testbed/jni/LocalMemory.cxx b/frysk-sys/frysk/testbed/jni/LocalMemory.cxx
index a7283ab..0914cad 100644
--- a/frysk-sys/frysk/testbed/jni/LocalMemory.cxx
+++ b/frysk-sys/frysk/testbed/jni/LocalMemory.cxx
@@ -76,7 +76,12 @@ frysk::testbed::LocalMemory::getDataBytes(::jnixx::env env) {
  * Function used by getCode*(), must be on a single line for __LINE__
  * to work correctly.
  */
-jint frysk::testbed::LocalMemory::getCodeLine (::jnixx::env) { return __LINE__; }
+static jint codeLine() { return __LINE__; }
+
+jint
+frysk::testbed::LocalMemory::getCodeLine(::jnixx::env) {
+  return codeLine();
+}
 
 String
 frysk::testbed::LocalMemory::getCodeFile(::jnixx::env env) {
@@ -86,9 +91,9 @@ frysk::testbed::LocalMemory::getCodeFile(::jnixx::env env) {
 static void*
 codeAddr() {
 #ifdef __powerpc64__
-  return *((void**) frysk::testbed::LocalMemory::getCodeLine);
+  return *((void**) codeLine);
 #else
-  return (void*)&frysk::testbed::LocalMemory::getCodeLine;
+  return (void*)&codeLine;
 #endif
 }
 jlong


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


                 reply	other threads:[~2008-05-12 13:32 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=20080512133233.23361.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).