Skip to content

Commit

Permalink
Merge pull request #10233 from tajila/vt8
Browse files Browse the repository at this point in the history
Fix static field cycle value tests
  • Loading branch information
llxia committed Jul 23, 2020
2 parents 3cc58b8 + 7902fb3 commit ca7feb9
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,16 @@ private static byte[] generateClass(String className, String[] fields, boolean i
}
fv = cw.visitField(fieldModifiers, nameAndSigValue[0], nameAndSigValue[1], null, null);
fv.visitEnd();
makeValueSig += nameAndSigValue[1];
makeValueGenericSig += "Ljava/lang/Object;";
if (nameAndSigValue[1].equals("J") || nameAndSigValue[1].equals("D")) {
makeMaxLocal += 2;
} else {
makeMaxLocal += 1;
if ((nameAndSigValue.length <= 2) || !nameAndSigValue[2].equals("static")) {
makeValueSig += nameAndSigValue[1];
makeValueGenericSig += "Ljava/lang/Object;";
if (nameAndSigValue[1].equals("J") || nameAndSigValue[1].equals("D")) {
makeMaxLocal += 2;
} else {
makeMaxLocal += 1;
}
}

generateFieldMethods(cw, nameAndSigValue, className, isVerifiable, isRef);
}

Expand Down Expand Up @@ -389,49 +392,51 @@ private static void makeGeneric(ClassWriter cw, String className, String methodN
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, methodName, "(" + makeValueGenericSig + ")Ljava/lang/Object;", null, new String[] {"java/lang/Exception"});
mv.visitCode();
for (int i = 0; i < fields.length; i++) {
mv.visitVarInsn(ALOAD, i);
String nameAndSigValue[] = fields[i].split(":");
switch (nameAndSigValue[1]) {
case "D":
mv.visitTypeInsn(CHECKCAST, "java/lang/Double");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D", false);
break;
case "I":
mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I", false);
break;
case "Z":
mv.visitTypeInsn(CHECKCAST, "java/lang/Boolean");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z", false);
break;
case "B":
mv.visitTypeInsn(CHECKCAST, "java/lang/Byte");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Byte", "byteValue", "()B", false);
break;
case "C":
mv.visitTypeInsn(CHECKCAST, "java/lang/Character");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Character", "charValue", "()C", false);
break;
case "S":
mv.visitTypeInsn(CHECKCAST, "java/lang/Short");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Short", "shortValue", "()S", false);
break;
case "F":
mv.visitTypeInsn(CHECKCAST, "java/lang/Float");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F", false);
break;
case "J":
mv.visitTypeInsn(CHECKCAST, "java/lang/Long");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J", false);
break;
default:
String signature = nameAndSigValue[1];

if ('L' == signature.charAt(0)) {
signature = signature.substring(1, signature.length() - 1);
if ((nameAndSigValue.length < 3) || !(nameAndSigValue[2].equals("static"))) {
mv.visitVarInsn(ALOAD, i);
switch (nameAndSigValue[1]) {
case "D":
mv.visitTypeInsn(CHECKCAST, "java/lang/Double");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D", false);
break;
case "I":
mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I", false);
break;
case "Z":
mv.visitTypeInsn(CHECKCAST, "java/lang/Boolean");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z", false);
break;
case "B":
mv.visitTypeInsn(CHECKCAST, "java/lang/Byte");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Byte", "byteValue", "()B", false);
break;
case "C":
mv.visitTypeInsn(CHECKCAST, "java/lang/Character");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Character", "charValue", "()C", false);
break;
case "S":
mv.visitTypeInsn(CHECKCAST, "java/lang/Short");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Short", "shortValue", "()S", false);
break;
case "F":
mv.visitTypeInsn(CHECKCAST, "java/lang/Float");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F", false);
break;
case "J":
mv.visitTypeInsn(CHECKCAST, "java/lang/Long");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J", false);
break;
default:
String signature = nameAndSigValue[1];

if ('L' == signature.charAt(0)) {
signature = signature.substring(1, signature.length() - 1);
}
mv.visitTypeInsn(CHECKCAST, signature);
break;
}
mv.visitTypeInsn(CHECKCAST, signature);
break;
}
}
mv.visitMethodInsn(INVOKESTATIC, className, specificMethodName, "(" + makeValueSig + ")" + getSigFromSimpleName(className, isRef), false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1871,8 +1871,11 @@ static public void testCyclicalStaticFieldDefaultValues1() throws Throwable {
Class cycleA1Class = ValueTypeGenerator.generateValueClass("CycleA1", cycleA1);
Class cycleB1Class = ValueTypeGenerator.generateValueClass("CycleB1", cycleB1);

cycleA1Class.newInstance();
cycleB1Class.newInstance();
MethodHandle makeCycleA1 = lookup.findStatic(cycleA1Class, "makeValueGeneric", MethodType.methodType(Object.class));
MethodHandle makeCycleB1 = lookup.findStatic(cycleB1Class, "makeValueGeneric", MethodType.methodType(Object.class));

makeCycleA1.invoke();
makeCycleB1.invoke();
}

@Test(priority=1)
Expand All @@ -1885,9 +1888,13 @@ static public void testCyclicalStaticFieldDefaultValues2() throws Throwable {
Class cycleB2Class = ValueTypeGenerator.generateValueClass("CycleB2", cycleB2);
Class cycleC2Class = ValueTypeGenerator.generateValueClass("CycleC2", cycleC2);

cycleA2Class.newInstance();
cycleB2Class.newInstance();
cycleC2Class.newInstance();
MethodHandle makeCycleA2 = lookup.findStatic(cycleA2Class, "makeValueGeneric", MethodType.methodType(Object.class));
MethodHandle makeCycleB2 = lookup.findStatic(cycleB2Class, "makeValueGeneric", MethodType.methodType(Object.class));
MethodHandle makeCycleC2 = lookup.findStatic(cycleB2Class, "makeValueGeneric", MethodType.methodType(Object.class));

makeCycleA2.invoke();
makeCycleB2.invoke();
makeCycleC2.invoke();
}

@Test(priority=1)
Expand All @@ -1896,7 +1903,9 @@ static public void testCyclicalStaticFieldDefaultValues3() throws Throwable {

Class cycleA3Class = ValueTypeGenerator.generateValueClass("CycleA3", cycleA3);

cycleA3Class.newInstance();
MethodHandle makeCycleA3 = lookup.findStatic(cycleA3Class, "makeValueGeneric", MethodType.methodType(Object.class));

makeCycleA3.invoke();
}

@Test(priority=4)
Expand Down

0 comments on commit ca7feb9

Please sign in to comment.