-
Bug
-
Resolution: Fixed
-
Minor
-
None
It appears that varargs constructors don't work for enums. The following SandboxInterceptorTest test case demonstrates this:
@Test public void enumWithVarargs() throws Exception { String script = "enum Thing {\n" + " FIRST(\"The first thing\"),\n" + " String[] descriptions;\n" + " public Thing(String... descriptions) {\n" + " this.descriptions = descriptions;\n" + " }\n" + "}\n" + "Thing.values()[0].descriptions[0]\n"; String expected = "The first thing"; assertEvaluate(new GenericWhitelist(), expected, script); }
The result is:
org.junit.ComparisonFailure: Expected :The first thing Actual :T
It appears that something goes wrong when building the argument array, as the following testcase triggers an ArrayIndexOutOfBoundsException:
@Test public void enumWithStringAndVarargs() throws Exception { String script = "enum Thing {\n" + " FIRST(\"The first thing\"),\n" + " String description;\n" + " public Thing(String description, int... unused) {\n" + " this.description = description;\n" + " }\n" + "}\n" + "Thing.values()[0].description\n"; String expected = "The first thing"; assertEvaluate(new GenericWhitelist(), expected, script); }
- duplicates
-
JENKINS-33023 Enums are not supported in sandbox
-
- Reopened
-
- links to
If this is a duplicate of JENKINS-33023, then JENKINS-33023 should be re-opened. Enums with varargs constructors do not work on master as of 3d8b4045415ffe48289c79ac2905df3a424e94dc.
The fixes related to JENKINS-33023 made the varargs methods created for enum initialisation work, as long as the enum constructors themselves were not varargs ("public Thing(String... descriptions)"). If the constructors are varargs, the resulting methods still do not work. Just try adding the two test cases from the description to SandboxInterceptorTest and you'll see.