From 941f8eba47ef266bdf49ccb30c756c2d8bcaca31 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Thu, 22 Aug 2019 13:38:56 -0700 Subject: [PATCH] Fix bugs in Painless SCatch node --- .../elasticsearch/painless/node/SCatch.java | 6 ++- .../elasticsearch/painless/TryCatchTests.java | 43 +++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/node/SCatch.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/node/SCatch.java index 0ddb54e4b1d76..82363c4bc92b7 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/node/SCatch.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/node/SCatch.java @@ -56,7 +56,9 @@ public SCatch(Location location, String type, String name, SBlock block) { @Override void storeSettings(CompilerSettings settings) { - block.storeSettings(settings); + if (block != null) { + block.storeSettings(settings); + } } @Override @@ -115,7 +117,7 @@ void write(MethodWriter writer, Globals globals) { writer.visitTryCatchBlock(begin, end, jump, MethodWriter.getType(variable.clazz).getInternalName()); - if (exception != null && !block.allEscape) { + if (exception != null && (block == null || !block.allEscape)) { writer.goTo(exception); } } diff --git a/modules/lang-painless/src/test/java/org/elasticsearch/painless/TryCatchTests.java b/modules/lang-painless/src/test/java/org/elasticsearch/painless/TryCatchTests.java index 2e6aa80b3e46b..2b4dd54e0150f 100644 --- a/modules/lang-painless/src/test/java/org/elasticsearch/painless/TryCatchTests.java +++ b/modules/lang-painless/src/test/java/org/elasticsearch/painless/TryCatchTests.java @@ -55,4 +55,47 @@ public void testNoCatch() { }); assertEquals("test", exception.getMessage()); } + + public void testNoCatchBlock() { + assertEquals(0, exec("try { return Integer.parseInt('f') } catch (NumberFormatException nfe) {} return 0;")); + + assertEquals(0, exec("try { return Integer.parseInt('f') } " + + "catch (NumberFormatException nfe) {}" + + "catch (Exception e) {}" + + " return 0;")); + + assertEquals(0, exec("try { throw new IllegalArgumentException('test') } " + + "catch (NumberFormatException nfe) {}" + + "catch (Exception e) {}" + + " return 0;")); + + assertEquals(0, exec("try { throw new IllegalArgumentException('test') } " + + "catch (NumberFormatException nfe) {}" + + "catch (IllegalArgumentException iae) {}" + + "catch (Exception e) {}" + + " return 0;")); + } + + public void testMultiCatch() { + assertEquals(1, exec( + "try { return Integer.parseInt('f') } " + + "catch (NumberFormatException nfe) {return 1;} " + + "catch (ArrayIndexOutOfBoundsException aioobe) {return 2;} " + + "catch (Exception e) {return 3;}" + )); + + assertEquals(2, exec( + "try { return new int[] {}[0] } " + + "catch (NumberFormatException nfe) {return 1;} " + + "catch (ArrayIndexOutOfBoundsException aioobe) {return 2;} " + + "catch (Exception e) {return 3;}" + )); + + assertEquals(3, exec( + "try { throw new IllegalArgumentException('test'); } " + + "catch (NumberFormatException nfe) {return 1;} " + + "catch (ArrayIndexOutOfBoundsException aioobe) {return 2;} " + + "catch (Exception e) {return 3;}" + )); + } }