public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Implement jni/LocalMemory.cxx.
@ 2008-05-07  5:36 cagney
  0 siblings, 0 replies; only message in thread
From: cagney @ 2008-05-07  5:36 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  12cea45ad5e923dce81131eab960b85d65eeb690 (commit)
      from  263254a7939cf7db35ef7d85cc781e88bca232b0 (commit)

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

- Log -----------------------------------------------------------------
commit 12cea45ad5e923dce81131eab960b85d65eeb690
Author: Andrew Cagney <cagney@redhat.com>
Date:   Wed May 7 01:35:28 2008 -0400

    Implement jni/LocalMemory.cxx.
    
    frysk-sys/frysk/jnixx/ChangeLog
    2008-05-07  Andrew Cagney  <cagney@redhat.com>
    
    	* PrintCxxDefinitions.java: Generate _class$ variable of nested
    	classes.
    	* Main.java: Ditto.
    	* ClassVisitor.java: Visit nested classes.
    	* ClassWalker.java: Update.
    	* PrintCxxDefinitions.java: Update.
    	* PrintHxxDefinitions.java: Update.
    	* PrintDeclarations.java: Update.
    	* Printer.java: Encode "$".
    
    frysk-sys/frysk/testbed/ChangeLog
    2008-05-07  Andrew Cagney  <cagney@redhat.com>
    
    	* jni/LocalMemory.cxx: Implement.

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

Summary of changes:
 frysk-sys/frysk/jnixx/ChangeLog                |   10 ++
 frysk-sys/frysk/jnixx/ClassVisitor.java        |    7 +-
 frysk-sys/frysk/jnixx/ClassWalker.java         |    2 +-
 frysk-sys/frysk/jnixx/Main.java                |    1 +
 frysk-sys/frysk/jnixx/PrintCxxDefinitions.java |   12 ++-
 frysk-sys/frysk/jnixx/PrintDeclarations.java   |    2 +-
 frysk-sys/frysk/jnixx/PrintHxxDefinitions.java |    3 +-
 frysk-sys/frysk/jnixx/Printer.java             |    1 +
 frysk-sys/frysk/testbed/ChangeLog              |    4 +
 frysk-sys/frysk/testbed/jni/LocalMemory.cxx    |  139 +++++++++---------------
 10 files changed, 90 insertions(+), 91 deletions(-)

First 500 lines of diff:
diff --git a/frysk-sys/frysk/jnixx/ChangeLog b/frysk-sys/frysk/jnixx/ChangeLog
index 5efff6c..40740d1 100644
--- a/frysk-sys/frysk/jnixx/ChangeLog
+++ b/frysk-sys/frysk/jnixx/ChangeLog
@@ -1,5 +1,15 @@
 2008-05-07  Andrew Cagney  <cagney@redhat.com>
 
+	* PrintCxxDefinitions.java: Generate _class$ variable of nested
+	classes.
+	* Main.java: Ditto.
+	* ClassVisitor.java: Visit nested classes.
+	* ClassWalker.java: Update.
+	* PrintCxxDefinitions.java: Update.
+	* PrintHxxDefinitions.java: Update.
+	* PrintDeclarations.java: Update.
+	* Printer.java: Encode "$".
+	
 	* print.cxx: Include Errno-jni.hxx.
 	* exceptions.cxx: Include Errno-jni.hxx.
 	* Main.java: Move jnixx::exception definition to ...
diff --git a/frysk-sys/frysk/jnixx/ClassVisitor.java b/frysk-sys/frysk/jnixx/ClassVisitor.java
index 2a883d0..a83be56 100644
--- a/frysk-sys/frysk/jnixx/ClassVisitor.java
+++ b/frysk-sys/frysk/jnixx/ClassVisitor.java
@@ -71,6 +71,11 @@ abstract class ClassVisitor {
 		continue;
 	    acceptMethod(method);
 	}
+	Class[] classes = klass.getClasses();
+	for (int i = 0; i < classes.length; i++) {
+	    Class inner = classes[i];
+	    acceptClass(inner);
+	}
     }
 
     abstract void acceptInterface(Class constructor);
@@ -78,5 +83,5 @@ abstract class ClassVisitor {
     abstract void acceptField(Field field);
     abstract void acceptMethod(Method method);
     abstract void acceptComponent(Class klass);
-    abstract void acceptNested(Class klass);
+    abstract void acceptClass(Class klass);
 }
diff --git a/frysk-sys/frysk/jnixx/ClassWalker.java b/frysk-sys/frysk/jnixx/ClassWalker.java
index ae85ca3..2154f76 100644
--- a/frysk-sys/frysk/jnixx/ClassWalker.java
+++ b/frysk-sys/frysk/jnixx/ClassWalker.java
@@ -68,7 +68,7 @@ abstract class ClassWalker {
 		walk(method.getReturnType());
 		walk(method.getParameterTypes());
 	    }
-	    void acceptNested(Class klass) {
+	    void acceptClass(Class klass) {
 		walk(klass);
 	    }
 	};
diff --git a/frysk-sys/frysk/jnixx/Main.java b/frysk-sys/frysk/jnixx/Main.java
index e2a6453..42eacac 100644
--- a/frysk-sys/frysk/jnixx/Main.java
+++ b/frysk-sys/frysk/jnixx/Main.java
@@ -66,6 +66,7 @@ class Main {
 	p.print("#include \"");
 	p.printHeaderFileName(klass);
 	p.println("\"");
+	p.println();
 	p.print("jclass ");
 	p.printQualifiedCxxName(klass);
 	p.println("::_class$;");
diff --git a/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java b/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java
index 9325b32..38b7492 100644
--- a/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java
+++ b/frysk-sys/frysk/jnixx/PrintCxxDefinitions.java
@@ -98,7 +98,11 @@ class PrintCxxDefinitions extends ClassVisitor {
 		    } else if (returnType == String.class) {
 			p.print("(jstring) ret._object");
 		    } else if (returnType.isArray()) {
-			p.print("(jobjectArray) ret._object");
+			if (returnType.getComponentType().isPrimitive()) {
+			    p.print("ret");
+			} else {
+			    p.print("(jobjectArray) ret._object");
+			}
 		    } else {
 			p.print("ret._object");
 		    }
@@ -133,6 +137,10 @@ class PrintCxxDefinitions extends ClassVisitor {
     }
     void acceptComponent(Class klass) {
     }
-    void acceptNested(Class klass) {
+    void acceptClass(Class klass) {
+	p.println();
+	p.print("jclass ");
+	p.printQualifiedCxxName(klass);
+	p.println("::_class$;");
     }
 }
diff --git a/frysk-sys/frysk/jnixx/PrintDeclarations.java b/frysk-sys/frysk/jnixx/PrintDeclarations.java
index a0735ef..449e42f 100644
--- a/frysk-sys/frysk/jnixx/PrintDeclarations.java
+++ b/frysk-sys/frysk/jnixx/PrintDeclarations.java
@@ -79,7 +79,7 @@ class PrintDeclarations extends ClassWalker {
     private final ClassVisitor printer = new ClassVisitor() {
 	    public void acceptComponent(Class klass) {
 	    }
-	    public void acceptNested(Class klass) {
+	    public void acceptClass(Class klass) {
 	    }
 	    public void acceptInterface(Class klass) {
 	    }
diff --git a/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java b/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java
index aa9c93b..6782ea0 100644
--- a/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java
+++ b/frysk-sys/frysk/jnixx/PrintHxxDefinitions.java
@@ -195,7 +195,7 @@ class PrintHxxDefinitions extends ClassWalker {
 	    }
 	    void acceptInterface(Class klass) {
 	    }
-	    void acceptNested(Class klass) {
+	    void acceptClass(Class klass) {
 	    }
 	    void acceptConstructor(Constructor constructor) {
 		p.println();
@@ -250,6 +250,7 @@ class PrintHxxDefinitions extends ClassWalker {
     void acceptPrimitive(Class klass) {
     }
     void acceptInterface(Class klass) {
+	acceptClass(klass);
     }
     void acceptClass(Class klass) {
 	// The class, via reflection.
diff --git a/frysk-sys/frysk/jnixx/Printer.java b/frysk-sys/frysk/jnixx/Printer.java
index b1ee3fb..ac12fd8 100644
--- a/frysk-sys/frysk/jnixx/Printer.java
+++ b/frysk-sys/frysk/jnixx/Printer.java
@@ -325,6 +325,7 @@ class Printer {
 		  .replaceAll("_", "_1")
 		  .replaceAll(";", "_2")
 		  .replaceAll("\\[", "_3")
+		  .replaceAll("\\$", "_00024")
 		  .replaceAll("/", "_"));
 	}
 	return this;
diff --git a/frysk-sys/frysk/testbed/ChangeLog b/frysk-sys/frysk/testbed/ChangeLog
index 38a81a1..542937f 100644
--- a/frysk-sys/frysk/testbed/ChangeLog
+++ b/frysk-sys/frysk/testbed/ChangeLog
@@ -1,3 +1,7 @@
+2008-05-07  Andrew Cagney  <cagney@redhat.com>
+
+	* jni/LocalMemory.cxx: Implement.
+
 2008-05-06  Andrew Cagney  <cagney@redhat.com>
 
 	* LocalMemory.java (dataByte, dataShort, dataInt, dataLong):
diff --git a/frysk-sys/frysk/testbed/jni/LocalMemory.cxx b/frysk-sys/frysk/testbed/jni/LocalMemory.cxx
index 2d17fc3..4ca84f1 100644
--- a/frysk-sys/frysk/testbed/jni/LocalMemory.cxx
+++ b/frysk-sys/frysk/testbed/jni/LocalMemory.cxx
@@ -1,6 +1,6 @@
 // This file is part of the program FRYSK.
 //
-// Copyright 2008, Red Hat Inc.
+// Copyright 2005, 2006, 2007 Red Hat Inc.
 //
 // FRYSK is free software; you can redistribute it and/or modify it
 // under the terms of the GNU General Public License as published by
@@ -37,105 +37,74 @@
 // version and license this file solely under the GPL without
 // exception.
 
-#include "frysk_testbed_LocalMemory.h"
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
 
+#include "frysk/testbed/LocalMemory-jni.hxx"
+#include "frysk/jnixx/exceptions.hxx"
 
-JNIEXPORT jlong
-Java_frysk_testbed_LocalMemory_getByteDataAddr (JNIEnv *env, jclass)
-{
-  jclass cls = env->FindClass("java/lang/RuntimeException");
-  if (cls != NULL) {
-    env->ThrowNew(cls, __FILE__ ":Java_frysk_testbed_LocalMemory_getByteDataAddr not implemented");
-  }
-  return 0;
+static jbyteArray
+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);
+  return bytes;
 }
 
-JNIEXPORT jlong
-Java_frysk_testbed_LocalMemory_getShortDataAddr (JNIEnv *env, jclass)
-{
-  jclass cls = env->FindClass("java/lang/RuntimeException");
-  if (cls != NULL) {
-    env->ThrowNew(cls, __FILE__ ":Java_frysk_testbed_LocalMemory_getShortDataAddr not implemented");
-  }
-  return 0;
-}
+struct m {
+  jbyte byteData;
+  jshort shortData;
+  jint intData;
+  jlong longData;
+} memory = { 43, 45, 42, 44 };
 
-JNIEXPORT jlong
-Java_frysk_testbed_LocalMemory_getIntDataAddr (JNIEnv *env, jclass)
-{
-  jclass cls = env->FindClass("java/lang/RuntimeException");
-  if (cls != NULL) {
-    env->ThrowNew(cls, __FILE__ ":Java_frysk_testbed_LocalMemory_getIntDataAddr not implemented");
-  }
-  return 0;
+jlong
+frysk::testbed::LocalMemory::getDataAddr(jnixx::env&) {
+  return (jlong) &memory;
 }
 
-JNIEXPORT jlong
-Java_frysk_testbed_LocalMemory_getLongDataAddr (JNIEnv *env, jclass)
-{
-  jclass cls = env->FindClass("java/lang/RuntimeException");
-  if (cls != NULL) {
-    env->ThrowNew(cls, __FILE__ ":Java_frysk_testbed_LocalMemory_getLongDataAddr not implemented");
-  }
-  return 0;
+jbyteArray
+frysk::testbed::LocalMemory::getDataBytes(jnixx::env& env) {
+  return getBytes(env, &memory, sizeof(memory));
 }
 
-JNIEXPORT jbyteArray
-Java_frysk_testbed_LocalMemory_getBytes (JNIEnv *env, jclass, jlong, jint)
-{
-  jclass cls = env->FindClass("java/lang/RuntimeException");
-  if (cls != NULL) {
-    env->ThrowNew(cls, __FILE__ ":Java_frysk_testbed_LocalMemory_getBytes not implemented");
-  }
-  return 0;
-}
+/**
+ * Function used by getCode*(), must be on a single line for __LINE__
+ * to work correctly.
+ */
+jint frysk::testbed::LocalMemory::getCodeLine (jnixx::env&) { return __LINE__; }
 
-JNIEXPORT jlong
-Java_frysk_testbed_LocalMemory_getDataAddr (JNIEnv *env, jclass)
-{
-  jclass cls = env->FindClass("java/lang/RuntimeException");
-  if (cls != NULL) {
-    env->ThrowNew(cls, __FILE__ ":Java_frysk_testbed_LocalMemory_getDataAddr not implemented");
-  }
-  return 0;
+java::lang::String
+frysk::testbed::LocalMemory::getCodeFile(jnixx::env& env) {
+  return env.newStringUTF (__FILE__);
 }
 
-JNIEXPORT jlong
-Java_frysk_testbed_LocalMemory_getCodeAddr (JNIEnv *env, jclass)
-{
-  jclass cls = env->FindClass("java/lang/RuntimeException");
-  if (cls != NULL) {
-    env->ThrowNew(cls, __FILE__ ":Java_frysk_testbed_LocalMemory_getCodeAddr not implemented");
-  }
-  return 0;
+static void*
+codeAddr() {
+#ifdef __powerpc64__
+  return *((void**) frysk::testbed::LocalMemory::getCodeLine);
+#else
+  return (void*)&frysk::testbed::LocalMemory::getCodeLine;
+#endif
 }
-
-JNIEXPORT jint
-Java_frysk_testbed_LocalMemory_getCodeLine (JNIEnv *env, jclass)
-{
-  jclass cls = env->FindClass("java/lang/RuntimeException");
-  if (cls != NULL) {
-    env->ThrowNew(cls, __FILE__ ":Java_frysk_testbed_LocalMemory_getCodeLine not implemented");
-  }
-  return 0;
+jlong
+frysk::testbed::LocalMemory::getCodeAddr(jnixx::env&) {
+  return (jlong)codeAddr();
 }
 
-JNIEXPORT jstring
-Java_frysk_testbed_LocalMemory_getCodeFile (JNIEnv *env, jclass)
-{
-  jclass cls = env->FindClass("java/lang/RuntimeException");
-  if (cls != NULL) {
-    env->ThrowNew(cls, __FILE__ ":Java_frysk_testbed_LocalMemory_getCodeFile not implemented");
-  }
-  return 0;
+jbyteArray
+frysk::testbed::LocalMemory::getCodeBytes(jnixx::env& env) {
+  return getBytes(env, codeAddr(), sizeof(memory));
 }
 
-JNIEXPORT void
-Java_frysk_testbed_LocalMemory_constructStack (JNIEnv *env, jclass, jobject)
-{
-  jclass cls = env->FindClass("java/lang/RuntimeException");
-  if (cls != NULL) {
-    env->ThrowNew(cls, __FILE__ ":Java_frysk_testbed_LocalMemory_constructStack not implemented");
-  }
-  return;
+void
+frysk::testbed::LocalMemory::constructStack(jnixx::env& env,
+					    frysk::testbed::LocalMemory$StackBuilder builder) {
+  // Copy known data onto the stack.
+  uint8_t addr[sizeof(memory)];
+  memcpy(addr, &memory, sizeof(memory));
+  jbyteArray 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-07  5:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-07  5:36 [SCM] master: Implement jni/LocalMemory.cxx 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).