From fc01261a60ff3e7643ff663950020505a6d659d0 Mon Sep 17 00:00:00 2001 From: Kyle Galloway Date: Thu, 15 Feb 2007 14:49:50 +0000 Subject: [PATCH] natVMVirtualMachine (getFrames): Implement. 2007-02-15 Kyle Galloway * gnu/classpath/jdwp/natVMVirtualMachine (getFrames): Implement. From-SVN: r121997 --- libjava/ChangeLog | 4 + libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc | 46 ++++++++- .../libjava.jvmti/interp/getlocalvartable.h | 19 ++++ .../libjava.jvmti/interp/getlocalvartable.jar | Bin 0 -> 1370 bytes .../libjava.jvmti/interp/getlocalvartable.java | 63 ++++++++++++ .../libjava.jvmti/interp/getlocalvartable.out | 109 +++++++++++++++++++++ .../libjava.jvmti/interp/natgetlocalvartable.cc | 67 +++++++++++++ 7 files changed, 304 insertions(+), 4 deletions(-) create mode 100644 libjava/testsuite/libjava.jvmti/interp/getlocalvartable.h create mode 100644 libjava/testsuite/libjava.jvmti/interp/getlocalvartable.jar create mode 100644 libjava/testsuite/libjava.jvmti/interp/getlocalvartable.java create mode 100644 libjava/testsuite/libjava.jvmti/interp/getlocalvartable.out create mode 100644 libjava/testsuite/libjava.jvmti/interp/natgetlocalvartable.cc diff --git a/libjava/ChangeLog b/libjava/ChangeLog index efd3543..5862f8f 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,7 @@ +2007-02-15 Kyle Galloway + + * gnu/classpath/jdwp/natVMVirtualMachine (getFrames): Implement. + 2007-02-13 Keith Seitz * gnu/classpath/jdwp/natVMVirtualMachine.cc diff --git a/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc b/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc index d219f58..71aa674 100644 --- a/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc +++ b/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc @@ -486,11 +486,49 @@ getClassMethod (jclass klass, jlong id) } java::util::ArrayList * -gnu::classpath::jdwp::VMVirtualMachine::getFrames (MAYBE_UNUSED Thread *thread, - MAYBE_UNUSED jint start, - MAYBE_UNUSED jint length) +gnu::classpath::jdwp::VMVirtualMachine::getFrames (Thread *thread, jint start, + jint length) { - return NULL; + jint frame_count = getFrameCount (thread); + ::java::util::ArrayList *frame_list; + + // Calculate the max number of frames to be returned. + jint num_frames = frame_count - start; + + // Check if num_frames is valid. + if (num_frames < 0) + num_frames = 0; + + // Check if there are more than length frames left after start. + // If length ios -1 return all remaining frames. + if (length != -1 && num_frames > length) + num_frames = length; + + frame_list = new ::java::util::ArrayList (num_frames); + + _Jv_Frame *vm_frame = reinterpret_cast<_Jv_Frame *> (thread->frame); + + // Take start frames off the top of the stack + while (vm_frame != NULL && start > 0) + { + start--; + vm_frame = vm_frame->next; + } + + // Use as a counter for the number of frames returned. + num_frames = 0; + + while (vm_frame != NULL && (num_frames < length || length == -1)) + { + jlong frameId = reinterpret_cast (vm_frame); + + VMFrame *frame = getFrame (thread, frameId); + frame_list->add (frame); + vm_frame = vm_frame->next; + num_frames++; + } + + return frame_list; } gnu::classpath::jdwp::VMFrame * diff --git a/libjava/testsuite/libjava.jvmti/interp/getlocalvartable.h b/libjava/testsuite/libjava.jvmti/interp/getlocalvartable.h new file mode 100644 index 0000000..8d4cb3b --- /dev/null +++ b/libjava/testsuite/libjava.jvmti/interp/getlocalvartable.h @@ -0,0 +1,19 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ + +#ifndef __getlocalvartable__ +#define __getlocalvartable__ + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +JNIEXPORT jint JNICALL Java_getlocalvartable_do_1getlocalvartable_1tests (JNIEnv *env, jclass); + +#ifdef __cplusplus +} +#endif + +#endif /* __getlocalvartable__ */ diff --git a/libjava/testsuite/libjava.jvmti/interp/getlocalvartable.jar b/libjava/testsuite/libjava.jvmti/interp/getlocalvartable.jar new file mode 100644 index 0000000000000000000000000000000000000000..9fffb928d8fac6534bb52c54422b368f63c5bc33 GIT binary patch literal 1370 zcmWIWW@Zs#U|`^2xLW0F*0+M2ErpqZ;U6mlgBXJ-LwagSPJVJ?PFZ46Nn%n?s$OzV zVsUY32qy!xpxh-_5Du+iVR*s(f;l(jZJuzrfbI3T&9Bd@E%AGMA*YTz=K7o#nlrcU8Kc zpSd&B`1w7_=kM$P)$l*ylAGG^VV{%T+IJ3)JxX6|~mS=ZVBXY+&3(6yJ`gjm@(7fd;FUS>%_ z)2zjP*TY*ED`_(=%h?gAp25AO>uT1^c^m%;C#?C;dQF=BliRMbw-vk3SDF{U^vnMV4oVgQ+pV4* z;dqqRxa{2a=D8PFzjw*AfAxB05p&PHFEx!ZAAc4GdlXN5&6oF>?{l+rUa*x5+5bhp1+x%5O|*N!Dx1#Kywb?rP+@7S-b@Qt{& zY^(3;tII+!8d~)9UyfcDYQOEHwwlr8_Y*3e^&2JY{4(5T&k+t-J^i|RS7BMi{!<-E z8&20h2(kPr?bmC1HItnEAhKHk_UUHser{qs(p z@t5B6%qQzu&R?S^=RQt*W!#u~Pvd;t<}X~kjx)QRFn+P{0@Jyd`&e~^RDW1^D+NxP z89AlnimdvH$Y=3=@5|?%NIA!g;)uU(?HcFo1gtx3;e-jg%e%g+33@haoR&HPty z-2XEL05dBWFtaj%Gb@+@B{+eZ)z>w|QP1JpoVp#U>bfZ?s the original run () call so if + // num_frames = 1, the thread will have 2 frames, the original Thread.run + // call, plus one additional + public int num_frames, thread_num; + + public static int num_threads = 1; + + static + { + System.loadLibrary("natgetlocalvartable"); + } + + public double aMethod (float pone, float ptwo) + { + float fone, ftwo; + double done, dtwo; + + fone = pone; + ftwo = 2 * ptwo; + + done = 5 * fone; + dtwo = 6 * ftwo; + + return done + dtwo; + } + + public long bMethod (int ipone, int iptwo) + { + int ione, itwo; + long lone, ltwo; + + ione = ipone; + itwo = 5 * iptwo; + + lone = ione; + ltwo = 8 * itwo; + + return lone + ltwo; + } + + public Object cMethod (Object op) + { + Object oone, otwo; + oone = op; + otwo = oone; + oone = null; + + return otwo; + } + + public static native int do_getlocalvartable_tests (); + + public static void main (String[] args) + { + System.out.println ("JVMTI getlocalvartable Interpreted Test"); + + do_getlocalvartable_tests (); + } +} diff --git a/libjava/testsuite/libjava.jvmti/interp/getlocalvartable.out b/libjava/testsuite/libjava.jvmti/interp/getlocalvartable.out new file mode 100644 index 0000000..2e0ec40 --- /dev/null +++ b/libjava/testsuite/libjava.jvmti/interp/getlocalvartable.out @@ -0,0 +1,109 @@ +JVMTI getlocalvartable Interpreted Test +Slot: 0 + Name: this + Sig: Lgetlocalvartable; + Gen Sig: Lgetlocalvartable; + Start Loc: 0 + Length: 28 +Slot: 1 + Name: pone + Sig: F + Gen Sig: F + Start Loc: 0 + Length: 28 +Slot: 2 + Name: ptwo + Sig: F + Gen Sig: F + Start Loc: 0 + Length: 28 +Slot: 3 + Name: fone + Sig: F + Gen Sig: F + Start Loc: 2 + Length: 26 +Slot: 4 + Name: ftwo + Sig: F + Gen Sig: F + Start Loc: 7 + Length: 21 +Slot: 5 + Name: done + Sig: D + Gen Sig: D + Start Loc: 14 + Length: 14 +Slot: 7 + Name: dtwo + Sig: D + Gen Sig: D + Start Loc: 22 + Length: 6 +Slot: 0 + Name: this + Sig: Lgetlocalvartable; + Gen Sig: Lgetlocalvartable; + Start Loc: 0 + Length: 25 +Slot: 1 + Name: ipone + Sig: I + Gen Sig: I + Start Loc: 0 + Length: 25 +Slot: 2 + Name: iptwo + Sig: I + Gen Sig: I + Start Loc: 0 + Length: 25 +Slot: 3 + Name: ione + Sig: I + Gen Sig: I + Start Loc: 2 + Length: 23 +Slot: 4 + Name: itwo + Sig: I + Gen Sig: I + Start Loc: 7 + Length: 18 +Slot: 5 + Name: lone + Sig: J + Gen Sig: J + Start Loc: 11 + Length: 14 +Slot: 7 + Name: ltwo + Sig: J + Gen Sig: J + Start Loc: 19 + Length: 6 +Slot: 0 + Name: this + Sig: Lgetlocalvartable; + Gen Sig: Lgetlocalvartable; + Start Loc: 0 + Length: 8 +Slot: 1 + Name: op + Sig: Ljava/lang/Object; + Gen Sig: Ljava/lang/Object; + Start Loc: 0 + Length: 8 +Slot: 2 + Name: oone + Sig: Ljava/lang/Object; + Gen Sig: Ljava/lang/Object; + Start Loc: 2 + Length: 6 +Slot: 3 + Name: otwo + Sig: Ljava/lang/Object; + Gen Sig: Ljava/lang/Object; + Start Loc: 4 + Length: 4 diff --git a/libjava/testsuite/libjava.jvmti/interp/natgetlocalvartable.cc b/libjava/testsuite/libjava.jvmti/interp/natgetlocalvartable.cc new file mode 100644 index 0000000..3ca112d --- /dev/null +++ b/libjava/testsuite/libjava.jvmti/interp/natgetlocalvartable.cc @@ -0,0 +1,67 @@ +#include + +#include +#include +#include + +#include "getlocalvartable.h" + +JNIEXPORT jint JNICALL Java_getlocalvartable_do_1getlocalvartable_1tests +(JNIEnv *env, jclass klass) +{ + JavaVM *vm; + jint err = env->GetJavaVM (&vm); + if (err < 0) + { + fprintf (stderr, "error getting VM\n"); + exit (1); + } + + jvmtiEnv *jvmti = NULL; + vm->GetEnv ((void **) &jvmti, JVMTI_VERSION_1_0); + + if (jvmti == NULL) + { + fprintf (stderr, "error getting jvmti environment\n"); + exit (1); + } + + jint entrys; + jvmtiLocalVariableEntry *var_table; + + jvmtiError jerr; + + jmethodID meth_ids[3]; + + meth_ids[0] = env->GetMethodID (klass, "aMethod", "(FF)D"); + meth_ids[1] = env->GetMethodID (klass, "bMethod", "(II)J"); + meth_ids[2] = env->GetMethodID (klass, "cMethod", + "(Ljava/lang/Object;)Ljava/lang/Object;"); + for (int i = 0; i < 3; i++) + { + jerr = jvmti->GetLocalVariableTable (meth_ids[i], &entrys, &var_table); + if (jerr != JVMTI_ERROR_NONE) + { + char *error_name; + jvmti->GetErrorName (jerr, &error_name); + fprintf (stderr, "JVMTI Error: %s\n", error_name); + jvmti->Deallocate (reinterpret_cast (error_name)); + } + else + { + for (int j = 0; j < entrys; j++) + { + printf ("Slot: %d\n", static_cast (var_table[j].slot)); + printf (" Name: %s\n", var_table[j].name); + printf (" Sig: %s\n", var_table[j].signature); + printf (" Gen Sig: %s\n", var_table[j].generic_signature); + printf (" Start Loc: %ld\n", static_cast (var_table[j].start_location)); + printf (" Length: %d\n", static_cast (var_table[j].length)); + } + + jvmti->Deallocate (reinterpret_cast (var_table)); + } + } + + return 0; +} -- 2.7.4