public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Make object arrays extend Object.
@ 2008-05-12 16:54 cagney
  0 siblings, 0 replies; only message in thread
From: cagney @ 2008-05-12 16:54 UTC (permalink / raw)
  To: frysk-cvs

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


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-05-12 16:54 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-12 16:54 [SCM] master: Make object arrays extend Object cagney

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).