public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Generate and use byteArray et.al. set-region methods.
@ 2008-05-12 21:27 cagney
  0 siblings, 0 replies; only message in thread
From: cagney @ 2008-05-12 21:27 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  469c9c97c59f507101aad8250ab9332ce054d50c (commit)
      from  b2ba3c8a7b2e3a94e6f2b6a08119452610185528 (commit)

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

- Log -----------------------------------------------------------------
commit 469c9c97c59f507101aad8250ab9332ce054d50c
Author: Andrew Cagney <cagney@redhat.com>
Date:   Mon May 12 17:26:47 2008 -0400

    Generate and use byteArray et.al. set-region methods.
    
    frysk-sys/frysk/jnixx/ChangeLog
    2008-05-12  Andrew Cagney  <cagney@redhat.com>
    
    	* JniBindings.java: Generate primitive array methods.
    	* PrintCxxDefinitions.java: Generate primitive array types.
    	* PrintDeclarations.java: Ditto.
    	* PrintHxxDefinitions.java: Ditto.
    	* PrintNamespaces.java: Ditto.
    	* Printer.java: Ditto.
    
    frysk-sys/frysk/testbed/ChangeLog
    2008-05-12  Andrew Cagney  <cagney@redhat.com>
    
    	* jni/LocalMemory.cxx (LocalMemory::getDataBytes): Use
    	jnixx::byteArray.

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

Summary of changes:
 frysk-sys/frysk/jnixx/ChangeLog                |    7 +++
 frysk-sys/frysk/jnixx/JniBindings.java         |   70 ++++++++++++++++++++++++
 frysk-sys/frysk/jnixx/PrintCxxDefinitions.java |    9 ++-
 frysk-sys/frysk/jnixx/PrintDeclarations.java   |   70 +++++++++++++++---------
 frysk-sys/frysk/jnixx/PrintHxxDefinitions.java |    4 ++
 frysk-sys/frysk/jnixx/PrintNamespaces.java     |   25 ++++++---
 frysk-sys/frysk/jnixx/Printer.java             |   17 ++-----
 frysk-sys/frysk/testbed/ChangeLog              |    5 ++
 frysk-sys/frysk/testbed/jni/LocalMemory.cxx    |   14 ++---
 9 files changed, 163 insertions(+), 58 deletions(-)

First 500 lines of diff:
diff --git a/frysk-sys/frysk/jnixx/ChangeLog b/frysk-sys/frysk/jnixx/ChangeLog
index aa7319e..60f9c78 100644
--- a/frysk-sys/frysk/jnixx/ChangeLog
+++ b/frysk-sys/frysk/jnixx/ChangeLog
@@ -1,5 +1,12 @@
 2008-05-12  Andrew Cagney  <cagney@redhat.com>
 
+	* JniBindings.java: Generate primitive array methods.
+	* PrintCxxDefinitions.java: Generate primitive array types.
+	* PrintDeclarations.java: Ditto.
+	* PrintHxxDefinitions.java: Ditto.
+	* PrintNamespaces.java: Ditto.
+	* Printer.java: Ditto.
+
 	* Main.java (getJarClasses(String)): New.
 	(getNativeClasses(HashSet)): New.
 	(getReferences(HashSet)): New.
diff --git a/frysk-sys/frysk/jnixx/JniBindings.java b/frysk-sys/frysk/jnixx/JniBindings.java
index 93c3292..53804d0 100644
--- a/frysk-sys/frysk/jnixx/JniBindings.java
+++ b/frysk-sys/frysk/jnixx/JniBindings.java
@@ -267,6 +267,76 @@ class JniBindings {
 	// GetStringCritical
 	// Release StringCritical
 	;
+
+    static {
+	Class[] types = {
+	    boolean[].class,
+	    byte[].class,
+	    short[].class,
+	    char[].class,
+	    int[].class,
+	    long[].class,
+	    float[].class,
+	    double[].class,
+	};
+	for (int i = 0; i < types.length; i++) {
+	    String type = types[i].getComponentType().getName();
+	    String Type = (Character.toUpperCase(type.charAt(0))
+			   + type.substring(1));
+	    bindings
+		.put(types[i], true,
+		     "::jnixx::" + type + "Array", "New",
+		     new String[] {
+			 "::jnixx::env", "env",
+			 "jsize", "length",
+		     },
+		     new Object[] {
+			 "return " + type + "Array(env.New" + Type + "Array(length));",
+		     })
+		.put(types[i], false,
+		     "const j" + type + "*", "GetElements",
+		     new String[] {
+			 "::jnixx::env", "env",
+			 "jboolean*", "isCopy",
+		     },
+		     new Object[] {
+			 "return env.Get" + Type + "ArrayElements((j" + type + "Array) _object, isCopy);"
+		     })
+		.put(types[i], false,
+		     null, "ReleaseElements",
+		     new String[] {
+			 "::jnixx::env", "env",
+			 "j" + type + "*", "elements",
+			 "jint", "mode"
+		     },
+		     new Object[] {
+			 "env.Release" + Type + "ArrayElements((j" + type + "Array)_object, elements, mode);",
+		     })
+		.put(types[i], false,
+		     "void", "GetRegion",
+		     new String[] {
+			 "::jnixx::env", "env",
+			 "jsize", "start",
+			 "jsize", "length",
+			 "j" + type + "*", "buf",
+		     },
+		     new Object[] {
+			 "env.Get" + Type + "ArrayRegion((j" + type + "Array) _object, start, length, buf);"
+		     })
+		.put(types[i], false,
+		     "void", "SetRegion",
+		     new String[] {
+			 "::jnixx::env", "env",
+			 "jsize", "start",
+			 "jsize", "length",
+			 "j" + type + "*", "buf",
+		     },
+		     new Object[] {
+			 "env.Set" + Type + "ArrayRegion((j" + type + "Array) _object, start, length, buf);"
+		     })
+		;
+	}
+    }
     
     static void printDeclarations(Printer p, Class klass) {
 	bindings.printDeclarations(klass, p);
diff --git a/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java b/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java
index 5c02706..caef0bc 100644
--- a/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java
+++ b/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java
@@ -100,11 +100,14 @@ class PrintCxxDefinitions extends ClassWalker {
 			    } else if (returnType == String.class) {
 				p.print("(jstring) ret._object");
 			    } else if (returnType.isArray()) {
-				if (returnType.getComponentType().isPrimitive()) {
-				    p.print("ret");
+				Class component = returnType.getComponentType();
+				p.print("(j");
+				if (component.isPrimitive()) {
+				    p.print(component.getName());
 				} else {
-				    p.print("(jobjectArray) ret._object");
+				    p.print("object");
 				}
+				p.print("Array) ret._object");
 			    } else {
 				p.print("ret._object");
 			    }
diff --git a/frysk-sys/frysk/jnixx/PrintDeclarations.java b/frysk-sys/frysk/jnixx/PrintDeclarations.java
index f5baa5d..c028391 100644
--- a/frysk-sys/frysk/jnixx/PrintDeclarations.java
+++ b/frysk-sys/frysk/jnixx/PrintDeclarations.java
@@ -154,6 +154,36 @@ class PrintDeclarations extends ClassWalker {
 	    }
 	};
 
+    private void printClassTemplate(Class klass, Class parent) {
+	if (parent == null) {
+	    // 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) { }");
+	}
+	// Explicit cast operator.
+	p.print("public: static ");
+	p.printUnqualifiedCxxName(klass);
+	p.print(" Cast(jobject object) { return ");
+	p.printUnqualifiedCxxName(klass);
+	p.println("(object); }");
+	    // Static get-class method - a class knows its own class.
+	p.println("private: static jclass _class;");
+	p.println("public: static inline jclass _class_(::jnixx::env _env);");
+	JniBindings.printDeclarations(p, klass);
+    }
+
     private void printClass(Class klass, Class parent) {
 	p.println();
 	p.print("// ");
@@ -165,39 +195,25 @@ class PrintDeclarations extends ClassWalker {
 	    p.printGlobalCxxName(parent);
 	}
 	while(p.dent(0, "{", "};")) {
-	    if (parent == null) {
-		// 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) { }");
-	    }
-	    // Explicit cast operator.
-	    p.print("public: static ");
-	    p.printUnqualifiedCxxName(klass);
-	    p.print(" Cast(jobject object) { return ");
-	    p.printUnqualifiedCxxName(klass);
-	    p.println("(object); }");
-	    // Static get-class method - a class knows its own class.
-	    p.println("private: static jclass _class;");
-	    p.println("public: static inline jclass _class_(::jnixx::env _env);");
-	    JniBindings.printDeclarations(p, klass);
+	    printClassTemplate(klass, parent);
 	    printer.visit(klass);
 	}
 	JniBindings.printGlobals(p, klass);
     }
 
     void acceptArray(Class klass) {
+	Class component = klass.getComponentType();
+	if (component.isPrimitive()) {
+	    p.println();
+	    p.print("// ");
+	    p.println(klass);
+	    p.print("class ");
+	    p.printQualifiedCxxName(klass);
+	    p.print(" : public ::java::lang::Object");
+	    while (p.dent(1, "{", "};")) {
+		printClassTemplate(klass, Object.class);
+	    }
+	}
     }
     void acceptPrimitive(Class klass) {
     }
diff --git a/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java b/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java
index a255ece..7655cfd 100644
--- a/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java
+++ b/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java
@@ -277,6 +277,10 @@ class PrintHxxDefinitions extends ClassWalker {
 	};
 
     void acceptArray(Class klass) {
+	Class component = klass.getComponentType();
+	if (component.isPrimitive()) {
+	    JniBindings.printDefinitions(p, klass);
+	}
     }
     void acceptPrimitive(Class klass) {
     }
diff --git a/frysk-sys/frysk/jnixx/PrintNamespaces.java b/frysk-sys/frysk/jnixx/PrintNamespaces.java
index 70236cd..bb66178 100644
--- a/frysk-sys/frysk/jnixx/PrintNamespaces.java
+++ b/frysk-sys/frysk/jnixx/PrintNamespaces.java
@@ -46,18 +46,14 @@ class PrintNamespaces extends ClassWalker {
 	this.p = p;
     }
 
-    /**
-     * Print the namespace spec for the klass.
-     */
-    private void printCxxNamespace(Class klass) {
-	String[] names = klass.getName().split("\\.");
+    private void printNamespace(String[] names) {
 	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("class ");
 	p.print(names[names.length - 1]);
 	p.println(";");
 	for (int i = names.length - 2; i >= 0; i--) {
@@ -66,10 +62,25 @@ class PrintNamespaces extends ClassWalker {
 	}
     }
 
+    /**
+     * Print the namespace spec for the klass.
+     */
+    private void printNamespace(Class klass) {
+	String[] names = klass.getName().split("\\.");
+	printNamespace(names);
+    }
+
     void acceptArray(Class klass) {
 	p.println();
 	p.print("// ");
 	p.println(klass);
+	Class component = klass.getComponentType();
+	if (component.isPrimitive()) {
+	    printNamespace(new String[] {
+		    "jnixx",
+		    component.getName() + "Array",
+		});
+	}
     }
     void acceptPrimitive(Class klass) {
 	p.println();
@@ -80,7 +91,7 @@ class PrintNamespaces extends ClassWalker {
 	p.println();
 	p.print("// ");
 	p.println(klass);
-	printCxxNamespace(klass);
+	printNamespace(klass);
     }
     void acceptInterface(Class klass) {
 	acceptClass(klass);
diff --git a/frysk-sys/frysk/jnixx/Printer.java b/frysk-sys/frysk/jnixx/Printer.java
index 158a327..8bd673e 100644
--- a/frysk-sys/frysk/jnixx/Printer.java
+++ b/frysk-sys/frysk/jnixx/Printer.java
@@ -173,7 +173,10 @@ class Printer {
 	} else if (klass.isArray()) {
 	    Class componentType = klass.getComponentType();
 	    if (componentType.isPrimitive()) {
-		print("j");
+		if (global) {
+		    print("::");
+		}
+		print("jnixx::");
 		print(componentType.getName());
 		print("Array");
 	    } else {
@@ -498,9 +501,6 @@ class Printer {
 		print("p" + i);
 	    } else if (param == Class.class) {
 		print("p" + i);
-	    } else if (param.isArray()
-		       && param.getComponentType().isPrimitive()) {
-		print("p" + i);
 	    } else {
 		printGlobalCxxName(param);
 		print("::Cast");
@@ -566,9 +566,6 @@ class Printer {
 	    print(", ");
 	    if (param.isPrimitive()) {
 		print("p" + i);
-	    } else if (param.isArray()
-		       && param.getComponentType().isPrimitive()) {
-		print("p" + i);
 	    } else {
 		print("p" + i + "._object");
 	    }
@@ -610,12 +607,6 @@ class Printer {
 	print("return ");
 	if (returnType.isPrimitive()) {
 	    print(variable);
-	} else if (returnType.isArray()
-		   && returnType.getComponentType().isPrimitive()) {
-	    print("(");
-	    printGlobalCxxName(returnType);
-	    print(")");
-	    print(variable);
 	} else {
 	    printGlobalCxxName(returnType);
 	    print("::Cast");
diff --git a/frysk-sys/frysk/testbed/ChangeLog b/frysk-sys/frysk/testbed/ChangeLog
index f177959..e87ef84 100644
--- a/frysk-sys/frysk/testbed/ChangeLog
+++ b/frysk-sys/frysk/testbed/ChangeLog
@@ -1,3 +1,8 @@
+2008-05-12  Andrew Cagney  <cagney@redhat.com>
+
+	* jni/LocalMemory.cxx (LocalMemory::getDataBytes): Use
+	jnixx::byteArray.
+
 2008-05-11  Andrew Cagney  <cagney@redhat.com>
 
 	* jni/LocalMemory.cxx (codeAddr): New; use instead of JNI method.
diff --git a/frysk-sys/frysk/testbed/jni/LocalMemory.cxx b/frysk-sys/frysk/testbed/jni/LocalMemory.cxx
index 0914cad..fbf7713 100644
--- a/frysk-sys/frysk/testbed/jni/LocalMemory.cxx
+++ b/frysk-sys/frysk/testbed/jni/LocalMemory.cxx
@@ -46,12 +46,10 @@
 
 using namespace java::lang;
 
-static jbyteArray
+static ::jnixx::byteArray
 getBytes(::jnixx::env env, void *addr, size_t length) {
-  jbyteArray bytes = env.NewByteArray(length);
-  jbyte* elements = env.GetByteArrayElements(bytes, NULL);
-  memcpy(elements, addr, length);
-  env.ReleaseByteArrayElements(bytes, elements, 0);
+  ::jnixx::byteArray bytes = ::jnixx::byteArray::New(env, length);
+  bytes.SetRegion(env, 0, length, (jbyte*) addr);
   return bytes;
 }
 
@@ -67,7 +65,7 @@ frysk::testbed::LocalMemory::getDataAddr(::jnixx::env) {
   return (jlong) &memory;
 }
 
-jbyteArray
+::jnixx::byteArray
 frysk::testbed::LocalMemory::getDataBytes(::jnixx::env env) {
   return getBytes(env, &memory, sizeof(memory));
 }
@@ -101,7 +99,7 @@ frysk::testbed::LocalMemory::getCodeAddr(::jnixx::env) {
   return (jlong)codeAddr();
 }
 
-jbyteArray
+::jnixx::byteArray
 frysk::testbed::LocalMemory::getCodeBytes(::jnixx::env env) {
   return getBytes(env, codeAddr(), sizeof(memory));
 }
@@ -112,6 +110,6 @@ frysk::testbed::LocalMemory::constructStack(::jnixx::env env,
   // Copy known data onto the stack.
   uint8_t addr[sizeof(memory)];
   memcpy(addr, &memory, sizeof(memory));
-  jbyteArray bytes = getBytes(env, addr, sizeof(memory));
+  ::jnixx::byteArray bytes = getBytes(env, addr, sizeof(memory));
   builder.stack(env, (jlong)addr, bytes);
 }


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 21:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-12 21:27 [SCM] master: Generate and use byteArray et.al. set-region methods 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).