From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14819 invoked by alias); 12 May 2008 21:27:52 -0000 Received: (qmail 14792 invoked by uid 367); 12 May 2008 21:27:52 -0000 Date: Mon, 12 May 2008 21:27:00 -0000 Message-ID: <20080512212752.14777.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Generate and use byteArray et.al. set-region methods. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: b2ba3c8a7b2e3a94e6f2b6a08119452610185528 X-Git-Newrev: 469c9c97c59f507101aad8250ab9332ce054d50c 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/msg00229.txt.bz2 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 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 * 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 * 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 + * 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 + + * jni/LocalMemory.cxx (LocalMemory::getDataBytes): Use + jnixx::byteArray. + 2008-05-11 Andrew Cagney * 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