test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetLocalVariable/getlocal003/getlocal003.cpp

Print this page

        

@@ -19,30 +19,26 @@
  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
 
-/*
- */
-
 #include <stdio.h>
 #include <string.h>
 #include "jvmti.h"
 #include "jni_tools.h"
 #include "agent_common.h"
 #include "JVMTITools.h"
 
 extern "C" {
 
 
-#define PASSED 0
+#define STATUS_PASSED 0
 #define STATUS_FAILED 2
 
 static jvmtiEnv *jvmti = NULL;
-static jvmtiCapabilities caps;
 static jvmtiEventCallbacks callbacks;
-static jint result = PASSED;
+static jint result = STATUS_PASSED;
 static jboolean printdump = JNI_FALSE;
 static jmethodID mid = NULL;
 static jvmtiLocalVariableEntry *table = NULL;
 static jint entryCount = 0;
 static jint methodExitCnt = -1;

@@ -52,73 +48,116 @@
   printf(", start_bci: %" LL "d", lvt_elem->start_location);
   printf(", end_bci: %" LL "d",   lvt_elem->start_location + lvt_elem->length);
   printf(", signature: %s\n", lvt_elem->signature);
 }
 
-void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env,
-        jthread thr, jmethodID method,
-        jboolean was_poped_by_exception, jvalue return_value) {
+static void
+test_locals(jvmtiEnv *jvmti, jthread thr, jlocation location) {
     jvmtiError err;
-    jint i;
-    jmethodID frame_method;
-    jlocation location;
     jint intVal;
+    jlong longVal;
     jfloat floatVal;
     jdouble doubleVal;
     jobject obj;
+    jint i;
 
-    if (mid == method) {
-
-        err = jvmti_env->GetFrameLocation(thr, 0,
-                                             &frame_method, &location);
-        if (err != JVMTI_ERROR_NONE) {
-            printf("\t failure: %s (%d)\n", TranslateError(err), err);
-            result = STATUS_FAILED;
-            return;
-        }
-        if (frame_method != method) {
-            printf("\t failure: GetFrameLocation returned wrong jmethodID\n");
-            result = STATUS_FAILED;
-            return;
-        }
-
-        printf("\n MethodExit: BEGIN %d, Current frame bci: %" LL "d\n\n",
-                ++methodExitCnt, location);
         for (i = 0; i < entryCount; i++) {
             if (table[i].start_location > location ||
                 table[i].start_location + table[i].length < location) {
                 continue;  /* The local variable is not visible */
             }
             print_LocalVariableEntry(&table[i]);
+        char sig = table[i].signature[0];
 
+        if (sig == 'Z' || sig == 'B' || sig == 'C' || sig == 'S') {
+            sig = 'I'; // covered by GetLocalInt
+        }
             err = jvmti->GetLocalInt(thr, 0, table[i].slot, &intVal);
             printf(" GetLocalInt:     %s (%d)\n", TranslateError(err), err);
-            if (err != JVMTI_ERROR_NONE && table[i].signature[0] == 'I') {
+        if (err != JVMTI_ERROR_NONE && sig == 'I') {
+            printf("FAIL: GetLocalInt failed to get value of int\n");
+            result = STATUS_FAILED;
+        } else if (err != JVMTI_ERROR_TYPE_MISMATCH && sig != 'I') {
+            printf("FAIL: GetLocalInt did not return JVMTI_ERROR_TYPE_MISMATCH for non-int\n");
+            result = STATUS_FAILED;
+        }
+
+        err = jvmti->GetLocalLong(thr, 0, table[i].slot, &longVal);
+        printf(" GetLocalLong:    %s (%d)\n", TranslateError(err), err);
+        if (err != JVMTI_ERROR_NONE && sig == 'J') {
+            printf("FAIL: GetLocalLong failed to get value of long\n");
+            result = STATUS_FAILED;
+        } else if (err != JVMTI_ERROR_TYPE_MISMATCH && sig != 'J') {
+            printf("FAIL: GetLocalLong did not return JVMTI_ERROR_TYPE_MISMATCH for non-long\n");
                 result = STATUS_FAILED;
             }
 
             err = jvmti->GetLocalFloat(thr, 0, table[i].slot, &floatVal);
             printf(" GetLocalFloat:   %s (%d)\n", TranslateError(err), err);
             if (err != JVMTI_ERROR_NONE && table[i].signature[0] == 'F') {
+            printf("FAIL: GetLocalFloat failed to get value of float\n");
+            result = STATUS_FAILED;
+        } else if (err != JVMTI_ERROR_TYPE_MISMATCH && table[i].signature[0] != 'F') {
+            printf("FAIL: GetLocalFloat did not return JVMTI_ERROR_TYPE_MISMATCH for non-float\n");
                 result = STATUS_FAILED;
             }
 
             err = jvmti->GetLocalDouble(thr, 0, table[i].slot, &doubleVal);
             printf(" GetLocalDouble:  %s (%d)\n", TranslateError(err), err);
             if (err != JVMTI_ERROR_NONE && table[i].signature[0] == 'D') {
+            printf("FAIL: GetLocalDouble failed to get value of double\n");
+            result = STATUS_FAILED;
+        } else if (err != JVMTI_ERROR_TYPE_MISMATCH && table[i].signature[0] != 'D') {
+            printf("FAIL: GetLocalDouble did not return JVMTI_ERROR_TYPE_MISMATCH for non-double\n");
                 result = STATUS_FAILED;
             }
 
             err = jvmti->GetLocalObject(thr, 0, table[i].slot, &obj);
             printf(" GetLocalObject:  %s (%d)\n", TranslateError(err), err);
             if (err != JVMTI_ERROR_NONE && table[i].signature[0] == 'L') {
+            printf("FAIL: GetLocalObject failed to get value of object\n");
+            result = STATUS_FAILED;
+        } else if (err != JVMTI_ERROR_TYPE_MISMATCH && table[i].signature[0] != 'L') {
+            printf("FAIL: GetLocalObject did not return JVMTI_ERROR_TYPE_MISMATCH for non-object\n");
+            result = STATUS_FAILED;
+        }
+    }
+}
+
+static void JNICALL
+MethodExit(jvmtiEnv *jvmti_env,
+           JNIEnv *env,
+           jthread thr,
+           jmethodID method,
+           jboolean was_poped_by_exception,
+           jvalue return_value) {
+
+    jvmtiError err;
+    jlocation location;
+    jmethodID frame_method = NULL;
+
+    if (mid != method) {
+        return;
+    }
+    err = jvmti->GetFrameLocation(thr, 0, &frame_method, &location);
+    if (err != JVMTI_ERROR_NONE) {
+        printf("\t failure: %s (%d)\n", TranslateError(err), err);
                 result = STATUS_FAILED;
+        return;
             }
+    if (frame_method != method) {
+        printf("\t failure: GetFrameLocation returned wrong jmethodID\n");
+        result = STATUS_FAILED;
+        return;
         }
+
+    printf("\n MethodExit: BEGIN %d\n",  ++methodExitCnt);
+
+    test_locals(jvmti, thr, location); 
+
         printf("\n MethodExit: END %d\n\n", methodExitCnt);
         fflush(stdout);
-    }
 }
 
 #ifdef STATIC_BUILD
 JNIEXPORT jint JNICALL Agent_OnLoad_getlocal003(JavaVM *jvm, char *options, void *reserved) {
     return Agent_Initialize(jvm, options, reserved);

@@ -131,10 +170,11 @@
 }
 #endif
 jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
     jint res;
     jvmtiError err;
+    static jvmtiCapabilities caps;
 
     if (options != NULL && strcmp(options, "printdump") == 0) {
         printdump = JNI_TRUE;
     }
 

@@ -165,22 +205,23 @@
         return JNI_ERR;
     }
 
     if (!caps.can_access_local_variables) {
         printf("Warning: Access to local variables is not implemented\n");
-    } else if (caps.can_generate_method_exit_events) {
+        return JNI_ERR;
+    }
+    if (!caps.can_generate_method_exit_events) {
+        printf("Warning: MethodExit event is not implemented\n");
+        return JNI_ERR;
+    }
         callbacks.MethodExit = &MethodExit;
         err = jvmti->SetEventCallbacks(&callbacks, sizeof(callbacks));
         if (err != JVMTI_ERROR_NONE) {
             printf("(SetEventCallbacks) unexpected error: %s (%d)\n",
                    TranslateError(err), err);
             return JNI_ERR;
         }
-    } else {
-        printf("Warning: MethodExit event is not implemented\n");
-    }
-
     return JNI_OK;
 }
 
 JNIEXPORT void JNICALL
 Java_nsk_jvmti_unit_GetLocalVariable_getlocal003_getMeth(JNIEnv *env, jclass cls) {

@@ -190,13 +231,10 @@
         printf("JVMTI client was not properly loaded!\n");
         result = STATUS_FAILED;
         return;
     }
 
-    if (!caps.can_access_local_variables ||
-        !caps.can_generate_method_exit_events) return;
-
     mid = env->GetStaticMethodID(cls, "staticMeth", "(I)I");
     if (mid == NULL) {
         printf("Cannot find Method ID for staticMeth\n");
         result = STATUS_FAILED;
         return;

@@ -208,12 +246,11 @@
                    TranslateError(err), err);
             result = STATUS_FAILED;
             return;
     }
 
-    err = jvmti->SetEventNotificationMode(JVMTI_ENABLE,
-        JVMTI_EVENT_METHOD_EXIT, NULL);
+    err = jvmti->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_METHOD_EXIT, NULL);
     if (err != JVMTI_ERROR_NONE) {
         printf("Failed to enable metod exit event: %s (%d)\n",
                TranslateError(err), err);
         result = STATUS_FAILED;
     }

@@ -230,12 +267,15 @@
     jint locVar;
     jint i, j;
     int  overlap = 0;
 
     if (jvmti == NULL) {
+        printf("JVMTI client was not properly loaded!\n");
+        result = STATUS_FAILED;
         return;
     }
+    printf("\n checkLoc: START\n");
 
     mid = env->GetStaticMethodID(cls, "staticMeth", "(I)I");
     if (mid == NULL) {
         printf("Cannot find Method ID for staticMeth\n");
         result = STATUS_FAILED;

@@ -253,24 +293,26 @@
     for (i = 0; i < entryCount; i++) {
         print_LocalVariableEntry(&table[i]);
 
         err = jvmti->GetLocalInt(thr, 1, table[i].slot, &locVar);
 
-        printf(" GetLocalInt: %s (%d)\n", TranslateError(err), err);
         if (strcmp(table[i].name, "intArg") == 0) {
             if (err != JVMTI_ERROR_NONE) {
+                printf(" GetLocalInt: %s (%d)\n", TranslateError(err), err);
                printf(" failure: JVMTI_ERROR_NONE is expected\n");
                result = STATUS_FAILED;
             }
         }
         else if (strcmp(table[i].name, "pi") == 0) {
             if (err != JVMTI_ERROR_TYPE_MISMATCH) {
+                printf(" GetLocalInt: %s (%d)\n", TranslateError(err), err);
                printf(" failure: JVMTI_ERROR_TYPE_MISMATCH is expected\n");
                result = STATUS_FAILED;
             }
         } else {
             if (err != JVMTI_ERROR_INVALID_SLOT) {
+                printf(" GetLocalInt: %s (%d)\n", TranslateError(err), err);
                 printf(" failure: JVMTI_ERROR_INVALID_SLOT is expected\n");
                 result = STATUS_FAILED;
             }
         }
         if (table[i].slot != 2) {

@@ -288,20 +330,21 @@
                table[j].start_location > table[i].start_location + table[i].length
            ) {
                continue; /* Everything is Ok */
            }
 
-           printf(" failure: locations of vars with slot #2 are overlaped:\n");
+           printf(" failure: locations of vars with slot #2 are overlapped:\n");
            print_LocalVariableEntry(&table[i]);
            print_LocalVariableEntry(&table[j]);
            overlap++;
            result = STATUS_FAILED;
         }
     }
     if (!overlap) {
-        printf("\n Succes: locations of vars with slot #2 are NOT overlaped\n\n");
+        printf("\n Success: locations of vars with slot #2 are NOT overlapped\n");
     }
+    printf("\n checkLoc: END\n\n");
     fflush(stdout);
 }
 
 JNIEXPORT jint JNICALL
 Java_nsk_jvmti_unit_GetLocalVariable_getlocal003_getRes(JNIEnv *env, jclass cls) {