23
23
24
24
/*
25
25
* @test
26
- * @bug 8155643 8268125 8270461
26
+ * @bug 8155643 8268125 8270461 8270098
27
27
* @summary Test Object.clone() intrinsic.
28
+ * @modules java.base/java.lang:+open
28
29
*
29
30
* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-ReduceInitialCardMarks
30
31
* -XX:CompileCommand=compileonly,compiler.arraycopy.TestObjectArrayClone::testClone*
32
+ * -XX:CompileCommand=compileonly,jdk.internal.reflect.GeneratedMethodAccessor*::invoke
31
33
* compiler.arraycopy.TestObjectArrayClone
32
34
* @run main/othervm -XX:CompileCommand=compileonly,compiler.arraycopy.TestObjectArrayClone::testClone*
35
+ * -XX:CompileCommand=compileonly,jdk.internal.reflect.GeneratedMethodAccessor*::invoke
33
36
* compiler.arraycopy.TestObjectArrayClone
34
37
* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedClassPointers -Xmx128m
35
38
* -XX:CompileCommand=compileonly,compiler.arraycopy.TestObjectArrayClone::testClone*
39
+ * -XX:CompileCommand=compileonly,jdk.internal.reflect.GeneratedMethodAccessor*::invoke
40
+ * compiler.arraycopy.TestObjectArrayClone
41
+ * @run main/othervm -Xbatch -XX:-UseTypeProfile
42
+ * -XX:CompileCommand=compileonly,compiler.arraycopy.TestObjectArrayClone::testClone*
43
+ * -XX:CompileCommand=compileonly,jdk.internal.reflect.GeneratedMethodAccessor*::invoke
36
44
* compiler.arraycopy.TestObjectArrayClone
37
45
*/
38
46
39
47
package compiler .arraycopy ;
40
48
49
+ import java .lang .invoke .*;
50
+ import java .lang .reflect .InvocationTargetException ;
51
+ import java .lang .reflect .Method ;
52
+
41
53
class Payload implements Cloneable {
42
54
boolean b ;
43
55
int i ;
@@ -59,7 +71,7 @@ public Payload(boolean b, int i, char c, String str, short s, int i2) {
59
71
public Payload clonep () {
60
72
try {
61
73
return (Payload ) super .clone ();
62
- } catch (CloneNotSupportedException e ) {
74
+ } catch (CloneNotSupportedException e ) {
63
75
return null ;
64
76
}
65
77
}
@@ -136,6 +148,17 @@ public static String[] testCloneShortObjectArray() {
136
148
return arr .clone ();
137
149
}
138
150
151
+ public static String [] testCloneShortObjectArray2 (Method clone ) throws Exception {
152
+ String [] arr = new String [5 ];
153
+ arr [0 ] = str1 ;
154
+ arr [1 ] = str2 ;
155
+ arr [2 ] = str3 ;
156
+ arr [3 ] = str4 ;
157
+ arr [4 ] = str5 ;
158
+ escape_arr = arr ;
159
+ return (String []) testCloneObject (clone , arr );
160
+ }
161
+
139
162
public static String [] testCloneShortObjectArrayCopy () {
140
163
String [] arr = new String [5 ];
141
164
arr [0 ] = str1 ;
@@ -161,7 +184,14 @@ public static Object testCloneOop2(Payload2 p) {
161
184
return p .clonep ();
162
185
}
163
186
164
- public static void main (String [] args ) {
187
+ public static Object testCloneObject (Method clone , Object obj ) throws Exception {
188
+ return clone .invoke (obj );
189
+ }
190
+
191
+ public static void main (String [] args ) throws Exception {
192
+ Method clone = Object .class .getDeclaredMethod ("clone" );
193
+ clone .setAccessible (true );
194
+
165
195
String [] arr1 = new String [42 ];
166
196
for (int j = 0 ; j < arr1 .length ; j ++) {
167
197
arr1 [j ] = new String (Integer .toString (j ));
@@ -178,13 +208,30 @@ public static void main(String[] args) {
178
208
verifyStr (arr1 , arr2 );
179
209
}
180
210
211
+ for (int i = 0 ; i < 50_000 ; i ++) {
212
+ for (int j = 0 ; j < arr1 .length ; j ++) {
213
+ arr1 [j ] = new String (Integer .toString (j ));
214
+ }
215
+ String [] arr2 = (String []) testCloneObject (clone , arr1 );
216
+ verifyStr (arr1 , arr2 );
217
+ String [] arr3 = (String []) testCloneObject (clone , arr1 );
218
+ verifyStr (arr1 , arr3 );
219
+ String [] arr4 = (String []) testCloneObject (clone , arr1 );
220
+ verifyStr (arr1 , arr4 );
221
+ verifyStr (arr1 , arr3 );
222
+ verifyStr (arr1 , arr2 );
223
+ }
224
+
181
225
for (int i = 0 ; i < 50_000 ; i ++) {
182
226
String [] value = testCloneShortObjectArray ();
183
227
verifyStr (value , escape_arr );
184
228
String [] value2 = testCloneShortObjectArray ();
185
229
verifyStr (value2 , escape_arr );
186
230
String [] value3 = testCloneShortObjectArray ();
187
231
verifyStr (value3 , escape_arr );
232
+ String [] value4 = testCloneShortObjectArray2 (clone );
233
+ verifyStr (value4 , escape_arr );
234
+ verifyStr (value , value4 );
188
235
verifyStr (value , value3 );
189
236
verifyStr (value , value2 );
190
237
}
@@ -211,8 +258,21 @@ public static void main(String[] args) {
211
258
verifyStr (value , value2 );
212
259
}
213
260
261
+ int [] arr2 = new int [42 ];
262
+ for (int i = 0 ; i < arr2 .length ; i ++) {
263
+ arr2 [i ] = i ;
264
+ }
214
265
for (int i = 0 ; i < 50_000 ; i ++) {
215
- testClonePrimitiveArray (new int [42 ]);
266
+ int [] res1 = testClonePrimitiveArray (arr2 );
267
+ int [] res2 = (int [])testCloneObject (clone , arr2 );
268
+ for (int j = 0 ; j < arr2 .length ; j ++) {
269
+ if (res1 [j ] != j ) {
270
+ throw new RuntimeException ("Unexpected result: " + res1 [j ] + " != " + j );
271
+ }
272
+ if (res2 [j ] != j ) {
273
+ throw new RuntimeException ("Unexpected result: " + res2 [j ] + " != " + j );
274
+ }
275
+ }
216
276
}
217
277
218
278
Payload ref = new Payload (false , -1 , 'c' , str1 , (short ) 5 , -1 );
@@ -227,6 +287,17 @@ public static void main(String[] args) {
227
287
verifyPayload (p1 , p3 );
228
288
}
229
289
290
+ for (int i = 0 ; i < 50_000 ; i ++) {
291
+ Payload p1 = (Payload ) testCloneObject (clone , ref );
292
+ verifyPayload (ref , p1 );
293
+ Payload p2 = (Payload ) testCloneObject (clone , ref );
294
+ verifyPayload (ref , p2 );
295
+ Payload p3 = (Payload ) testCloneObject (clone , ref );
296
+ verifyPayload (ref , p3 );
297
+ verifyPayload (p2 , p3 );
298
+ verifyPayload (p1 , p3 );
299
+ }
300
+
230
301
Payload2 ref2 = new Payload2 (false , -1 , 'c' , str1 , (short ) 5 , -1 , false , 0 , 'k' , str2 , (short )-1 , 0 );
231
302
for (int i = 0 ; i < 50_000 ; i ++) {
232
303
Payload2 p1 = (Payload2 ) testCloneOop2 (ref2 );
@@ -238,6 +309,17 @@ public static void main(String[] args) {
238
309
verifyPayload2 (p2 , p3 );
239
310
verifyPayload2 (p1 , p3 );
240
311
}
312
+
313
+ for (int i = 0 ; i < 50_000 ; i ++) {
314
+ Payload2 p1 = (Payload2 ) testCloneObject (clone , ref2 );
315
+ verifyPayload2 (ref2 , p1 );
316
+ Payload2 p2 = (Payload2 ) testCloneObject (clone , ref2 );
317
+ verifyPayload2 (ref2 , p2 );
318
+ Payload2 p3 = (Payload2 ) testCloneObject (clone , ref2 );
319
+ verifyPayload2 (ref2 , p3 );
320
+ verifyPayload2 (p2 , p3 );
321
+ verifyPayload2 (p1 , p3 );
322
+ }
241
323
}
242
324
243
325
public static void verifyPayload (Payload p1 , Payload p2 ) {
@@ -323,7 +405,6 @@ public static void verifyStr(String[] arr1, String[] arr2) {
323
405
if (!arr1 [i ].equals (arr2 [i ])) {
324
406
throw new RuntimeException ("Fail cloned element content not the same" );
325
407
}
326
-
327
408
}
328
409
}
329
410
}
0 commit comments