Hi Kevin,

what should be the next steps?

Should I remove "WIP" from the title in 
<https://github.com/openjdk/jfx/pull/192> and add the CSR
draft text of my last e-mail as a "CSR" comment with PR # 192, thereby 
requesting it to be added to
<https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8238080>?

Please advise.

TIA,

---rony

P.S.: This is the RFE:

  * RFE (2020-01-24): 
<https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8238080>

These are the three versions (all with appropriate unit tests) that I came up 
with chronologically
to implement the RFE, would prefer the latest version (PR # 192):

  * Compile if Compilable implemented (2020-02-28): 
<https://github.com/openjdk/jfx/pull/129>
  * Compile if compile PI and Compilable is implemented (2020-04-11):
    <https://github.com/openjdk/jfx/pull/187>
  * Compile with fallback, if Compilable is implemented, compile PI for 
fine-grained control
    (2020-04-14): <https://github.com/openjdk/jfx/pull/192>


On 22.04.2020 20:01, Rony G. Flatscher wrote:
> Hi Kevin,
>
> as I am not able to file a CSR with the issue you suggested to come up with a 
> draft, so here it goes:
>
>     Summary
>     =======
>     Have javafx.fxml.FXMLLoader compile FXML scripts before evaluating them, 
> if the script engine
>     implements the javax.script.Compilable interface to speed up execution. 
> In case compilation
>     throws a javax.script.ScriptException fall back to evaluating the 
> uncompiled script. Allow
>     control of script compilation with a "compile" PI for FXML files.
>
>     Problem
>     =======
>     javafx.fxml.FXMLLoader is able to execute scripts in Java script languages
>     (javax.script.ScriptEngine implementations) referred to or embedded in a 
> FXML file.
>
>     If a script engine implements the javax.script.Compilable interface, then 
> such scripts could be
>     compiled and the resulting javax.script.CompiledScript could be executed 
> instead using its
>     eval() methods.
>
>     Evaluating the javax.script.CompiledScript objects may help speed up the 
> execution of script
>     invocations, especially for scripts defined for event attributes in FXML 
> elements (e.g. like
>     onMouseMove) which may be repetitively invoked and evaluated.
>
>     Solution 
>     ========
>     Before evaluating the script code test whether the 
> javax.script.ScriptEngine implements
>     javax.script.Compilable. If so, compile the script to a 
> javax.script.CompiledScript object first
>     and then use its eval() method to evaluate the script, otherwise continue 
> to use the
>     javax.script.ScriptEngine's eval() method instead. Should compilation of 
> a script yield
>     (unexpectedly) a javax.script.ScriptException then fall back to using the
>     javax.script.ScriptEngine's eval() method. A new process instruction 
> "compile" allows control of
>     the compilation of scripts ("true" sets compilation on, "false" to set 
> compilation off) in FXML
>     files.
>
>     Specification
>     =============
>     If a javax.script.ScriptEngine implements the javax.script.Compilable 
> interface, then use its
>     compile() method to compile the script to a javax.script.CompiledScript 
> object and use its
>     eval() method to run the script. In the case that the compilation throws 
> (unexpectedly) a
>     javax.script.ScriptException log a warning and fall back to using the
>     javax.script.ScriptEngine's eval() method instead.
>     To allow setting this feature off and on while processing the FXML file a 
> "compile" process
>     instruction ("<?compile false?>" or "<?compile true?>") gets defined that 
> allows to turn
>     compilation off and on throughout a FXML file.
>
> Having never seen a real CSR I hope that this matches what is expected and is 
> helpful for
> assessment. If not please advise (got the name of these fields from [1]).
>
> ---
>
> Also added brief information about the respective test units (what they test 
> and yield) in the WIP  [2].
>
> ---rony
>
> [1] "CSR-FAQ": <https://wiki.openjdk.java.net/display/csr/CSR+FAQs>
>
> [2] "WIP: Script compilable+compile PI+fallback: 8238080: FXMLLoader: if 
> script engines implement
> javax.script.Compilable compile scripts #192":  
> <https://github.com/openjdk/jfx/pull/192>
>
>
> On 20.04.2020 14:58, Rony G. Flatscher wrote:
>> There is a new WIP at <https://github.com/openjdk/jfx/pull/192>:
>>
>>     This WIP 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. It
>>     extends PR 187 #187.
>>
>>     To further ease spotting scripts that cause a ScriptException a message 
>> in the form of
>>     "filename: caused ScriptException" gets added to the exception handling 
>> in either of the three
>>     locations: an error message, a stack trace or a wrap-up into a 
>> RuntimeException (having three
>>     different kinds of reporting ScriptExceptions may be questioned, however 
>> none of these tear down
>>     the FXML GUI).
>>
>> This WIP comes with proper test units as well. As per Kevin's suggestion a 
>> warning gets logged
>> whenever a script cannot be compiled and the fallback gets used.
>>
>> It is suggested to use this WIP as it includes the compilation by default 
>> with a safe fallback to
>> evaluate the uncompiled script, if compilation (unexpectedly) fails.
>>
>> Again, any feedback, discussion welcome!
>>
>> ---rony
>>
>> P.S.: In the log history there is a commit message "Make message more 
>> pregnant.", it should have
>> read "Make messages more terse." instead|.||
>> |
>>
>>
>> On 17.04.2020 19:37, Rony G. Flatscher wrote:
>>> There is a new WIP at <https://github.com/openjdk/jfx/pull/187> which adds 
>>> a compile PI (process
>>> instruction) for turning on and off script compilation if the script engine 
>>> implements the
>>> Compilable interface.
>>>
>>> By default compilation is off (no compilation), such that one needs to add 
>>> a compile PI
>>> ("<?compile?>") at the top to activate this feature. Supplying "true" 
>>> (default) or "false" as the PI
>>> data turns this feature on and off.
>>>
>>> The WIP comes with adapted test units that test "compile on" for an entire 
>>> fxml file, "compile off",
>>> alternating using "compile on and off", and alternating using "compile off 
>>> and on". This will test
>>> all variants of applying the compile PI for all categories of scripts.
>>>
>>> Any feedback appreciated!
>>>
>>> ---rony
>>>
>>> P.S.: FXML files that contain unknown PIs do not cause a runtime error by 
>>> FXMLLoader, they just get
>>> ignored. Therefore one could apply the compile PI to FXML files that are 
>>> used in older JavaFX runtimes.
>>>
>>> P.P.S.: In the next days I will also add Kevin's idea in a separate version 
>>> that will have a
>>> fallback solution in case a compilation is (unexpectedly) not successful, 
>>> reverting to
>>> (interpretative) evaluation/execution of the script. In that version it is 
>>> planned to have
>>> compilation on by default as in the case of a compilation failure there 
>>> will be a safe backup solution.
>>>
>>>
>>> On 14.04.2020 19:52, Kevin Rushforth wrote:
>>>> Yes, I agree that enough time has gone by. Go ahead with your proposal. I 
>>>> would wait a bit to
>>>> create the CSR until the review is far enough along to know which 
>>>> direction we intend to go.
>>>>
>>>> Unless there is a real concern about possible regressions if scripts are 
>>>> compiled by default, I
>>>> think "enabled by default" is the way to go. Your argument that such 
>>>> script engines are broken
>>>> seems reasonable, since this only applies to script engines that implement 
>>>> javax.script.Compilable
>>>> in the first place. We still might want to add way to turn compilation off 
>>>> for individual scripts.
>>>> One other thing to consider is that if compilation fails, it might make 
>>>> sense to log a warning and
>>>> fall back to the existing interpreted mode.
>>>>
>>>> Does anyone else have any concerns with this?
>>>>
>>>> -- Kevin
>>>>
>>>>
>>>> On 4/14/2020 9:48 AM, Rony G. Flatscher wrote:
>>>>> Hi there,
>>>>>
>>>>> as there was probably enough time that has passed by I would intend to 
>>>>> create a CSR in the next days
>>>>> with the PR as per Kevin's suggestion.
>>>>>
>>>>> (For the case that this feature should not be active by default, the CSR 
>>>>> will suggest to define a
>>>>> new "compile" PI in the form <?compile [true|false] ?> (default, if no PI 
>>>>> data given: true), which
>>>>> is independent of the existence of a language PI (this way it becomes 
>>>>> also possible to allow
>>>>> compilation of external scripts denoted with the script-element, which do 
>>>>> not need a page language
>>>>> to be set as the file's extension allows the appropriate script engine to 
>>>>> be loaded and used for
>>>>> execution). A compile-PI would allow for turning compilation of scripts 
>>>>> on by just adding the PI
>>>>> <?compile?> or <?compile true?>  to FXML files (and <?compile false?> to 
>>>>> turn off), which seems to
>>>>> be simple and self-documentary. In general employing such compile PIs 
>>>>> allows for setting compilation
>>>>> of scripts on and off throughout an FXML file.)
>>>>>
>>>>> ---rony
>>>>>
>>>>>
>>>>> On 04.04.2020 18:03, Rony G. Flatscher wrote:
>>>>>
>>>>>> Hi Kevin,
>>>>>>
>>>>>> On 03.04.2020 01:21, Kevin Rushforth wrote:
>>>>>>> I see that you updated the PR and sent it for review.
>>>>>>>
>>>>>>> Before we formally review it in the PR, let's finish the discussion as 
>>>>>>> to whether this is a useful
>>>>>>> feature, and if so, what form this feature should take.
>>>>>>>
>>>>>>>  From my point of view, this does seem like a useful feature. Would 
>>>>>>> other users of FXML benefit
>>>>>>> from it?
>>>>>> Script code should be executed faster after compilation, so any FXML 
>>>>>> page that hosts script code
>>>>>> may
>>>>>> benefit.
>>>>>>
>>>>>> The benefits depend on the type of script (and maybe its size and its 
>>>>>> complexity) and also on the
>>>>>> types of event handlers the scripts serve, e.g. move or drag event 
>>>>>> handlers may benefit
>>>>>> significantly. This is because repeated invocation of compiled script 
>>>>>> event handlers do not cause
>>>>>> the reparsing of that script's source and interpreting it on each 
>>>>>> invocation, which may be
>>>>>> expensive
>>>>>> depending on the script engine, but rather allows the immediate 
>>>>>> evaluation/execution of the
>>>>>> compiled
>>>>>> script by the script engine.
>>>>>>
>>>>>>> I'm not certain whether we want it to be implicit, compiling the script 
>>>>>>> if the script engine in
>>>>>>> question implements Compilable, or via a new keyword or tag. What are 
>>>>>>> the pros / cons?
>>>>>> In principle there are three possibilities:
>>>>>>
>>>>>>      1) If a script engine implements javax.script.Compilable, compile 
>>>>>> the script and execute the
>>>>>>      compiled version. In the case of event handlers compile and buffer 
>>>>>> the compiled script and
>>>>>>      execute the compiled script each time its registered event fires.
>>>>>>
>>>>>>        o Pro: immediately benefits all existing FXML pages that host 
>>>>>> scripts
>>>>>>        o Con: it is theoretically possible (albeit quite unlikely) that 
>>>>>> there are scripts that fail
>>>>>>          compiling but have been employed successfully in interpreted 
>>>>>> mode
>>>>>>
>>>>>>      2) Introduce some form of an optional attribute (e.g. 
>>>>>> "compile={true|false}") to the FXML
>>>>>>      language PI that switches on compilation of scripts hosted in FXML 
>>>>>> definitions if the script
>>>>>>      engine implements the javax.script.Compilable interface. If missing 
>>>>>> it would default to
>>>>>> "false".
>>>>>>      (Alternatively, add a "compile" PI, that if present causes the 
>>>>>> compilation of scripts, if the
>>>>>>      script engine supports it. It would be an error if the "compile" PI 
>>>>>> was present, but the
>>>>>>      "language" PI was not.)
>>>>>>
>>>>>>        o Pro: compilation of FXML hosted scripts is done only, if the 
>>>>>> FXML definition of the
>>>>>> language
>>>>>>          PI gets changed
>>>>>>        o Con: benefit not made available automatically to existing FXML 
>>>>>> pages that host scripts
>>>>>>
>>>>>>      3) Another possibility would be to define a boolean 
>>>>>> attribute/property "compile" for script
>>>>>> and
>>>>>>      node elements and only compile the scripts, if the property is set 
>>>>>> to true
>>>>>>
>>>>>>        o Pro: compilation of FXML hosted scripts is done only, if the 
>>>>>> FXML definition gets changed
>>>>>>          accordingly
>>>>>>        o Con: potential benefit not made available automatically to 
>>>>>> existing FXML pages that
>>>>>> host scripts
>>>>>>
>>>>>> 2 and 3 could be combined, where 2 would define the default compilation 
>>>>>> behavior that then could be
>>>>>> overruled individually by 3.
>>>>>>
>>>>>> The question would be whether 2 or/and 3 are really necessary as it can 
>>>>>> be expected that
>>>>>> compilation
>>>>>> of scripts by the script engines would find the same errors as while 
>>>>>> interpreting the very same
>>>>>> scripts (if not, the script engine is badly broken and it could be 
>>>>>> argued that then the
>>>>>> interpretation part of the script engine might be expected to be broken 
>>>>>> as well which would be
>>>>>> quite
>>>>>> dangerous from an integrity POV; the same consideration applies as well 
>>>>>> if the execution of the
>>>>>> compiled script would behave differently to interpreting the very same 
>>>>>> script by the same script
>>>>>> engine).
>>>>>>
>>>>>> The current WIP implements 1 above and includes an appropriate test unit.
>>>>>>
>>>>>>> What do others think?
>>>>>>> In either case, we would need to make sure that this doesn't present 
>>>>>>> any security concerns in the
>>>>>>> presence of a security manager. As long as a user-provided class is on 
>>>>>>> the stack, it will be fine,
>>>>>>> but we would need to ensure that.
>>>>>> The compilation of scripts needs to be done by the Java script engines 
>>>>>> (implementing both,
>>>>>> javax.script.Engine and javax.script.Compilable) as well as controlling 
>>>>>> the execution of compiled
>>>>>> scripts ([javax.script.CompiledScript]
>>>>>> (https://docs.oracle.com/en/java/javase/14/docs/api/java.scripting/javax/script/CompiledScript.html)).
>>>>>>
>>>>>>
>>>>>> ---rony
>>>>>>
>>>>>>
>>>>>>
>>>>>>> On 4/2/2020 10:41 AM, Rony G. Flatscher wrote:
>>>>>>>> After merging master, applying some fixes and changing the title to 
>>>>>>>> reflect the change from
>>>>>>>> WIP to a
>>>>>>>> pull request I would kindly request a review of this pull request!
>>>>>>>>
>>>>>>>> Here the URL: <https://github.com/openjdk/jfx/pull/129>, title changed 
>>>>>>>> to: "8238080:
>>>>>>>> FXMLLoader: if
>>>>>>>> script engines implement javax.script.Compilable compile scripts".
>>>>>>>>
>>>>>>>> ---rony
>>>>>>>>
>>>>>>>>
>>>>>>>> On 28.02.2020 19:22, Rony G. Flatscher wrote:
>>>>>>>>> Here is a WIP [1] implementation of [2]. The WIP is based on [3], 
>>>>>>>>> which is currently in
>>>>>>>>> review, and
>>>>>>>>> has an appropriate test unit going with it as well, please review.
>>>>>>>>>
>>>>>>>>> There should be no compatibility issue with this implementation.
>>>>>>>>>
>>>>>>>>> Discussion: another solution could be to not compile by default. 
>>>>>>>>> Rather compile, if some new
>>>>>>>>> information is present with the FXML file which cannot possibly be 
>>>>>>>>> present in existing FXML
>>>>>>>>> files.
>>>>>>>>> In this scenario one possible and probably simple solution would be 
>>>>>>>>> to only compile scripts
>>>>>>>>> if the
>>>>>>>>> language process instruction (e.g. <?language rexx?>) contains an 
>>>>>>>>> appropriate attribute with a
>>>>>>>>> value
>>>>>>>>> indicating that compilation should be carried out (e.g.: 
>>>>>>>>> compile="true"). This way only FXML
>>>>>>>>> with
>>>>>>>>> PIs having this attribute set to true would be affected. If desired I 
>>>>>>>>> could try to come up
>>>>>>>>> with a
>>>>>>>>> respective solution as well.
>>>>>>>>>
>>>>>>>>> ---rony
>>>>>>>>>
>>>>>>>>> [1] "Implementation and test unit": 
>>>>>>>>> <https://github.com/openjdk/jfx/pull/129>
>>>>>>>>>
>>>>>>>>> [2] "JDK-8238080 : FXMLLoader: if script engines implement 
>>>>>>>>> javax.script.Compilable compile
>>>>>>>>> scripts":
>>>>>>>>> <https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8238080>
>>>>>>>>>
>>>>>>>>> [3] "8234959: FXMLLoader does not populate ENGINE_SCOPE Bindings with 
>>>>>>>>> FILENAME and ARGV":
>>>>>>>>> <https://github.com/openjdk/jfx/pull/122/commits>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 24.01.2020 16:26, Kevin Rushforth wrote:
>>>>>>>>>
>>>>>>>>>> Thank you for filing this enhancement request. As an enhancement it 
>>>>>>>>>> should be discussed on this
>>>>>>>>>> list before proceeding with a pull request (although a "WIP" or 
>>>>>>>>>> Draft PR can be used to
>>>>>>>>>> illustrate
>>>>>>>>>> the concept).
>>>>>>>>>>
>>>>>>>>>> For my part, this seems like a reasonable enhancement, as long as 
>>>>>>>>>> there are no compatibility
>>>>>>>>>> issues, but it would be good to hear from application developers who 
>>>>>>>>>> heavily use FXML.
>>>>>>>>>>
>>>>>>>>>> -- Kevin
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On 1/24/2020 7:21 AM, Rony G. Flatscher wrote:
>>>>>>>>>>> Just filed a RFE with the following information:
>>>>>>>>>>>
>>>>>>>>>>>      * Component:
>>>>>>>>>>>          o JavaFX
>>>>>>>>>>>
>>>>>>>>>>>      * Subcomponent:
>>>>>>>>>>>          o fxml: JavaFX FXML
>>>>>>>>>>>
>>>>>>>>>>>      * Synopsis:
>>>>>>>>>>>          o "FXMLLoader: if script engines implement 
>>>>>>>>>>> javax.script.Compilabel compile scripts"
>>>>>>>>>>>
>>>>>>>>>>>      * Descriptions:
>>>>>>>>>>>          o "FXMLLoader is able to execute scripts in Java script 
>>>>>>>>>>> languages
>>>>>>>>>>> (javax.script.ScriptEngine
>>>>>>>>>>>            implementations) if such a Java script language gets 
>>>>>>>>>>> defined as the controller
>>>>>>>>>>> language in
>>>>>>>>>>>            the FXML file.
>>>>>>>>>>>
>>>>>>>>>>>            If a script engine implements the 
>>>>>>>>>>> javax.script.Compilable interface, then such
>>>>>>>>>>> scripts
>>>>>>>>>>> could
>>>>>>>>>>>            be compiled and the resulting 
>>>>>>>>>>> javax.script.CompiledScript could be executed instead
>>>>>>>>>>> using
>>>>>>>>>>>            its eval() methods.
>>>>>>>>>>>
>>>>>>>>>>>            Evaluating the CompiledScript objects may help speed up 
>>>>>>>>>>> the execution of script
>>>>>>>>>>> invocations,
>>>>>>>>>>>            especially for scripts defined for event attributes in 
>>>>>>>>>>> FXML elements (e.g. like
>>>>>>>>>>> onMouseMove)
>>>>>>>>>>>            which may be repetitevly invoked and evaluated."
>>>>>>>>>>>
>>>>>>>>>>>      * System /OS/Java Runtime Information:
>>>>>>>>>>>          o "All systems."
>>>>>>>>>>>
>>>>>>>>>>> Received the internal review ID: "9063426"
>>>>>>>>>>>
>>>>>>>>>>> ---rony

Reply via email to