Skip to content

Commit b014f61

Browse files
authored
Merge pull request #18524 from theresa-m/lw5_latest
Update Valhalla tests to compile with lw5 head
2 parents 1ba18ac + a8dd71e commit b014f61

File tree

6 files changed

+39
-113
lines changed

6 files changed

+39
-113
lines changed

test/functional/Valhalla/build.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@
6363
<src path="${transformerListener}" />
6464
<compilerarg line='--add-exports java.base/jdk.internal.misc=ALL-UNNAMED --add-exports java.base/jdk.internal.value=ALL-UNNAMED' />
6565
<compilerarg line='--enable-preview -source 22'/>
66+
<!-- uncomment when running with lw5 -->
67+
<!--<compilerarg line='-XDenableNullRestrictedTypes' />-->
6668
<!-- Also remove this line when running lw5 -->
6769
<compilerarg line='-source 22 -XDenablePrimitiveClasses' />
6870
<classpath>

test/functional/Valhalla/src/org/openj9/test/lworld/ValhallaAttributeGenerator.java

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public static Class<?> generatePutStaticNullToNullRestrictedField(String classNa
120120
return generator.defineClass(className, classBytes, 0, classBytes.length);
121121
}
122122

123-
public static Class<?> generatePutFieldNullToNullRestrictedField(String className, String fieldClassName) {
123+
public static Class<?> generatePutFieldNullToField(String className, String fieldClassName, boolean nullRestrictedField) {
124124
String fieldName = "field";
125125

126126
/* Generate field class - value class with ImplicitCreation attribute and ACC_DEFAULT flag set. */
@@ -133,7 +133,9 @@ public static Class<?> generatePutFieldNullToNullRestrictedField(String classNam
133133

134134
/* instance field of previously generated field class with NullRestrictd attribute */
135135
FieldVisitor fieldVisitor = classWriter.visitField(ACC_PUBLIC, fieldName, fieldClass.descriptorString(), null, null);
136-
fieldVisitor.visitAttribute(new ValhallaUtils.NullRestrictedAttribute());
136+
if (nullRestrictedField) {
137+
fieldVisitor.visitAttribute(new ValhallaUtils.NullRestrictedAttribute());
138+
}
137139

138140
/* assign field to null in <init> */
139141
MethodVisitor mvInit = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
@@ -186,41 +188,6 @@ public static Class<?> generateNullRestrictedFieldWhereICHasNoDefaultFlag(boolea
186188
return generator.defineClass(className, classBytes, 0, classBytes.length);
187189
}
188190

189-
public static Class<?> generateWithFieldStoreNullToNullRestrictedField(String className, String fieldClassName) {
190-
String fieldName = "field";
191-
192-
/* Generate field class - value class with ImplicitCreation attribute and ACC_DEFAULT flag set. */
193-
byte[] fieldClassBytes = generateClass(fieldClassName, ACC_PUBLIC + ACC_FINAL + ValhallaUtils.ACC_VALUE_TYPE,
194-
new Attribute[] {new ValhallaUtils.ImplicitCreationAttribute(ValhallaUtils.ACC_DEFAULT)});
195-
Class<?> fieldClass = generator.defineClass(fieldClassName, fieldClassBytes, 0, fieldClassBytes.length);
196-
197-
ClassWriter classWriter = new ClassWriter(0);
198-
classWriter.visit(ValhallaUtils.CLASS_FILE_MAJOR_VERSION, ACC_PUBLIC + ValhallaUtils.ACC_IDENTITY, className, null, "java/lang/Object", null);
199-
200-
/* instance field of previously generated field class with NullRestrictd attribute */
201-
FieldVisitor fieldVisitor = classWriter.visitField(ACC_PUBLIC, fieldName, fieldClass.descriptorString(), null, null);
202-
fieldVisitor.visitAttribute(new ValhallaUtils.NullRestrictedAttribute());
203-
204-
MethodVisitor mvInit = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
205-
mvInit.visitCode();
206-
mvInit.visitVarInsn(ALOAD, 0);
207-
mvInit.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
208-
mvInit.visitVarInsn(ALOAD, 0);
209-
mvInit.visitTypeInsn(ValhallaUtils.ACONST_INIT, fieldClass.descriptorString());
210-
mvInit.visitFieldInsn(PUTFIELD, className, fieldName, fieldClass.descriptorString());
211-
mvInit.visitVarInsn(ALOAD, 0);
212-
mvInit.visitFieldInsn(GETFIELD, className, fieldName, fieldClass.descriptorString());
213-
mvInit.visitInsn(ACONST_NULL);
214-
mvInit.visitFieldInsn(ValhallaUtils.WITHFIELD, className, fieldName, fieldClass.descriptorString());
215-
mvInit.visitInsn(RETURN);
216-
mvInit.visitMaxs(2, 1);
217-
mvInit.visitEnd();
218-
219-
classWriter.visitEnd();
220-
byte[] classBytes = classWriter.toByteArray();
221-
return generator.defineClass(className, classBytes, 0, classBytes.length);
222-
}
223-
224191
public static Class<?> findLoadedTestClass(String name) {
225192
return generator.findLoadedClass(name);
226193
}

test/functional/Valhalla/src/org/openj9/test/lworld/ValhallaAttributeTests.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,18 @@ static public void testStaticNullRestrictedFieldWhereImplicitCreationHasNoDefaul
146146
c.newInstance();
147147
}
148148

149+
@Test
150+
static public void testPutFieldNullToValueTypeField() throws Throwable {
151+
Class<?> c = ValhallaAttributeGenerator.generatePutFieldNullToField("TestPutFieldNullToValueTypeField", "TestPutFieldNullToValueTypeFieldField", false);
152+
c.newInstance();
153+
}
154+
149155
static public Class<?> testPutFieldNullToNullRestrictedFieldClass = null;
150156
static public Class<?> testPutStaticNullToNullRestrictedFieldClass = null;
151-
static public Class<?> testWithFieldStoreNullToNullRestrictedFieldClass = null;
152157

153158
@Test(priority=1)
154159
static public void testCreateTestPutFieldNullToNullRestrictedField() throws Throwable {
155-
testPutFieldNullToNullRestrictedFieldClass = ValhallaAttributeGenerator.generatePutFieldNullToNullRestrictedField("TestPutFieldNullToNullRestrictedField", "TestPutFieldNullToNullRestrictedFieldField");
160+
testPutFieldNullToNullRestrictedFieldClass = ValhallaAttributeGenerator.generatePutFieldNullToField("TestPutFieldNullToNullRestrictedField", "TestPutFieldNullToNullRestrictedFieldField", true);
156161
}
157162

158163
/* Instance field with NullRestricted attribute cannot be set to null. */
@@ -191,14 +196,4 @@ static public void testPutStaticNullToNullRestrictedField() throws Throwable {
191196
}
192197
Assert.fail("Test expected a NullPointerException wrapped in ExceptionInInitializerError.");
193198
}
194-
195-
@Test(priority=1)
196-
static public void testCreateTestWithFieldStoreNullToNullRestrictedField() throws Throwable {
197-
testWithFieldStoreNullToNullRestrictedFieldClass = ValhallaAttributeGenerator.generateWithFieldStoreNullToNullRestrictedField("TestWithFieldStoreNullToNullRestrictedField", "TestWithFieldStoreNullToNullRestrictedFieldField");
198-
}
199-
200-
@Test(priority=2, invocationCount=2, expectedExceptions = java.lang.NullPointerException.class)
201-
static public void testWithFieldStoreNullToNullRestrictedField() throws Throwable {
202-
testWithFieldStoreNullToNullRestrictedFieldClass.newInstance();
203-
}
204199
}

test/functional/Valhalla/src/org/openj9/test/lworld/ValhallaUtils.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ public class ValhallaUtils {
3232
static final int CLASS_FILE_MAJOR_VERSION = 66;
3333

3434
/* workaround till the new ASM is released */
35-
static final int ACONST_INIT = 203;
36-
static final int WITHFIELD = 204;
3735
static final int ACC_IDENTITY = 0x20;
3836
static final int ACC_VALUE_TYPE = 0x040;
37+
38+
/* these can be removed with qtypes tests */
39+
static final int ACONST_INIT = 203;
40+
static final int WITHFIELD = 204;
3941
static final int ACC_PRIMITIVE = 0x800;
4042

4143
/* ImplicitCreation flags */

test/functional/Valhalla/src_lw5/org/openj9/test/lworld/ValueTypeGenerator.java

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,6 @@ private static byte[] generateClass(ClassConfiguration config) {
239239
/* make value classes eligble to be nullrestricted */
240240
cw.visitAttribute(new ValhallaUtils.ImplicitCreationAttribute());
241241
addTestCheckCastValueTypeOnNull(cw, className, fields);
242-
addTestCheckCastValueTypeOnNonNullType(cw, className, fields);
243242
if (null != fields) {
244243
makeValue(cw, className, makeValueSig, fields, makeMaxLocal);
245244
makeGeneric(cw, className, "makeValueGeneric", "makeValue", makeValueSig, makeValueGenericSig, fields, makeMaxLocal, isRef);
@@ -345,17 +344,6 @@ private static void addTestCheckCastRefClassOnNull(ClassWriter cw, String classN
345344
mv.visitEnd();
346345
}
347346

348-
// TODO remove use of aconst_init
349-
private static void addTestCheckCastValueTypeOnNonNullType(ClassWriter cw, String className, String[] fields) {
350-
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "testCheckCastValueTypeOnNonNullType", "()Ljava/lang/Object;", null, null);
351-
mv.visitCode();
352-
mv.visitTypeInsn(ValhallaUtils.ACONST_INIT, "L" + className + ";");
353-
mv.visitTypeInsn(CHECKCAST, className);
354-
mv.visitInsn(ARETURN);
355-
mv.visitMaxs(1, 2);
356-
mv.visitEnd();
357-
}
358-
359347
private static void addTestCheckCastValueTypeOnNull(ClassWriter cw, String className, String[] fields) {
360348
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "testCheckCastValueTypeOnNull", "()Ljava/lang/Object;", null, null);
361349
mv.visitCode();
@@ -376,12 +364,12 @@ private static void addTestCheckCastOnInvalidClass(ClassWriter cw) {
376364
mv.visitEnd();
377365
}
378366

379-
// TODO remove use of aconst_init and withfield
380367
private static void makeValue(ClassWriter cw, String valueName, String makeValueSig, String[] fields, int makeMaxLocal) {
381368
boolean doubleDetected = false;
382369
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "makeValue", "(" + makeValueSig + ")" + "L" + valueName + ";", null, null);
383370
mv.visitCode();
384-
mv.visitTypeInsn(ValhallaUtils.ACONST_INIT, "L" + valueName + ";");
371+
mv.visitVarInsn(ALOAD, 0);
372+
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
385373
for (int i = 0, count = 0; i < fields.length; i++) {
386374
String nameAndSig[] = fields[i].split(":");
387375
if ((nameAndSig.length < 3) || !(nameAndSig[2].equals("static"))) {
@@ -413,7 +401,7 @@ private static void makeValue(ClassWriter cw, String valueName, String makeValue
413401
count++;
414402
break;
415403
}
416-
mv.visitFieldInsn(ValhallaUtils.WITHFIELD, valueName, nameAndSig[0], nameAndSig[1]);
404+
mv.visitFieldInsn(PUTFIELD, valueName, nameAndSig[0], nameAndSig[1]);
417405
}
418406
}
419407
mv.visitInsn(ARETURN);
@@ -546,9 +534,11 @@ private static void testUnresolvedValueTypePutField(ClassWriter cw, String class
546534
private static void makeValueTypeDefaultValue(ClassWriter cw, String valueName, String makeValueSig, String[] fields, int makeMaxLocal, boolean isRef) {
547535
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "makeValueTypeDefaultValue", "()Ljava/lang/Object;", null, null);
548536
mv.visitCode();
549-
mv.visitTypeInsn(ValhallaUtils.ACONST_INIT, "L" + valueName + ";");
537+
mv.visitTypeInsn(NEW, valueName);
538+
mv.visitInsn(DUP);
539+
mv.visitMethodInsn(INVOKESPECIAL, valueName, "<init>", "()V", false);
550540
mv.visitInsn(ARETURN);
551-
mv.visitMaxs(1, 0);
541+
mv.visitMaxs(2, 1);
552542
mv.visitEnd();
553543
}
554544

0 commit comments

Comments
 (0)