11/*
2- * Copyright (c) 2003, 2018 , Oracle and/or its affiliates. All rights reserved.
2+ * Copyright (c) 2003, 2023 , Oracle and/or its affiliates. All rights reserved.
33 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44 *
55 * This code is free software; you can redistribute it and/or modify it
@@ -33,69 +33,25 @@ extern "C" {
3333#define PASSED 0
3434#define STATUS_FAILED 2
3535
36- typedef struct {
37- const char *name;
38- const char *sig;
39- } fld_info;
40-
41- typedef struct {
42- const char *name;
43- jint fcount;
44- fld_info *flds;
45- } class_info;
46-
4736static jvmtiEnv *jvmti = NULL ;
4837static jint result = PASSED;
49- static jboolean printdump = JNI_FALSE;
50-
51- static fld_info f0[] = {
52- { " fld_1" , " Ljava/lang/String;" }
53- };
54-
55- static fld_info f1[] = {
56- { " fld_n1" , " I" }
57- };
58-
59- static fld_info f2[] = {
60- { " fld_n2" , " I" }
61- };
62-
63- static fld_info f4[] = {
64- { " fld_o2" , " I" }
65- };
66-
67- static fld_info f5[] = {
68- { " fld_o3" , " I" }
69- };
70-
71- static fld_info f6[] = {
72- { " fld_i1" , " I" }
73- };
74-
75- static fld_info f7[] = {
76- { " fld_i2" , " I" }
77- };
78-
79- static fld_info f8 [] = {
80- { " fld_i2" , " I" }
81- };
82-
83- static fld_info f9[] = {
84- { " fld_i1" , " I" }
85- };
86-
87- static class_info classes[] = {
88- { " InnerClass1" , 1 , f0 },
89- { " InnerInterface" , 1 , f1 },
90- { " InnerClass2" , 1 , f2 },
91- { " OuterClass1" , 0 , NULL },
92- { " OuterClass2" , 1 , f4 },
93- { " OuterClass3" , 1 , f5 },
94- { " OuterInterface1" , 1 , f6 },
95- { " OuterInterface2" , 1 , f7 },
96- { " OuterClass4" , 1 , f8 },
97- { " OuterClass5" , 1 , f9 }
98- };
38+
39+
40+ // compares 'value' with jobject_arr[index]
41+ static bool equals_str (JNIEnv *env, const char *value, jobjectArray jobject_arr, jint index) {
42+ jstring jstr = (jstring)env->GetObjectArrayElement (jobject_arr, index);
43+ const char * utf = env->GetStringUTFChars (jstr, NULL );
44+ bool res = false ;
45+ if (utf != NULL ) {
46+ res = strcmp (value, utf) == 0 ;
47+ env->ReleaseStringUTFChars (jstr, utf);
48+ } else {
49+ printf (" GetStringUTFChars failed\n " );
50+ result = STATUS_FAILED;
51+ }
52+ env->DeleteLocalRef (jstr);
53+ return res;
54+ }
9955
10056#ifdef STATIC_BUILD
10157JNIEXPORT jint JNICALL Agent_OnLoad_getclfld007 (JavaVM *jvm, char *options, void *reserved) {
@@ -111,10 +67,6 @@ JNIEXPORT jint JNI_OnLoad_getclfld007(JavaVM *jvm, char *options, void *reserved
11167jint Agent_Initialize (JavaVM *jvm, char *options, void *reserved) {
11268 jint res;
11369
114- if (options != NULL && strcmp (options, " printdump" ) == 0 ) {
115- printdump = JNI_TRUE;
116- }
117-
11870 res = jvm->GetEnv ((void **) &jvmti, JVMTI_VERSION_1_1);
11971 if (res != JNI_OK || jvmti == NULL ) {
12072 printf (" Wrong result of a valid call to GetEnv!\n " );
@@ -125,61 +77,62 @@ jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
12577}
12678
12779JNIEXPORT void JNICALL
128- Java_nsk_jvmti_GetClassFields_getclfld007_check (JNIEnv *env, jclass cls, jint i, jclass clazz ) {
80+ Java_nsk_jvmti_GetClassFields_getclfld007_check (JNIEnv *env, jclass cls, jclass clazz, jobjectArray fieldArr ) {
12981 jvmtiError err;
13082 jint fcount;
13183 jfieldID *fields;
132- char *name, *sig, *generic ;
84+ char *name, *sig;
13385 int j;
13486
13587 if (jvmti == NULL ) {
13688 printf (" JVMTI client was not properly loaded!\n " );
89+ fflush (0 );
13790 result = STATUS_FAILED;
13891 return ;
13992 }
14093
141- if (printdump == JNI_TRUE) {
142- printf (" >>> %s:\n " , classes[i].name );
143- }
94+ // fieldArr contains 2 elements for each field
95+ jint field_count = env->GetArrayLength (fieldArr) / 2 ;
14496
14597 err = jvmti->GetClassFields (clazz, &fcount, &fields);
14698 if (err != JVMTI_ERROR_NONE) {
147- printf (" (GetClassFields#%d) unexpected error: %s (%d)\n " ,
148- i, TranslateError (err), err);
99+ printf (" GetClassFields unexpected error: %s (%d)\n " ,
100+ TranslateError (err), err);
101+ fflush (0 );
149102 result = STATUS_FAILED;
150103 return ;
151104 }
152105
153- if (fcount != classes[i]. fcount ) {
154- printf (" (%d) wrong number of fields: %d, expected: %d\n " ,
155- i, fcount, classes[i]. fcount );
106+ if (fcount != field_count ) {
107+ printf (" wrong number of fields: %d, expected: %d\n " ,
108+ fcount, field_count );
156109 result = STATUS_FAILED;
157110 }
158111 for (j = 0 ; j < fcount; j++) {
159112 if (fields[j] == NULL ) {
160- printf (" (%d:%d) fieldID = null\n " , i, j);
161- } else {
162- err = jvmti->GetFieldName (clazz, fields[j],
163- &name, &sig, &generic);
164- if (err != JVMTI_ERROR_NONE) {
165- printf (" (GetFieldName#%d:%d) unexpected error: %s (%d)\n " ,
166- i, j, TranslateError (err), err);
167- } else {
168- if (printdump == JNI_TRUE) {
169- printf (" >>> [%d]: %s, sig = \" %s\"\n " , j, name, sig);
170- }
171- if ((j < classes[i].fcount ) &&
172- (name == NULL || sig == NULL ||
173- strcmp (name, classes[i].flds [j].name ) != 0 ||
174- strcmp (sig, classes[i].flds [j].sig ) != 0 )) {
175- printf (" (%d:%d) wrong field: \" %s%s\" " , i, j, name, sig);
176- printf (" , expected: \" %s%s\"\n " ,
177- classes[i].flds [j].name , classes[i].flds [j].sig );
178- result = STATUS_FAILED;
179- }
180- }
113+ printf (" (%d) fieldID = null\n " , j);
114+ result = STATUS_FAILED;
115+ continue ;
116+ }
117+ err = jvmti->GetFieldName (clazz, fields[j], &name, &sig, NULL );
118+ if (err != JVMTI_ERROR_NONE) {
119+ printf (" (GetFieldName#%d) unexpected error: %s (%d)\n " ,
120+ j, TranslateError (err), err);
121+ result = STATUS_FAILED;
122+ continue ;
123+ }
124+ printf (" >>> [%d]: %s, sig = \" %s\"\n " , j, name, sig);
125+ if ((j < field_count) &&
126+ (name == NULL || sig == NULL ||
127+ !equals_str (env, name, fieldArr, j * 2 ) ||
128+ !equals_str (env, sig, fieldArr, j * 2 + 1 ))) {
129+ printf (" (%d) wrong field: \" %s%s\" " , j, name, sig);
130+ result = STATUS_FAILED;
181131 }
132+ jvmti->Deallocate ((unsigned char *)name);
133+ jvmti->Deallocate ((unsigned char *)sig);
182134 }
135+ fflush (0 );
183136}
184137
185138JNIEXPORT int JNICALL
0 commit comments