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 >