public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Make object arrays extend Object.
Date: Mon, 12 May 2008 16:54:00 -0000	[thread overview]
Message-ID: <20080512165439.15325.qmail@sourceware.org> (raw)

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


                 reply	other threads:[~2008-05-12 16:54 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=20080512165439.15325.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).