From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23426 invoked by alias); 12 May 2008 13:32:37 -0000 Received: (qmail 23377 invoked by uid 367); 12 May 2008 13:32:33 -0000 Date: Mon, 12 May 2008 13:32:00 -0000 Message-ID: <20080512133233.23361.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Make JNIEnv optional. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: d76e0603fee48fc72eca9b45c3ccb6fc781cbffa X-Git-Newrev: 06bb0d0b805004728277909ab93836e669b8c6cc Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q2/txt/msg00222.txt.bz2 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 Date: Sun May 11 23:06:38 2008 -0400 Make JNIEnv optional. frysk-sys/frysk/jnixx/ChangeLog 2008-05-11 Andrew Cagney * 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 * 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 + + * 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 * 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 + + * jni/LocalMemory.cxx (codeAddr): New; use instead of JNI method. + 2008-05-09 Andrew Cagney * 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