public inbox for frysk-cvs@sourceware.org help / color / mirror / Atom feed
From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Wrap the jobject in a jnixx::object; extend that. Date: Mon, 05 May 2008 21:47:00 -0000 [thread overview] Message-ID: <20080505214757.1584.qmail@sourceware.org> (raw) 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 <cagney@redhat.com> 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 <cagney@redhat.com> * 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 <cagney@redhat.com> * jni/Log.hxx: Use jnixx::object. * jni/Log.cxx: Ditto. frysk-sys/frysk/sys/ChangeLog 2008-05-05 Andrew Cagney <cagney@redhat.com> * jni/PseudoTerminal.cxx: Use jnixx::object. * jni/Signal.cxx-sh: Ditto. frysk-sys/lib/stdcpp/ChangeLog 2008-05-05 Andrew Cagney <cagney@redhat.com> * 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 <cagney@redhat.com> + * 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
reply other threads:[~2008-05-05 21:47 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=20080505214757.1584.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).