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