public inbox for frysk-cvs@sourceware.org help / color / mirror / Atom feed
From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Generate and use byteArray et.al. set-region methods. Date: Mon, 12 May 2008 21:27:00 -0000 [thread overview] Message-ID: <20080512212752.14777.qmail@sourceware.org> (raw) The branch, master has been updated via 469c9c97c59f507101aad8250ab9332ce054d50c (commit) from b2ba3c8a7b2e3a94e6f2b6a08119452610185528 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 469c9c97c59f507101aad8250ab9332ce054d50c Author: Andrew Cagney <cagney@redhat.com> Date: Mon May 12 17:26:47 2008 -0400 Generate and use byteArray et.al. set-region methods. frysk-sys/frysk/jnixx/ChangeLog 2008-05-12 Andrew Cagney <cagney@redhat.com> * JniBindings.java: Generate primitive array methods. * PrintCxxDefinitions.java: Generate primitive array types. * PrintDeclarations.java: Ditto. * PrintHxxDefinitions.java: Ditto. * PrintNamespaces.java: Ditto. * Printer.java: Ditto. frysk-sys/frysk/testbed/ChangeLog 2008-05-12 Andrew Cagney <cagney@redhat.com> * jni/LocalMemory.cxx (LocalMemory::getDataBytes): Use jnixx::byteArray. ----------------------------------------------------------------------- Summary of changes: frysk-sys/frysk/jnixx/ChangeLog | 7 +++ frysk-sys/frysk/jnixx/JniBindings.java | 70 ++++++++++++++++++++++++ frysk-sys/frysk/jnixx/PrintCxxDefinitions.java | 9 ++- frysk-sys/frysk/jnixx/PrintDeclarations.java | 70 +++++++++++++++--------- frysk-sys/frysk/jnixx/PrintHxxDefinitions.java | 4 ++ frysk-sys/frysk/jnixx/PrintNamespaces.java | 25 ++++++--- frysk-sys/frysk/jnixx/Printer.java | 17 ++----- frysk-sys/frysk/testbed/ChangeLog | 5 ++ frysk-sys/frysk/testbed/jni/LocalMemory.cxx | 14 ++--- 9 files changed, 163 insertions(+), 58 deletions(-) First 500 lines of diff: diff --git a/frysk-sys/frysk/jnixx/ChangeLog b/frysk-sys/frysk/jnixx/ChangeLog index aa7319e..60f9c78 100644 --- a/frysk-sys/frysk/jnixx/ChangeLog +++ b/frysk-sys/frysk/jnixx/ChangeLog @@ -1,5 +1,12 @@ 2008-05-12 Andrew Cagney <cagney@redhat.com> + * JniBindings.java: Generate primitive array methods. + * PrintCxxDefinitions.java: Generate primitive array types. + * PrintDeclarations.java: Ditto. + * PrintHxxDefinitions.java: Ditto. + * PrintNamespaces.java: Ditto. + * Printer.java: Ditto. + * Main.java (getJarClasses(String)): New. (getNativeClasses(HashSet)): New. (getReferences(HashSet)): New. diff --git a/frysk-sys/frysk/jnixx/JniBindings.java b/frysk-sys/frysk/jnixx/JniBindings.java index 93c3292..53804d0 100644 --- a/frysk-sys/frysk/jnixx/JniBindings.java +++ b/frysk-sys/frysk/jnixx/JniBindings.java @@ -267,6 +267,76 @@ class JniBindings { // GetStringCritical // Release StringCritical ; + + static { + Class[] types = { + boolean[].class, + byte[].class, + short[].class, + char[].class, + int[].class, + long[].class, + float[].class, + double[].class, + }; + for (int i = 0; i < types.length; i++) { + String type = types[i].getComponentType().getName(); + String Type = (Character.toUpperCase(type.charAt(0)) + + type.substring(1)); + bindings + .put(types[i], true, + "::jnixx::" + type + "Array", "New", + new String[] { + "::jnixx::env", "env", + "jsize", "length", + }, + new Object[] { + "return " + type + "Array(env.New" + Type + "Array(length));", + }) + .put(types[i], false, + "const j" + type + "*", "GetElements", + new String[] { + "::jnixx::env", "env", + "jboolean*", "isCopy", + }, + new Object[] { + "return env.Get" + Type + "ArrayElements((j" + type + "Array) _object, isCopy);" + }) + .put(types[i], false, + null, "ReleaseElements", + new String[] { + "::jnixx::env", "env", + "j" + type + "*", "elements", + "jint", "mode" + }, + new Object[] { + "env.Release" + Type + "ArrayElements((j" + type + "Array)_object, elements, mode);", + }) + .put(types[i], false, + "void", "GetRegion", + new String[] { + "::jnixx::env", "env", + "jsize", "start", + "jsize", "length", + "j" + type + "*", "buf", + }, + new Object[] { + "env.Get" + Type + "ArrayRegion((j" + type + "Array) _object, start, length, buf);" + }) + .put(types[i], false, + "void", "SetRegion", + new String[] { + "::jnixx::env", "env", + "jsize", "start", + "jsize", "length", + "j" + type + "*", "buf", + }, + new Object[] { + "env.Set" + Type + "ArrayRegion((j" + type + "Array) _object, start, length, buf);" + }) + ; + } + } static void printDeclarations(Printer p, Class klass) { bindings.printDeclarations(klass, p); diff --git a/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java b/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java index 5c02706..caef0bc 100644 --- a/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java +++ b/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java @@ -100,11 +100,14 @@ class PrintCxxDefinitions extends ClassWalker { } else if (returnType == String.class) { p.print("(jstring) ret._object"); } else if (returnType.isArray()) { - if (returnType.getComponentType().isPrimitive()) { - p.print("ret"); + Class component = returnType.getComponentType(); + p.print("(j"); + if (component.isPrimitive()) { + p.print(component.getName()); } else { - p.print("(jobjectArray) ret._object"); + p.print("object"); } + p.print("Array) ret._object"); } else { p.print("ret._object"); } diff --git a/frysk-sys/frysk/jnixx/PrintDeclarations.java b/frysk-sys/frysk/jnixx/PrintDeclarations.java index f5baa5d..c028391 100644 --- a/frysk-sys/frysk/jnixx/PrintDeclarations.java +++ b/frysk-sys/frysk/jnixx/PrintDeclarations.java @@ -154,6 +154,36 @@ class PrintDeclarations extends ClassWalker { } }; + private void printClassTemplate(Class klass, Class parent) { + if (parent == null) { + // A root object. + p.println("public: jobject _object;"); + p.print("protected: "); + p.printUnqualifiedCxxName(klass); + p.print("(jobject _object)"); + while (p.dent(1, "{", "}")) { + p.println("this->_object = _object;"); + } + } else { + // Constructor. + p.print("protected: "); + p.printUnqualifiedCxxName(klass); + p.print("(jobject _object) : "); + p.printGlobalCxxName(parent); + p.println("(_object) { }"); + } + // Explicit cast operator. + p.print("public: static "); + p.printUnqualifiedCxxName(klass); + p.print(" Cast(jobject object) { return "); + p.printUnqualifiedCxxName(klass); + p.println("(object); }"); + // Static get-class method - a class knows its own class. + p.println("private: static jclass _class;"); + p.println("public: static inline jclass _class_(::jnixx::env _env);"); + JniBindings.printDeclarations(p, klass); + } + private void printClass(Class klass, Class parent) { p.println(); p.print("// "); @@ -165,39 +195,25 @@ class PrintDeclarations extends ClassWalker { p.printGlobalCxxName(parent); } while(p.dent(0, "{", "};")) { - if (parent == null) { - // A root object. - p.println("public: jobject _object;"); - p.print("protected: "); - p.printUnqualifiedCxxName(klass); - p.print("(jobject _object)"); - while (p.dent(1, "{", "}")) { - p.println("this->_object = _object;"); - } - } else { - // Constructor. - p.print("protected: "); - p.printUnqualifiedCxxName(klass); - p.print("(jobject _object) : "); - p.printGlobalCxxName(parent); - p.println("(_object) { }"); - } - // Explicit cast operator. - p.print("public: static "); - p.printUnqualifiedCxxName(klass); - p.print(" Cast(jobject object) { return "); - p.printUnqualifiedCxxName(klass); - p.println("(object); }"); - // Static get-class method - a class knows its own class. - p.println("private: static jclass _class;"); - p.println("public: static inline jclass _class_(::jnixx::env _env);"); - JniBindings.printDeclarations(p, klass); + printClassTemplate(klass, parent); printer.visit(klass); } JniBindings.printGlobals(p, klass); } void acceptArray(Class klass) { + Class component = klass.getComponentType(); + if (component.isPrimitive()) { + p.println(); + p.print("// "); + p.println(klass); + p.print("class "); + p.printQualifiedCxxName(klass); + p.print(" : public ::java::lang::Object"); + while (p.dent(1, "{", "};")) { + printClassTemplate(klass, Object.class); + } + } } void acceptPrimitive(Class klass) { } diff --git a/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java b/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java index a255ece..7655cfd 100644 --- a/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java +++ b/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java @@ -277,6 +277,10 @@ class PrintHxxDefinitions extends ClassWalker { }; void acceptArray(Class klass) { + Class component = klass.getComponentType(); + if (component.isPrimitive()) { + JniBindings.printDefinitions(p, klass); + } } void acceptPrimitive(Class klass) { } diff --git a/frysk-sys/frysk/jnixx/PrintNamespaces.java b/frysk-sys/frysk/jnixx/PrintNamespaces.java index 70236cd..bb66178 100644 --- a/frysk-sys/frysk/jnixx/PrintNamespaces.java +++ b/frysk-sys/frysk/jnixx/PrintNamespaces.java @@ -46,18 +46,14 @@ class PrintNamespaces extends ClassWalker { this.p = p; } - /** - * Print the namespace spec for the klass. - */ - private void printCxxNamespace(Class klass) { - String[] names = klass.getName().split("\\."); + private void printNamespace(String[] names) { for (int i = 0; i < names.length - 1; i++) { p.print("namespace "); p.print(names[i]); p.println(" { "); p.indent(); } - p.print("struct "); + p.print("class "); p.print(names[names.length - 1]); p.println(";"); for (int i = names.length - 2; i >= 0; i--) { @@ -66,10 +62,25 @@ class PrintNamespaces extends ClassWalker { } } + /** + * Print the namespace spec for the klass. + */ + private void printNamespace(Class klass) { + String[] names = klass.getName().split("\\."); + printNamespace(names); + } + void acceptArray(Class klass) { p.println(); p.print("// "); p.println(klass); + Class component = klass.getComponentType(); + if (component.isPrimitive()) { + printNamespace(new String[] { + "jnixx", + component.getName() + "Array", + }); + } } void acceptPrimitive(Class klass) { p.println(); @@ -80,7 +91,7 @@ class PrintNamespaces extends ClassWalker { p.println(); p.print("// "); p.println(klass); - printCxxNamespace(klass); + printNamespace(klass); } void acceptInterface(Class klass) { acceptClass(klass); diff --git a/frysk-sys/frysk/jnixx/Printer.java b/frysk-sys/frysk/jnixx/Printer.java index 158a327..8bd673e 100644 --- a/frysk-sys/frysk/jnixx/Printer.java +++ b/frysk-sys/frysk/jnixx/Printer.java @@ -173,7 +173,10 @@ class Printer { } else if (klass.isArray()) { Class componentType = klass.getComponentType(); if (componentType.isPrimitive()) { - print("j"); + if (global) { + print("::"); + } + print("jnixx::"); print(componentType.getName()); print("Array"); } else { @@ -498,9 +501,6 @@ class Printer { print("p" + i); } else if (param == Class.class) { print("p" + i); - } else if (param.isArray() - && param.getComponentType().isPrimitive()) { - print("p" + i); } else { printGlobalCxxName(param); print("::Cast"); @@ -566,9 +566,6 @@ class Printer { print(", "); if (param.isPrimitive()) { print("p" + i); - } else if (param.isArray() - && param.getComponentType().isPrimitive()) { - print("p" + i); } else { print("p" + i + "._object"); } @@ -610,12 +607,6 @@ class Printer { print("return "); if (returnType.isPrimitive()) { print(variable); - } else if (returnType.isArray() - && returnType.getComponentType().isPrimitive()) { - print("("); - printGlobalCxxName(returnType); - print(")"); - print(variable); } else { printGlobalCxxName(returnType); print("::Cast"); diff --git a/frysk-sys/frysk/testbed/ChangeLog b/frysk-sys/frysk/testbed/ChangeLog index f177959..e87ef84 100644 --- a/frysk-sys/frysk/testbed/ChangeLog +++ b/frysk-sys/frysk/testbed/ChangeLog @@ -1,3 +1,8 @@ +2008-05-12 Andrew Cagney <cagney@redhat.com> + + * jni/LocalMemory.cxx (LocalMemory::getDataBytes): Use + jnixx::byteArray. + 2008-05-11 Andrew Cagney <cagney@redhat.com> * jni/LocalMemory.cxx (codeAddr): New; use instead of JNI method. diff --git a/frysk-sys/frysk/testbed/jni/LocalMemory.cxx b/frysk-sys/frysk/testbed/jni/LocalMemory.cxx index 0914cad..fbf7713 100644 --- a/frysk-sys/frysk/testbed/jni/LocalMemory.cxx +++ b/frysk-sys/frysk/testbed/jni/LocalMemory.cxx @@ -46,12 +46,10 @@ using namespace java::lang; -static jbyteArray +static ::jnixx::byteArray getBytes(::jnixx::env env, void *addr, size_t length) { - jbyteArray bytes = env.NewByteArray(length); - jbyte* elements = env.GetByteArrayElements(bytes, NULL); - memcpy(elements, addr, length); - env.ReleaseByteArrayElements(bytes, elements, 0); + ::jnixx::byteArray bytes = ::jnixx::byteArray::New(env, length); + bytes.SetRegion(env, 0, length, (jbyte*) addr); return bytes; } @@ -67,7 +65,7 @@ frysk::testbed::LocalMemory::getDataAddr(::jnixx::env) { return (jlong) &memory; } -jbyteArray +::jnixx::byteArray frysk::testbed::LocalMemory::getDataBytes(::jnixx::env env) { return getBytes(env, &memory, sizeof(memory)); } @@ -101,7 +99,7 @@ frysk::testbed::LocalMemory::getCodeAddr(::jnixx::env) { return (jlong)codeAddr(); } -jbyteArray +::jnixx::byteArray frysk::testbed::LocalMemory::getCodeBytes(::jnixx::env env) { return getBytes(env, codeAddr(), sizeof(memory)); } @@ -112,6 +110,6 @@ frysk::testbed::LocalMemory::constructStack(::jnixx::env env, // Copy known data onto the stack. uint8_t addr[sizeof(memory)]; memcpy(addr, &memory, sizeof(memory)); - jbyteArray bytes = getBytes(env, addr, sizeof(memory)); + ::jnixx::byteArray bytes = getBytes(env, addr, sizeof(memory)); builder.stack(env, (jlong)addr, bytes); } hooks/post-receive -- frysk system monitor/debugger
reply other threads:[~2008-05-12 21:27 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=20080512212752.14777.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).