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:
parent
6a16a60c7e
commit
ba2d772668
|
@ -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);
|
||||||
|
|
|
@ -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;"));
|
||||||
|
|
Loading…
Reference in New Issue