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