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 and use byteArray et.al. set-region methods.
Date: Mon, 12 May 2008 21:27:00 -0000	[thread overview]
Message-ID: <20080512212752.14777.qmail@sourceware.org> (raw)

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


                 reply	other threads:[~2008-05-12 21:27 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=20080512212752.14777.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).