From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1624 invoked by alias); 5 May 2008 21:47:58 -0000 Received: (qmail 1599 invoked by uid 367); 5 May 2008 21:47:57 -0000 Date: Mon, 05 May 2008 21:47:00 -0000 Message-ID: <20080505214757.1584.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Wrap the jobject in a jnixx::object; extend that. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: a92d0b3824f9d328d49e4f849d5b94d5a1c0118f X-Git-Newrev: a7987b6792fe41af2e15ffe0074e785e2bb4a386 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/msg00186.txt.bz2 The branch, master has been updated via a7987b6792fe41af2e15ffe0074e785e2bb4a386 (commit) from a92d0b3824f9d328d49e4f849d5b94d5a1c0118f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit a7987b6792fe41af2e15ffe0074e785e2bb4a386 Author: Andrew Cagney Date: Mon May 5 17:45:32 2008 -0400 Wrap the jobject in a jnixx::object; extend that. frysk-sys/frysk/jnixx/ChangeLog 2008-05-05 Andrew Cagney * jnixx.hxx (jnixx::object): New. * Main.java: Generate each class extending jnixx::object instead of __jobject. * PrintDeclarations.java: Ditto * PrintDefinitions.java: Ditto. * PrintNamespaces.java: Ditto. * Printer.java: Ditto. * PrintIncludes.java: New; same. * print.cxx: Convert to jnixx::object. * print.cxx: Ditto. frysk-sys/frysk/rsl/ChangeLog 2008-05-05 Andrew Cagney * jni/Log.hxx: Use jnixx::object. * jni/Log.cxx: Ditto. frysk-sys/frysk/sys/ChangeLog 2008-05-05 Andrew Cagney * jni/PseudoTerminal.cxx: Use jnixx::object. * jni/Signal.cxx-sh: Ditto. frysk-sys/lib/stdcpp/ChangeLog 2008-05-05 Andrew Cagney * jni/Demangler.cxx: Use jnixx::object. ----------------------------------------------------------------------- Summary of changes: frysk-sys/frysk/jnixx/ChangeLog | 11 ++ frysk-sys/frysk/jnixx/Main.java | 58 +++++++--- frysk-sys/frysk/jnixx/PrintDeclarations.java | 16 +--- frysk-sys/frysk/jnixx/PrintDefinitions.java | 122 ++++++++++++-------- .../{PrintNamespaces.java => PrintIncludes.java} | 45 +++---- frysk-sys/frysk/jnixx/PrintNamespaces.java | 14 ++- frysk-sys/frysk/jnixx/Printer.java | 113 +++++++++++++------ frysk-sys/frysk/jnixx/jnixx.hxx | 92 ++++++++++++--- frysk-sys/frysk/jnixx/print.cxx | 20 ++-- frysk-sys/frysk/jnixx/print.hxx | 4 +- frysk-sys/frysk/rsl/ChangeLog | 3 + frysk-sys/frysk/rsl/jni/Log.cxx | 35 +++--- frysk-sys/frysk/rsl/jni/Log.hxx | 12 ++- frysk-sys/frysk/sys/ChangeLog | 3 + frysk-sys/frysk/sys/jni/PseudoTerminal.cxx | 2 +- frysk-sys/frysk/sys/jni/Signal.cxx-sh | 6 +- frysk-sys/lib/stdcpp/ChangeLog | 2 + frysk-sys/lib/stdcpp/jni/Demangler.cxx | 5 +- 18 files changed, 368 insertions(+), 195 deletions(-) copy frysk-sys/frysk/jnixx/{PrintNamespaces.java => PrintIncludes.java} (77%) First 500 lines of diff: diff --git a/frysk-sys/frysk/jnixx/ChangeLog b/frysk-sys/frysk/jnixx/ChangeLog index 622b119..62bb250 100644 --- a/frysk-sys/frysk/jnixx/ChangeLog +++ b/frysk-sys/frysk/jnixx/ChangeLog @@ -1,5 +1,16 @@ 2008-05-05 Andrew Cagney + * jnixx.hxx (jnixx::object): New. + * Main.java: Generate each class extending jnixx::object instead + of __jobject. + * PrintDeclarations.java: Ditto + * PrintDefinitions.java: Ditto. + * PrintNamespaces.java: Ditto. + * Printer.java: Ditto. + * PrintIncludes.java: New; same. + * print.cxx: Convert to jnixx::object. + * print.cxx: Ditto. + * Printer(dent(int,String,String)): New. * PrintNamespaces.java: Clean up generated indentation. * PrintDefinitions.java: Ditto. diff --git a/frysk-sys/frysk/jnixx/Main.java b/frysk-sys/frysk/jnixx/Main.java index 2b2e2db..43ee1ab 100644 --- a/frysk-sys/frysk/jnixx/Main.java +++ b/frysk-sys/frysk/jnixx/Main.java @@ -41,41 +41,65 @@ package frysk.jnixx; class Main { + static void printHxxBody(Printer p, Class klass, + PrintNamespaces printNamespaces) { + Class parent = klass.getSuperclass(); + p.println(); + WalkClass.visit(klass, printNamespaces); + p.println(); + p.print("struct "); + p.printQualifiedCxxName(klass); + p.print(" : public "); + if (parent == Object.class) { + p.print("jnixx::object"); + } else if (parent == null) { + p.print("jnixx::interface"); + } else { + p.printQualifiedCxxName(parent); + } + while(p.dent(0, "{", "};")) { + // Constructor. + p.printUnqualifiedCxxName(klass); + p.print("(jobject o)"); + p.print(" : "); + if (parent == Object.class) { + p.print("jnixx::object(o)"); + } else if (parent == null) { + p.print("jnixx::interface(o)"); + } else { + p.printQualifiedCxxName(parent); + p.print("(o)"); + } + p.println(" { }"); + // Static get-class method - a class knows its own class. + p.println("static jclass Class(jnixx::env& env);"); + WalkClass.visit(klass, new PrintDeclarations(p)); + p.println(); + } + } + private static void printHxxFile(Printer p, Class klass) { String header = klass.getName().replaceAll("\\.", "_") + "_jni_hxx"; p.println("#ifndef " + header); p.println("#define " + header); p.println(); p.println("#include \"frysk/jnixx/jnixx.hxx\""); - WalkClass.visit(klass, new PrintNamespaces(p)); - p.println(); Class parent = klass.getSuperclass(); if (parent != Object.class) { + p.println(); p.print("#include \""); p.printHeaderFileName(parent); p.print("\""); p.println(); } - p.print("struct "); - p.printQualifiedCxxName(klass); - if (parent == Object.class) { - p.print(" : public __jobject"); - } else if (parent != null) { - p.print(" : public "); - p.printQualifiedCxxName(parent); - } - while(p.dent(0, "{", "};")) { - WalkClass.visit(klass, new PrintDeclarations(p)); - p.println(); - } + printHxxBody(p, klass, new PrintNamespaces(p)); p.println(); p.println("#endif"); } private static void printCxxFile(Printer p, Class klass) { - p.print("#include \""); - p.printHeaderFileName(klass); - p.println("\""); + p.println("#include \"frysk/jnixx/jnixx.hxx\""); + WalkClass.visit(klass, new PrintIncludes(p, new PrintNamespaces(p))); WalkClass.visit(klass, new PrintDefinitions(p)); } diff --git a/frysk-sys/frysk/jnixx/PrintDeclarations.java b/frysk-sys/frysk/jnixx/PrintDeclarations.java index d37b04b..9ed4bfc 100644 --- a/frysk-sys/frysk/jnixx/PrintDeclarations.java +++ b/frysk-sys/frysk/jnixx/PrintDeclarations.java @@ -52,21 +52,16 @@ class PrintDeclarations implements ClassWalker { } public boolean acceptClass(Class klass) { - // Static get-class method - a class knows its own class. - p.println(); - p.println("public: static jclass Class(jnixx::env& env);"); return true; } public void acceptConstructor(Constructor constructor) { - p.println(); p.printModifiers(constructor); p.print(" "); p.printCxxType(constructor.getDeclaringClass()); p.print(" New("); p.printFormalCxxParameters(constructor, false); - p.print(");"); - p.println(); + p.println(");"); } private void printCxxFieldAccessorDeclaration(Field field, boolean get) { @@ -82,10 +77,6 @@ class PrintDeclarations implements ClassWalker { p.print(Character.toUpperCase(name.charAt(0))); p.print(name.substring(1)); p.print("(jnixx::env&"); - if (!Modifier.isStatic(field.getModifiers())) { - p.print(", "); - p.printCxxType(field.getDeclaringClass()); - } if (!get) { p.print(", "); p.printCxxType(field.getType()); @@ -95,7 +86,6 @@ class PrintDeclarations implements ClassWalker { } public void acceptField(Field field) { - p.println(); printCxxFieldAccessorDeclaration(field, true); if (!Modifier.isFinal(field.getModifiers())) { printCxxFieldAccessorDeclaration(field, false); @@ -103,7 +93,6 @@ class PrintDeclarations implements ClassWalker { } public void acceptMethod(Method method) { - p.println(); p.printModifiers(method); p.print(" "); p.printCxxType(method.getReturnType()); @@ -111,7 +100,6 @@ class PrintDeclarations implements ClassWalker { p.print(method.getName()); p.print("("); p.printFormalCxxParameters(method, false); - p.print(");"); - p.println(); + p.println(");"); } } diff --git a/frysk-sys/frysk/jnixx/PrintDefinitions.java b/frysk-sys/frysk/jnixx/PrintDefinitions.java index 6aa97d8..9aaf230 100644 --- a/frysk-sys/frysk/jnixx/PrintDefinitions.java +++ b/frysk-sys/frysk/jnixx/PrintDefinitions.java @@ -54,18 +54,18 @@ class PrintDefinitions implements ClassWalker { public boolean acceptClass(Class klass) { // The class, via reflection. p.println(); - p.println("static jclass _Class;"); + p.println("static jclass _class;"); p.println(); p.println("jclass"); p.printQualifiedCxxName(klass); p.print("::Class(jnixx::env& env)"); while (p.dent(0, "{", "}")) { - p.print("if (_Class == NULL)"); + p.print("if (_class == NULL)"); while (p.dent(1, "{", "}")) { - p.println("_Class = env.findClass(\"" + p.println("_class = env.findClass(\"" + klass.getName().replace("\\.", "/") + "\");"); } - p.println("return _Class;"); + p.println("return _class;"); } return true; } @@ -85,24 +85,24 @@ class PrintDefinitions implements ClassWalker { p.printJniSignature(constructor.getParameterTypes()); p.println(")V\");"); } - p.printCxxType(constructor.getDeclaringClass()); - p.print("object = ("); - p.printCxxType(constructor.getDeclaringClass()); - p.print(") env.newObject("); + p.print("jobject object = env.newObject("); p.printActualJniParameters(constructor); p.println(");"); while (p.dent(1, "if (object == NULL) {", "}")) { p.println("throw jnixx::exception();"); } - p.println("return object;"); + p.print("return "); + p.printCxxType(constructor.getDeclaringClass()); + p.println("(object);"); } } private void printCxxFieldAccessorDefinition(Field field, boolean get) { boolean isStatic = Modifier.isStatic(field.getModifiers()); + Class type = field.getType(); p.println(); if (get) { - p.printCxxType(field.getType()); + p.printCxxType(type); p.println(); } else { p.println("void"); @@ -118,15 +118,10 @@ class PrintDefinitions implements ClassWalker { p.print(Character.toUpperCase(name.charAt(0))); p.print(name.substring(1)); p.print("(jnixx::env& env"); - if (!isStatic) { - p.print(", "); - p.printCxxType(field.getDeclaringClass()); - p.print(" object"); - } if (!get) { p.print(", "); - p.printCxxType(field.getType()); - p.print(" value"); + p.printCxxType(type); + p.print(" p0"); } p.print(")"); while (p.dent(0, "{", "}")) { @@ -138,17 +133,16 @@ class PrintDefinitions implements ClassWalker { p.print("FieldID(Class(env), \""); p.print(name); p.print("\", \""); - p.printJniSignature(field.getType()); + p.printJniSignature(type); p.print("\""); p.println(");"); } if (get) { - p.print("return"); - if (!field.getType().isPrimitive()) { - p.print(" ("); - p.printCxxType(field.getType()); - p.print(")"); - } + p.printJniType(type); + p.print(" ret = "); + p.print("("); + p.printJniType(type); + p.print(")"); p.print(" env.get"); } else { p.print("env.set"); @@ -156,22 +150,28 @@ class PrintDefinitions implements ClassWalker { if (isStatic) { p.print("Static"); } - p.printJniReturnTypeName(field.getType()); + p.printJniReturnTypeName(type); p.print("Field("); - if (isStatic) { - p.print("_Class"); + if (get) { + p.printActualJniParameters(isStatic, name + "ID", + new Class[0]); } else { - p.print("object"); + p.printActualJniParameters(isStatic, name + "ID", + new Class[] { type }); } - p.print(", " + name + "ID"); - if (!get) { - p.print(","); - if (!field.getType().isPrimitive()) { - p.print(" (jobject)"); + p.println(");"); + if (get) { + p.print("return "); + if (type.isPrimitive()) { + p.print("ret"); + } else if (type.getName().startsWith("java.")) { + p.print("ret"); + } else { + p.printCxxType(type); + p.print("(ret)"); } - p.print(" value"); + p.println(";"); } - p.println(");"); } } @@ -197,7 +197,7 @@ class PrintDefinitions implements ClassWalker { p.print(method.getName()); p.print("("); p.printFormalCxxParameters(method, true); - p.println(")"); + p.print(")"); while (p.dent(0, "{", "}")) { p.println("static jmethodID id;"); while (p.dent(1, "if (id == NULL) {", "}")) { @@ -212,13 +212,12 @@ class PrintDefinitions implements ClassWalker { p.println("\");"); } if (returnType != Void.TYPE) { - p.printCxxType(returnType); - p.print(" ret = "); - if (!returnType.isPrimitive()) { - p.print("("); - p.printCxxType(returnType); - p.print(") "); + if (returnType.isPrimitive()) { + p.printJniType(returnType); + } else { + p.print("jobject"); } + p.print(" ret = "); } p.print("env.call"); if (isStatic) { @@ -229,12 +228,20 @@ class PrintDefinitions implements ClassWalker { p.printActualJniParameters(method); p.println(");"); if (returnType != Void.TYPE) { - p.println(" return ret;"); + p.print("return "); + if (returnType.isPrimitive()) { + p.print("ret;"); + } else { + p.printCxxType(returnType); + p.print("(ret)"); + } + p.println(";"); } } } private void printNativeMethodDefinition(Method method) { + boolean isStatic = Modifier.isStatic(method.getModifiers()); p.println(); while (p.dent(0, "extern \"C\" {", "};")) { p.print("JNIEXPORT "); @@ -256,14 +263,35 @@ class PrintDefinitions implements ClassWalker { p.println("try {"); { p.indent(); - p.println("jnixx::env jnixxEnv = jnixx::env(jniEnv);"); - if (method.getReturnType() != Void.TYPE) { - p.print("return "); + p.println("jnixx::env env = jnixx::env(jni);"); + Class returnType = method.getReturnType(); + if (returnType != Void.TYPE) { + p.printCxxType(returnType); + p.print(" ret = "); + } + if (isStatic) { + p.printQualifiedCxxName(method); + } else { + p.printCxxType(method.getDeclaringClass()); + p.print("(object)."); + p.print(method.getName()); } - p.printQualifiedCxxName(method); p.print("("); p.printActualCxxParameters(method); p.println(");"); + if (returnType != Void.TYPE) { + p.print("return "); + if (returnType.isPrimitive()) { + p.print("ret"); + } else if (returnType == String.class) { + p.print("(jstring) ret._object"); + } else if (returnType.isArray()) { + p.print("(jobjectArray) ret._object"); + } else { + p.print("ret._object"); + } + p.println(";"); + } p.outdent(); } p.println("} catch (jnixx::exception) {"); diff --git a/frysk-sys/frysk/jnixx/PrintNamespaces.java b/frysk-sys/frysk/jnixx/PrintIncludes.java similarity index 77% copy from frysk-sys/frysk/jnixx/PrintNamespaces.java copy to frysk-sys/frysk/jnixx/PrintIncludes.java index edbc6a6..3a4a746 100644 --- a/frysk-sys/frysk/jnixx/PrintNamespaces.java +++ b/frysk-sys/frysk/jnixx/PrintIncludes.java @@ -44,40 +44,33 @@ import java.lang.reflect.Method; import java.util.HashSet; import java.lang.reflect.Constructor; -class PrintNamespaces implements ClassWalker { +class PrintIncludes implements ClassWalker { private final Printer p; - PrintNamespaces(Printer p) { + private final PrintNamespaces printNamespaces; + PrintIncludes(Printer p, PrintNamespaces printNamespaces) { this.p = p; + this.printNamespaces = printNamespaces; } /** - * Print the namespace spec for the klass. + * Print #includes for any non system headers.. */ - private void printCxxNamespace(Class klass) { + private void printCxxInclude(Class klass) { while (klass.isArray()) { klass = klass.getComponentType(); } if (klass.isPrimitive()) return; + if (klass.getName().startsWith("java.")) + return; if (printedNamespaces.contains(klass)) return; - p.println(); - String[] names = klass.getName().split("\\."); - 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(names[names.length - 1]); - p.print(";"); - p.println(); - for (int i = names.length - 2; i >= 0; i--) { - p.outdent(); - p.println("}"); + Class superclass = klass.getSuperclass(); + if (superclass != null) { + printCxxInclude(superclass); } + Main.printHxxBody(p, klass, printNamespaces); printedNamespaces.add(klass); } private HashSet printedNamespaces = new HashSet(); @@ -85,28 +78,28 @@ class PrintNamespaces implements ClassWalker { /** * Iterate over the klasses printing any referenced name spaces. */ - private void printCxxNamespaces(Class[] klasses) { + private void printCxxIncludes(Class[] klasses) { for (int i = 0; i < klasses.length; i++) { // Should this recurse? - printCxxNamespace(klasses[i]); + printCxxInclude(klasses[i]); } } public boolean acceptClass(Class klass) { - printCxxNamespace(klass); + printCxxInclude(klass); return true; } public void acceptConstructor(Constructor constructor) { - printCxxNamespaces(constructor.getParameterTypes()); + printCxxIncludes(constructor.getParameterTypes()); } public void acceptField(Field field) { - printCxxNamespace(field.getType()); + printCxxInclude(field.getType()); } public void acceptMethod(Method method) { - printCxxNamespace(method.getReturnType()); - printCxxNamespaces(method.getParameterTypes()); + printCxxInclude(method.getReturnType()); + printCxxIncludes(method.getParameterTypes()); } } diff --git a/frysk-sys/frysk/jnixx/PrintNamespaces.java b/frysk-sys/frysk/jnixx/PrintNamespaces.java index edbc6a6..405a534 100644 --- a/frysk-sys/frysk/jnixx/PrintNamespaces.java hooks/post-receive -- frysk system monitor/debugger