RFR: 8238080: FXMLLoader: if script engines implement javax.script.Compilable compile scripts [v3]

Kevin Rushforth kcr at openjdk.java.net
Fri Jun 19 00:06:51 UTC 2020

On Thu, 4 Jun 2020 15:44:49 GMT, Rony G. Flatscher <github.com+60214806+ronyfla at openjdk.org> wrote:

>> This PR adds a "compile" process instruction to FXML files with the optional PI data "true" (default) and "false". The
>> PI data is turned into a boolean value using "Boolean.parseBoolean(String)".
>> This makes it possible to inject the compile PI everywhere in a FXML file and turn on and off compilation of scripts if
>> the scripting engine implements the javax.script.Compilable interface. The PR adds the ability for a fallback in case
>> compilation of scripts fails, in which case a warning gets issued about this fact and evaluation of the script will be
>> done without compilation. Because of the fallback scripts get compiled with this version by default.
>> ---------
>> ### Progress
>> - [x] Change must not contain extraneous whitespace
>> - [x] Commit message must refer to an issue
>> - [ ] Change must be properly reviewed
>> ### Issue
>>  * [JDK-8238080](https://bugs.openjdk.java.net/browse/JDK-8238080): FXMLLoader: if script engines implement
>>    javax.script.Compilable compile scripts
>> ### Download
>> `$ git fetch https://git.openjdk.java.net/jfx pull/192/head:pull/192`
>> `$ git checkout pull/192`
> Rony G. Flatscher has updated the pull request with a new target base due to a merge or a rebase. The pull request now
> contains 27 commits:
>  - Updates to meet Kevin's comment in PR 192 as of May 27th.
>  - Merge remote-tracking branch 'upstream/master' into scriptCompilablePIcompileFallback
>  - Reword the compile processing instructions (replace 'Hint' with 'Note:', adjust text to context), remove spurious empty
>    line in script example code.
>  - Document the compile processing instruction for scripts.
>  - Add missing language processing instruction.
>  - Correct typo, replace tabs, remove trailing blanks.
>  - Make sure we test the default behaviour to compile script by leaving out the compile PI.
>  - Revert temporary rename of test method.
>  - Correct ModuleLauncherTest (remove non-existing test), correct formatting.
>  - Always supply the script's filename in the error message first to further ease spotting the location of script
>    exceptions.
>  - ... and 17 more: https://git.openjdk.java.net/jfx/compare/6bd0e22d...7ef1bd68

I reviewed the implementation, and I think this is close to being ready, but I have a couple questions. I also still
need to review the test and run it, but that will be later.

I also noticed a few places with minor formatting issues -- mostly missing spaces and extra blank lines added to some
files, but also `else {` when it should be `} else {`. I'll wait until the substantive part of the review is done to
note them all (so if you can fix them ahead of time, that would be good).

modules/javafx.fxml/src/main/java/javafx/fxml/FXMLLoader.java line 1571:

> 1570:                         StringBuilder sb = new StringBuilder();
> 1571:                         char[] charBuffer = new char[4096];
> 1572:                         int n;

Since you use the constant `4096` in three places (although it will be two once you fix the below bug), I recommend to
either define a `final int` constant or else to use `charBuffer.length` as the size.

modules/javafx.fxml/src/main/java/javafx/fxml/FXMLLoader.java line 1578:

> 1577:                           }
> 1578:                         } while (n == 4096);
> 1579:                         script = sb.toString();

You can't assume that you are done if `Reader::read` returns less than what you asked for. You need to keep reading
`while (n >= 0)`.

modules/javafx.fxml/src/main/java/javafx/fxml/FXMLLoader.java line 1769:

> 1768:             try {
> 1769:                 if (isCompiled) {
> 1770:                    compiledScript.eval(localBindings);

I think there may be other places you need to set isCompiled (it isn't set in the first couple of methods where you
compile scripts). Can you check this?


PR: https://git.openjdk.java.net/jfx/pull/192

More information about the openjfx-dev mailing list