The branch, master has been updated via 55a736e530e74fc66b2132f73d6d10d5f922f84c (commit) from f53b6954ed9a4ef84305a5413c35f8f85cd7682d (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 55a736e530e74fc66b2132f73d6d10d5f922f84c Author: Andrew Cagney <cagney@redhat.com> Date: Mon May 12 12:53:45 2008 -0400 Make object arrays extend Object. frysk-sys/frysk/jnixx/ChangeLog 2008-05-12 Andrew Cagney <cagney@redhat.com> Have object array extend ::java::lang::Object. * JniBindings.java (printGlobals(Printer,Class)): New. Generate the array template. * PrintDeclarations.java: Call printGlobals for each class. Make java's root object the jnixx root. * jnixx.hxx (jnixx::object): Delete. (jnixx::array): Delete. * chars.cxx (jnixx::array): Update. * PrintHxxDefinitions.java: Update. ----------------------------------------------------------------------- Summary of changes: frysk-sys/frysk/jnixx/ChangeLog | 12 ++ frysk-sys/frysk/jnixx/JniBindings.java | 175 ++++++++++++++++++------ frysk-sys/frysk/jnixx/PrintDeclarations.java | 53 +++++--- frysk-sys/frysk/jnixx/PrintHxxDefinitions.java | 5 +- frysk-sys/frysk/jnixx/chars.cxx | 10 +- frysk-sys/frysk/jnixx/jnixx.hxx | 48 ------- 6 files changed, 185 insertions(+), 118 deletions(-) First 500 lines of diff: diff --git a/frysk-sys/frysk/jnixx/ChangeLog b/frysk-sys/frysk/jnixx/ChangeLog index 5c4ea73..7acd570 100644 --- a/frysk-sys/frysk/jnixx/ChangeLog +++ b/frysk-sys/frysk/jnixx/ChangeLog @@ -1,3 +1,15 @@ +2008-05-12 Andrew Cagney <cagney@redhat.com> + + Have object array extend ::java::lang::Object. + * JniBindings.java (printGlobals(Printer,Class)): New. Generate + the array template. + * PrintDeclarations.java: Call printGlobals for each class. Make + java's root object the jnixx root. + * jnixx.hxx (jnixx::object): Delete. + (jnixx::array): Delete. + * chars.cxx (jnixx::array): Update. + * PrintHxxDefinitions.java: Update. + 2008-05-11 Andrew Cagney <cagney@redhat.com> * Main.java: Set the VM during load. diff --git a/frysk-sys/frysk/jnixx/JniBindings.java b/frysk-sys/frysk/jnixx/JniBindings.java index 8c1ae57..93c3292 100644 --- a/frysk-sys/frysk/jnixx/JniBindings.java +++ b/frysk-sys/frysk/jnixx/JniBindings.java @@ -47,6 +47,27 @@ import java.util.LinkedList; * Given a class, print any JNI bindings. */ class JniBindings { + static private void printCodes(Printer p, int level, Object[] codes) { + boolean nl = false; + for (int i = 0; i < codes.length; i++) { + if (codes[i] instanceof String) { + if (nl) { + p.println(); + } + p.print(codes[i]); + nl = true; + } else { + while (p.dent(level, "{", "}")) { + printCodes(p, level + 1, (Object[]) codes[i]); + } + nl = false; + } + } + if (nl) { + p.println(); + } + } + private static class Method { private final Class klass; private final boolean isStatic; @@ -81,27 +102,15 @@ class JniBindings { } p.print(" "); p.print(name); - p.print("(::jnixx::env"); + p.print("("); for (int i = 0; i < params.length; i += 2) { - p.print(", "); + if (i > 0) { + p.print(", "); + } p.print(params[i]); } p.println(");"); } - private void printCodes(Printer p, int level, Object[] codes) { - while (p.dent(level, "{", "}")) { - if (level == 0) { - p.println("JNIEnv *_jni = env._jni;"); - } - for (int i = 0; i < codes.length; i++) { - if (codes[i] instanceof String) { - p.println(codes[i]); - } else { - printCodes(p, level+1, (Object[]) codes[i]); - } - } - } - } void printDefinition(Printer p) { p.println(); if (returnType == null) { @@ -112,15 +121,19 @@ class JniBindings { p.printQualifiedCxxName(klass); p.print("::"); p.print(name); - p.print("(::jnixx::env env"); + p.print("("); for (int i = 0; i < params.length; i += 2) { - p.print(", "); + if (i > 0) { + p.print(", "); + } p.print(params[i]); p.print(" "); p.print(params[i + 1]); } p.print(")"); - printCodes(p, 0, code); + while (p.dent(0, "{", "}")) { + printCodes(p, 1, code); + } } } @@ -154,16 +167,49 @@ class JniBindings { } private static JniMap bindings = new JniMap() + /** + * java.lang.Object + */ + .put(Object.class, true, + "::jnixx::env", "_env_", + new String[] { + }, + new Object[] { + "void* _jni;", + "::jnixx::vm->GetEnv(&_jni, JNI_VERSION_1_2);", + "return ::jnixx::env((JNIEnv*)_jni);", + }) + .put(Object.class, false, + "bool", "operator==", + new String[] { + "jobject", "_object", + }, + new Object[] { + "return this->_object == _object;", + }) + // DeleteLocalRef + .put(Object.class, false, + null, "DeleteLocalRef", + new String[] { + "::jnixx::env", "env", + }, + new Object[] { + "env.DeleteLocalRef(_object);", + "_object = NULL;" + }) + + /** + * java.lang.String + */ // NewString // GetStringLength .put(String.class, false, "jsize", "GetStringLength", new String[] { + "::jnixx::env", "env", }, new Object[] { - "jsize len = _jni->GetStringLength((jstring)_object);", - "// No exceptions", - "return len;", + "return env.GetStringLength((jstring)_object);", }) // GetStringChars // ReleaseStringChars @@ -171,61 +217,52 @@ class JniBindings { .put(String.class, true, "::java::lang::String", "NewStringUTF", new String[] { + "::jnixx::env", "env", "const char*", "utf", }, new Object[] { - "jstring string = _jni->NewStringUTF(utf);", - "if (string == NULL)", new Object[] { - "throw jnixx::exception();", - }, - "return String(string);", + "return String(env.NewStringUTF(utf));", }) // GetStringUTFLength .put(String.class, false, "jsize", "GetStringUTFLength", new String[] { + "::jnixx::env", "env", }, new Object[] { - "jsize len = _jni->GetStringUTFLength((jstring) _object);", - "// No exceptions", - "return len;", + "return env.GetStringUTFLength((jstring) _object);", }) // GetStringUTFChars .put(String.class, false, "const char*", "GetStringUTFChars", new String[] { + "::jnixx::env", "env", }, new Object[] { - "const char* utf = _jni->GetStringUTFChars((jstring)_object, NULL);", - "if (utf == NULL)", new Object[] { - "throw jnixx::exception();", - }, - "return utf;", + "return env.GetStringUTFChars((jstring)_object, NULL);", }) // ReleaseStringUTFChars .put(String.class, false, null, "ReleaseStringUTFChars", new String[] { + "::jnixx::env", "env", "const char *", "utf", }, new Object[] { - "_jni->ReleaseStringUTFChars((jstring)_object, utf);", - "// No exceptions", + "env.ReleaseStringUTFChars((jstring)_object, utf);", }) // GetStringRegion // GetStringUTFRegion .put(String.class, false, null, "GetStringUTFRegion", new String[] { + "::jnixx::env", "env", "jsize", "start", "jsize", "len", "char*", "buf", }, new Object[] { - "_jni->GetStringUTFRegion((jstring)_object, start, len, buf);", - "if (_jni->ExceptionCheck())", new Object[] { - "throw jnixx::exception();", - }, + "env.GetStringUTFRegion((jstring)_object, start, len, buf);", }) // GetStringCritical // Release StringCritical @@ -237,4 +274,60 @@ class JniBindings { static void printDefinitions(Printer p, Class klass) { bindings.printDefinitions(klass, p); } + + + private static void printObjectGlobals(Printer p) { + p.println(new Object[] { + "", + "/**", + " * The JNIXX array; all object-array uses this as their template.", + " */", + }); + while (p.dent(0, "namespace jnixx {", "}")) { + while (p.dent(1, "template <typename component> class array : public ::java::lang::Object {", "};")) { + printCodes(p, 2, new Object[] { + "protected:", + "array(jobject _object) : ::java::lang::Object(_object)", new Object[] { + }, + "public:", + "static array<component> Cast(jobject object)", new Object[] { + "return array<component>(object);", + }, + "jsize GetLength(::jnixx::env env)", new Object[] { + "return env.GetArrayLength((jarray)_object);", + }, + "static array<component> New(::jnixx::env env, jsize length)", new Object[] { + "return env.NewObjectArray(length, component::_class_(env), NULL);", + }, + "static array<component> New(::jnixx::env env, jsize length, component init)", new Object[] { + "return env.NewObjectArray(length, component::_class_(env), init._object);", + }, + "component GetElement(::jnixx::env env, jsize index)", new Object[] { + "return component::Cast(env.GetObjectArrayElement((jobjectArray)_object, index));", + }, + "void SetElement(::jnixx::env env, jsize index, component object)", new Object[] { + "env.SetObjectArrayElement((jobjectArray)_object, index, object._object);", + }, + "static array<component> New(jsize length)", new Object[] { + "return New(_env_(), length);", + }, + "static array<component> New(jsize length, component init)", new Object[] { + "return New(_env_(), length, init);", + }, + "component GetElement(jsize index)", new Object[] { + "return GetElement(_env_(), index);" + }, + "void SetElement(jsize index, component object)", new Object[] { + "SetElement(_env_(), index, object);" + }, + }); + } + } + } + + static void printGlobals(Printer p, Class klass) { + if (klass == Object.class) { + printObjectGlobals(p); + } + } } diff --git a/frysk-sys/frysk/jnixx/PrintDeclarations.java b/frysk-sys/frysk/jnixx/PrintDeclarations.java index 5a8401d..abc1353 100644 --- a/frysk-sys/frysk/jnixx/PrintDeclarations.java +++ b/frysk-sys/frysk/jnixx/PrintDeclarations.java @@ -156,38 +156,34 @@ class PrintDeclarations extends ClassWalker { } }; - void acceptArray(Class klass) { - } - void acceptPrimitive(Class klass) { - } - void acceptInterface(Class klass) { - acceptClass(klass); - } - void acceptClass(Class klass) { + private void printClass(Class klass, Class parent) { p.println(); p.print("// "); p.println(klass); p.print("class "); p.printQualifiedCxxName(klass); - Class parent = klass.getSuperclass(); - p.print(" : public "); - if (parent == null) { - p.print("::jnixx::object"); - } else { + if (parent != null) { + p.print(" : public "); p.printGlobalCxxName(parent); } while(p.dent(0, "{", "};")) { - // Constructor. - p.print("protected: "); - p.printUnqualifiedCxxName(klass); - p.print("(jobject _object)"); - p.print(" : "); if (parent == null) { - p.print("::jnixx::object"); + // 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) { }"); } - p.println("(_object) {}"); // Explicit cast operator. p.print("public: static "); p.printUnqualifiedCxxName(klass); @@ -200,5 +196,22 @@ class PrintDeclarations extends ClassWalker { JniBindings.printDeclarations(p, klass); printer.visit(klass); } + JniBindings.printGlobals(p, klass); + } + + void acceptArray(Class klass) { + } + void acceptPrimitive(Class klass) { + } + void acceptInterface(Class klass) { + Class parent = klass.getSuperclass(); + if (parent == null) { + printClass(klass, Object.class); + } else { + printClass(klass, parent); + } + } + void acceptClass(Class klass) { + printClass(klass, klass.getSuperclass()); } } diff --git a/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java b/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java index a95d7f4..6268e7f 100644 --- a/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java +++ b/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java @@ -69,14 +69,11 @@ class PrintHxxDefinitions extends ClassWalker { } 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"); + p.print("(_env_()"); for (int i = 0; i < params.length; i++) { p.print(", p" + i); } diff --git a/frysk-sys/frysk/jnixx/chars.cxx b/frysk-sys/frysk/jnixx/chars.cxx index 11d2cb9..a59107d 100644 --- a/frysk-sys/frysk/jnixx/chars.cxx +++ b/frysk-sys/frysk/jnixx/chars.cxx @@ -46,13 +46,13 @@ using namespace java::lang; char** strings2chars(jnixx::env env, ::jnixx::array<String> strings) { - jsize arrayLength = strings.GetArrayLength(env); + jsize arrayLength = strings.GetLength(env); // compute the allocated size. size_t size = 0; size += sizeof(void*); // NULL for (int i = 0; i < arrayLength; i++) { size += sizeof(void*); // pointer - String string = strings.GetObjectArrayElement(env, i); + String string = strings.GetElement(env, i); size += string.GetStringUTFLength(env); // chars size += 1; // NUL string.DeleteLocalRef(env); @@ -65,7 +65,7 @@ strings2chars(jnixx::env env, ::jnixx::array<String> strings) { // Copy for (int i = 0; i < arrayLength; i++) { *argv++ = arg; - String string = strings.GetObjectArrayElement(env, i); + String string = strings.GetElement(env, i); int utfLength = string.GetStringUTFLength(env); string.GetStringUTFRegion(env, 0, string.GetStringLength(env), arg); arg += utfLength; @@ -83,10 +83,10 @@ chars2strings(::jnixx::env env, char** argv) { length++; } ::jnixx::array<String> strings - = ::jnixx::array<String>::NewObjectArray(env, length, NULL); + = ::jnixx::array<String>::New(length); for (int i = 0; i < length; i++) { String string = String::NewStringUTF(env, argv[i]); - strings.SetObjectArrayElement(env, i, string); + strings.SetElement(env, i, string); string.DeleteLocalRef(env); } return strings; diff --git a/frysk-sys/frysk/jnixx/jnixx.hxx b/frysk-sys/frysk/jnixx/jnixx.hxx index af38a18..d8051fa 100644 --- a/frysk-sys/frysk/jnixx/jnixx.hxx +++ b/frysk-sys/frysk/jnixx/jnixx.hxx @@ -1464,54 +1464,6 @@ namespace jnixx { } }; - - /** - * The JNIXX root, wraps the jobject pointer, all generated object - * wrappers extend this. - */ - class object { - public: - jobject _object; - object(jobject _object) { - this->_object = _object; - } - bool operator==(jobject o) { - return _object == o; - } - void DeleteLocalRef(jnixx::env env) { - env.DeleteLocalRef(_object); - _object = NULL; - } - }; - - /** - * The JNIXX array root, any array object extends this (which - * extends jnixx::object). - */ - template <typename Object> class array : public object { - protected: - array(jobject _object) : object(_object) { - } - public: - static array<Object> Cast(jobject object) { - return array<Object>(object); - } - public: - jsize GetArrayLength(::jnixx::env env) { - return env.GetArrayLength((jarray)_object); - } - static array<Object> NewObjectArray(::jnixx::env env, jsize length, - ::jnixx::object init) { - return env.NewObjectArray(length, Object::_class_(env), init._object); - } - Object GetObjectArrayElement(::jnixx::env env, jsize index) { - return Object::Cast(env.GetObjectArrayElement((jobjectArray)_object, - index)); - } - void SetObjectArrayElement(::jnixx::env env, jsize index, Object object) { - env.SetObjectArrayElement((jobjectArray)_object, index, object._object); - } - }; } #endif hooks/post-receive -- frysk system monitor/debugger