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 static constructor and field accessor methods.
Date: Fri, 02 May 2008 14:24:00 -0000	[thread overview]
Message-ID: <20080502142423.16471.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  8d06b9bb3c74976b8913336c5392867f06846e9c (commit)
      from  69b43e47f5db070885098d9159ffb5b6e52e0794 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 8d06b9bb3c74976b8913336c5392867f06846e9c
Author: Andrew Cagney <cagney@redhat.com>
Date:   Fri May 2 10:23:12 2008 -0400

    Generate static constructor and field accessor methods.
    
    frysk-sys/frysk/jni/ChangeLog
    2008-05-02  Andrew Cagney  <cagney@redhat.com>
    
    	* jnixx.java: Generate constructors and field accessors.

-----------------------------------------------------------------------

Summary of changes:
 frysk-sys/frysk/jni/ChangeLog  |    4 +
 frysk-sys/frysk/jni/jnixx.java |  430 ++++++++++++++++++++++++++++++----------
 2 files changed, 331 insertions(+), 103 deletions(-)

First 500 lines of diff:
diff --git a/frysk-sys/frysk/jni/ChangeLog b/frysk-sys/frysk/jni/ChangeLog
index 803fcd9..15faadd 100644
--- a/frysk-sys/frysk/jni/ChangeLog
+++ b/frysk-sys/frysk/jni/ChangeLog
@@ -1,3 +1,7 @@
+2008-05-02  Andrew Cagney  <cagney@redhat.com>
+
+	* jnixx.java: Generate constructors and field accessors.
+
 2008-05-01  Andrew Cagney  <cagney@redhat.com>
 
 	* exceptions.cxx (runtimeException): Throw an exception.
diff --git a/frysk-sys/frysk/jni/jnixx.java b/frysk-sys/frysk/jni/jnixx.java
index e83524b..8ddd247 100644
--- a/frysk-sys/frysk/jni/jnixx.java
+++ b/frysk-sys/frysk/jni/jnixx.java
@@ -40,14 +40,18 @@
 package frysk.jni;
 
 import java.lang.reflect.Member;
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.HashSet;
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Modifier;
 import java.io.PrintWriter;
 
 class jnixx {
+
     private static PrintWriter out = new PrintWriter(System.out, true);
     private static PrintWriter err = new PrintWriter(System.err, true);
+
     static void print(char ch) {
 	out.print(ch);
     }
@@ -86,6 +90,11 @@ class jnixx {
 	print("::");
 	print(method.getName());
     }
+    static void printCxxName(Constructor constructor) {
+	printCxxName(constructor.getDeclaringClass());
+	print("::");
+	print("New");
+    }
 
     /**
      * Print the namespace spec for the klass.
@@ -118,8 +127,14 @@ class jnixx {
     }
     private static HashSet printedNamespaces = new HashSet();
 
-    static boolean isStatic(Member member) {
-	return Modifier.isStatic(member.getModifiers());
+    /**
+     * Iterate over the klasses printing any referenced name spaces.
+     */
+    static void printCxxNamespaces(Class[] klasses) {
+	for (int i = 0; i < klasses.length; i++) {
+	    // Should this recurse?
+	    printCxxNamespace(klasses[i]);
+	}
     }
 
     /**
@@ -128,18 +143,37 @@ class jnixx {
      */
     static void printCxxNamespaces(Class klass) {
 	printCxxNamespace(klass);
+	Constructor[] constructors = klass.getDeclaredConstructors();
+	for (int i = 0; i < constructors.length; i++) {
+	    Constructor constructor = constructors[i];
+	    printCxxNamespaces(constructor.getParameterTypes());
+	}
 	Method[] methods = klass.getDeclaredMethods();
 	for (int i = 0; i < methods.length; i++) {
 	    Method method = methods[i];
 	    printCxxNamespace(method.getReturnType());
-	    Class[] params = method.getParameterTypes();
-	    for (int j = 0; j < params.length; j++) {
-		Class param = params[j];
-		printCxxNamespace(param);
-	    }
+	    printCxxNamespaces(method.getParameterTypes());
+	}
+	Field[] fields = klass.getDeclaredFields();
+	for (int i = 0; i < fields.length; i++) {
+	    printCxxNamespace(fields[i].getType());
 	}
+     
+    }
+
+    static boolean isStatic(Member member) {
+	return Modifier.isStatic(member.getModifiers());
+    }
+    static void printModifiers(Member member) {
+	print("  // ");
+	print(Modifier.toString(member.getModifiers()));
+	println();
+	print("  public: static");
     }
 
+    /**
+     * Return the JNI signature for the klass.
+     */
     static String jniSignature(Class klass) {
 	StringBuffer signature = new StringBuffer();
 	while (klass.isArray()) {
@@ -174,12 +208,21 @@ class jnixx {
 	return signature.toString();
     }
 
-    static void printSignature(Method method) {
-	print("(");
-	Class[] params = method.getParameterTypes();
+    /**
+     * Print the parameter list's JNI signature.
+     */
+    static void printJniSignature(Class[] params) {
 	for (int i = 0; i < params.length; i++) {
 	    print(jniSignature(params[i]));
 	}
+    }
+
+    /**
+     * Print the method's JNI signature.
+     */
+    static void printJniSignature(Method method) {
+	print("(");
+	printJniSignature(method.getParameterTypes());
 	print(")");
 	print(jniSignature(method.getReturnType()));
     }
@@ -252,17 +295,18 @@ class jnixx {
      * Given an array of types, print them as a list (presumably this
      * is a list of parameters).
      */
-    static void printFormalCxxParameters(Method method, boolean printArgs) {
+    private static void printFormalCxxParameters(Class klass, Class[] params,
+						 boolean isStatic,
+						 boolean printArgs) {
 	print("JNIEnv*");
 	if (printArgs)
 	    print(" env");
-	if (!isStatic(method)) {
+	if (!isStatic) {
 	    print(", ");
-	    printJniType(method.getDeclaringClass());
+	    printJniType(klass);
 	    if (printArgs)
 		print(" object");
 	}
-	Class[] params = method.getParameterTypes();
 	for (int i = 0; i < params.length; i++) {
 	    print(", ");
 	    printCxxType(params[i]);
@@ -270,16 +314,30 @@ class jnixx {
 		print(" p" + i);
 	}
     }
+    static void printFormalCxxParameters(Method f, boolean printArgs) {
+	printFormalCxxParameters(f.getDeclaringClass(), f.getParameterTypes(),
+				 isStatic(f), printArgs);
+    }
+    static void printFormalCxxParameters(Constructor f, boolean printArgs) {
+	printFormalCxxParameters(f.getDeclaringClass(), f.getParameterTypes(),
+				 true/*isStatic*/, printArgs);
+    }
 
-    static void printActualCxxParameters(Method method) {
+    static void printActualCxxParameters(Member func, Class[] params) {
 	print("env");
-	if (!isStatic(method)) {
+	if (!isStatic(func)) {
 	    print(", object");
 	}
-	for (int i = 0; i < method.getParameterTypes().length; i++) {
+	for (int i = 0; i < params.length; i++) {
 	    print(", p" + i);
 	}
     }
+    static void printActualCxxParameters(Method f) {
+	printActualCxxParameters(f, f.getParameterTypes());
+    }
+    static void printActualCxxParameters(Constructor f) {
+	printActualCxxParameters(f, f.getParameterTypes());
+    }
 
     static void printFormalJniParameters(Method method, boolean printArgs) {
 	print("JNIEnv*");
@@ -304,16 +362,22 @@ class jnixx {
 	}
     }
 
-    static void printActualJniParameters(Method method) {
-	if (isStatic(method))
+    static void printActualJniParameters(boolean isStatic, Class[] params) {
+	if (isStatic)
 	    print("_Class");
 	else
 	    print("object");
 	print(", id");
-	for (int i = 0; i < method.getParameterTypes().length; i++) {
+	for (int i = 0; i < params.length; i++) {
 	    print(", p" + i);
 	}
     }
+    static void printActualJniParameters(Method f) {
+	printActualJniParameters(isStatic(f), f.getParameterTypes());
+    }
+    static void printActualJniParameters(Constructor f) {
+	printActualJniParameters(/*isStatic=*/true, f.getParameterTypes());
+    }
 
     static void printReturnType(Class klass) {
 	if (klass.isPrimitive()) {
@@ -327,12 +391,8 @@ class jnixx {
 
     static void printCxxMethodDeclaration(Method method) {
 	println();
-	if (Modifier.isNative(method.getModifiers())) {
-	    println(" // native:");
-	}
-	println(" public:");
-	pad(1);
-	print("static ");
+	printModifiers(method);
+	print(" ");
 	printCxxType(method.getReturnType());
 	print(" ");
 	print(method.getName());
@@ -342,48 +402,54 @@ class jnixx {
 	println();
     }
 
-    static void printHxxFile(Class klass) {
-	String header = klass.getName().replaceAll("\\.", "_") + "_jni_hxx";
-	println("#ifndef " + header);
-	println("#define " + header);
+    static void printCxxMethodDefinition(Method method) {
+	Class returnType = method.getReturnType();
 	println();
-	println("#include \"frysk/jni/xx.hxx\"");
-	printCxxNamespaces(klass);
+	printCxxType(returnType);
 	println();
-	Class parent = klass.getSuperclass();
-	if (parent != Object.class) {
-	    print("#include \"");
-	    print(parent.getName().replaceAll("\\.", "/"));
-	    println("-jni.hxx\"");
-	    println();
+	printCxxName(method.getDeclaringClass());
+	print("::");
+	print(method.getName());
+	print("(");
+	printFormalCxxParameters(method, true);
+	print(") {");
+	println();
+	println("  static jmethodID id;");
+	println("  if (id == NULL)");
+	print("    id = getMethodID(env");
+	if (isStatic(method)) {
+	    print(", Class(env)");
+	} else {
+	    print(", object");
 	}
-	print("struct ");
-	printCxxName(klass);
-	if (parent == Object.class) {
-	    print(" : public __jobject");
-	} else if (parent != null) {
-	    print(" : public ");
-	    printCxxName(parent);
+	print(", \"");
+	print(method.getName());
+	print("\", \"");
+	printJniSignature(method);
+	println("\");");
+	print("  ");
+	if (returnType != Void.TYPE) {
+	    printCxxType(returnType);
+	    print(" ret = ");
+	    if (!returnType.isPrimitive()) {
+		print("(");
+		printCxxType(returnType);
+		print(") ");
+	    }
 	}
-	println(" {");
-	// Static get-class method - a class knows its own class.
-	println();
-	println(" private:");
-	println("  static jclass _Class;");
-	println(" public:");
-	println("  static jclass Class(JNIEnv* env);");
-	// Print the constructors.
-	// Print the field accessors.
-	// Print the methods
-	Method[] methods = klass.getDeclaredMethods();
-	for (int i = 0; i < methods.length; i++) {
-	    Method method = methods[i];
-	    printCxxMethodDeclaration(method);
+	print("env->Call");
+	if (isStatic(method))
+	    print("Static");
+	printReturnType(returnType);
+	print("Method(");
+	printActualJniParameters(method);
+	println(");");
+	println("  if (env->ExceptionCheck())");
+	println("    throw jnixx_exception();");
+	if (returnType != Void.TYPE) {
+	    println("  return ret;");
 	}
-	println();
-	println("};");
-	println();
-	println("#endif");
+	println("}");
     }
 
     static void printNativeMethodDefinition(Method method) {
@@ -421,54 +487,194 @@ class jnixx {
 	println("}");
     }
 
-    static void printCxxMethodDefinition(Method method) {
-	Class returnType = method.getReturnType();
-	println();
-	printCxxType(returnType);
+    static void printCxxFieldAccessorDeclaration(Field field, boolean get) {
+	printModifiers(field);
+	if (get) {
+	    print(" ");
+	    printCxxType(field.getType());
+	    print(" Get");
+	} else {
+	    print(" void Set");
+	}
+	String name = field.getName();
+	print(Character.toUpperCase(name.charAt(0)));
+	print(name.substring(1));
+	print("(JNIEnv*");
+	if (!isStatic(field)) {
+	    print(", ");
+	    printCxxType(field.getDeclaringClass());
+	}
+	if (!get) {
+	    print(", ");
+	    printCxxType(field.getType());
+	    print(" value");
+	}
+	println(");");
+    }
+
+    static void printCxxFieldAccessorDefinition(Field field, boolean get) {
 	println();
-	printCxxName(method.getDeclaringClass());
+	if (get) {
+	    printCxxType(field.getType());
+	    println();
+	} else { 
+	    println("void");
+	}
+	printCxxName(field.getDeclaringClass());
 	print("::");
-	print(method.getName());
+	if (get) {
+	    print("Get");
+	} else {
+	    print("Set");
+	}
+	String name = field.getName();
+	print(Character.toUpperCase(name.charAt(0)));
+	print(name.substring(1));
+	print("(JNIEnv* env");
+	if (!isStatic(field)) {
+	    print(", ");
+	    printCxxType(field.getDeclaringClass());
+	    print(" object");
+	}
+	if (!get) {
+	    print(", ");
+	    printCxxType(field.getType());
+	    print(" value");
+	}
+	println(") {");
+	println("  if (" + name + "ID == NULL) {");
+	print("    " + name + "ID = getFieldID(env, ");
+	if (isStatic(field)) {
+	    print("Class(env)");
+	} else {
+	    print("object");
+	}
+	print(", \"" + name + "\"");
+	print(", \"" + jniSignature(field.getType()) + "\"");
+	println(");");
+	println("  }");
+	if (get) {
+	    print("  return");
+	    if (!field.getType().isPrimitive()) {
+		print(" (");
+		printCxxType(field.getType());
+		print(")");
+	    }
+	    print(" env->Get");
+	} else {
+	    print("  env->Set");
+	}
+	if (isStatic(field)) {
+	    print("Static");
+	}
+	printReturnType(field.getType());
+	print("Field(");
+	if (isStatic(field)) {
+	    print("_Class");
+	} else {
+	    print("object");
+	}
+	print(", " + name + "ID");
+	if (!get) {
+	    print(",");
+	    if (!field.getType().isPrimitive()) {
+		print(" (jobject)");
+	    }
+	    print(" value");
+	}
+	println(");");
+	println("}");
+    }
+
+    static void printCxxConstructorDeclaration(Constructor constructor) {
+	println();
+	printModifiers(constructor);
+	print(" ");
+	printCxxType(constructor.getDeclaringClass());
+	print(" New(");
+	printFormalCxxParameters(constructor, false);
+	print(");");
+	println();
+    }
+
+    static void printCxxConstructorDefinition(Constructor constructor) {
+	println();
+	printCxxType(constructor.getDeclaringClass());
+	println();
+	printCxxName(constructor);
 	print("(");
-	printFormalCxxParameters(method, true);
+	printFormalCxxParameters(constructor, true);
 	print(") {");
 	println();
 	println("  static jmethodID id;");
 	println("  if (id == NULL)");
-	print("    id = getMethodID(env");
-	if (isStatic(method)) {
-	    print(", Class(env)");
-	} else {
-	    print(", object");
-	}
-	print(", \"");
-	print(method.getName());
-	print("\", \"");
-	printSignature(method);
-	println("\");");
+	print("    id = getMethodID(env, Class(env), \"<init>\", \"(");
+	printJniSignature(constructor.getParameterTypes());
+	println(")V\");");
 	print("  ");
-	if (returnType != Void.TYPE) {
-	    printCxxType(returnType);
-	    print(" ret = ");
-	    if (!returnType.isPrimitive()) {
-		print("(");
-		printCxxType(returnType);
-		print(") ");
-	    }
-	}
-	print("env->Call");
-	if (isStatic(method))
-	    print("Static");
-	printReturnType(returnType);
-	print("Method(");
-	printActualJniParameters(method);
+	printCxxType(constructor.getDeclaringClass());
+	print(" object = (");
+	printCxxType(constructor.getDeclaringClass());
+	print(") env->NewObject(");
+	printActualJniParameters(constructor);
 	println(");");
-	println("  if (env->ExceptionCheck())");
+	println("  if (object == NULL)");
 	println("    throw jnixx_exception();");
-	if (returnType != Void.TYPE) {
-	    println("  return ret;");
+	println("  return object;");
+	print("}");
+    }
+
+    static void printHxxFile(Class klass) {


hooks/post-receive
--
frysk system monitor/debugger


                 reply	other threads:[~2008-05-02 14:24 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=20080502142423.16471.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: link
Be 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).