Serious bug: "finally" block is run whenever "continue" is reached
Tal Liron
tal.liron at threecrickets.com
Sun Mar 8 13:55:36 UTC 2015
This was very hard to discover, but it is real and easy to reproduce.
Try running this program:
var finalies = 1
var line = 'TEST THIS LINE'
try {
while ('' !== (line = line.substring(0, line.length - 1))) {
if (line.length % 2 == 0) {
continue
}
java.lang.System.out.println(line)
}
}
catch (x) {
java.lang.System.out.println(x)
}
finally {
java.lang.System.out.println('Finalies ' + (finalies++))
}
If you run this code, you'll see that the "finally" block is run every
time "continue" is reached, and then the while loop continues after the
"finally" block is run. Of course, the "finally" block should only be
called once in this example, and the while loop should not continue, and
this broken behavior can lead to serious problems.
(I added the "catch" block only to make sure that exceptions are not
thrown, and indeed they are not. Sorry about the silly functionality of
the program, but it's the result of trying to wrap my head around what
was going on...)
Or maybe I'm crazy and am missing something trivial? The same code runs
in Rhino without this problem.
The bug appears in the 8u40 release. :(
-Tal
More information about the nashorn-dev
mailing list