Fix a VerifyError bug in Painless (#21765)

This bug would cause a VerifyError when scripts using the === operator
were comparing a def type against a primitive type since the primitive
type wasn't being appropriately boxed.
This commit is contained in:
Jack Conradson 2016-11-23 13:57:14 -08:00 committed by GitHub
parent 6a16a60c7e
commit ba2d772668
2 changed files with 18 additions and 14 deletions

View File

@ -148,13 +148,8 @@ public final class EComp extends AExpression {
"[" + left.actual.name + "] and [" + right.actual.name + "].")); "[" + left.actual.name + "] and [" + right.actual.name + "]."));
} }
if (promotedType.sort == Sort.DEF) { left.expected = promotedType;
left.expected = left.actual; right.expected = promotedType;
right.expected = right.actual;
} else {
left.expected = promotedType;
right.expected = promotedType;
}
left = left.cast(variables); left = left.cast(variables);
right = right.cast(variables); right = right.cast(variables);
@ -246,13 +241,8 @@ public final class EComp extends AExpression {
"[" + left.actual.name + "] and [" + right.actual.name + "].")); "[" + left.actual.name + "] and [" + right.actual.name + "]."));
} }
if (promotedType.sort == Sort.DEF) { left.expected = promotedType;
left.expected = left.actual; right.expected = promotedType;
right.expected = right.actual;
} else {
left.expected = promotedType;
right.expected = promotedType;
}
left = left.cast(variables); left = left.cast(variables);
right = right.cast(variables); right = right.cast(variables);

View File

@ -129,6 +129,13 @@ public class EqualsTests extends ScriptTestCase {
assertEquals(0, exec("def a = 1; Object b = new HashMap(); if (a === (Object)b) return 1; else return 0;")); assertEquals(0, exec("def a = 1; Object b = new HashMap(); if (a === (Object)b) return 1; else return 0;"));
} }
public void testBranchEqualsDefAndPrimitive() {
assertEquals(true, exec("def x = 1000; int y = 1000; return x == y;"));
assertEquals(false, exec("def x = 1000; int y = 1000; return x === y;"));
assertEquals(true, exec("def x = 1000; int y = 1000; return y == x;"));
assertEquals(false, exec("def x = 1000; int y = 1000; return y === x;"));
}
public void testBranchNotEquals() { public void testBranchNotEquals() {
assertEquals(1, exec("def a = (char)'a'; def b = (char)'b'; if (a != b) return 1; else return 0;")); assertEquals(1, exec("def a = (char)'a'; def b = (char)'b'; if (a != b) return 1; else return 0;"));
assertEquals(0, exec("def a = (char)'a'; def b = (char)'a'; if (a != b) return 1; else return 0;")); assertEquals(0, exec("def a = (char)'a'; def b = (char)'a'; if (a != b) return 1; else return 0;"));
@ -139,6 +146,13 @@ public class EqualsTests extends ScriptTestCase {
assertEquals(1, exec("def a = 1; Object b = new HashMap(); if (a !== (Object)b) return 1; else return 0;")); assertEquals(1, exec("def a = 1; Object b = new HashMap(); if (a !== (Object)b) return 1; else return 0;"));
} }
public void testBranchNotEqualsDefAndPrimitive() {
assertEquals(false, exec("def x = 1000; int y = 1000; return x != y;"));
assertEquals(true, exec("def x = 1000; int y = 1000; return x !== y;"));
assertEquals(false, exec("def x = 1000; int y = 1000; return y != x;"));
assertEquals(true, exec("def x = 1000; int y = 1000; return y !== x;"));
}
public void testRightHandNull() { public void testRightHandNull() {
assertEquals(false, exec("HashMap a = new HashMap(); return a == null;")); assertEquals(false, exec("HashMap a = new HashMap(); return a == null;"));
assertEquals(false, exec("HashMap a = new HashMap(); return a === null;")); assertEquals(false, exec("HashMap a = new HashMap(); return a === null;"));