public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Make JNIEnv optional.
@ 2008-05-12 13:32 cagney
  0 siblings, 0 replies; only message in thread
From: cagney @ 2008-05-12 13:32 UTC (permalink / raw)
  To: frysk-cvs

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


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

only message in thread, other threads:[~2008-05-12 13:32 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-12 13:32 [SCM] master: Make JNIEnv optional 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).