From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21568 invoked by alias); 7 May 2008 05:36:26 -0000 Received: (qmail 21543 invoked by uid 367); 7 May 2008 05:36:25 -0000 Date: Wed, 07 May 2008 05:36:00 -0000 Message-ID: <20080507053625.21528.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Implement jni/LocalMemory.cxx. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 263254a7939cf7db35ef7d85cc781e88bca232b0 X-Git-Newrev: 12cea45ad5e923dce81131eab960b85d65eeb690 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q2/txt/msg00192.txt.bz2 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 Date: Wed May 7 01:35:28 2008 -0400 Implement jni/LocalMemory.cxx. frysk-sys/frysk/jnixx/ChangeLog 2008-05-07 Andrew Cagney * 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 * 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 + * 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 + + * jni/LocalMemory.cxx: Implement. + 2008-05-06 Andrew Cagney * 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 +#include +#include +#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