Some additional context, if anyone is interested.

At the request of Harbs, I am currently investigating how we might remove
@export from our generated JS code to improve the minimization even more.
When I modified the compiler to skip emitting @export in some places, a
release build of TourDeJewel was initially broken. When I added
goog.reflect.objectProperty(), not only did it fix setting public variables
in MXML, it also made that release build of TourDeJewel start working again.

--
Josh Tynjala
Bowler Hat LLC <https://bowlerhat.dev>


On Thu, Jan 16, 2020 at 12:59 PM Josh Tynjala <joshtynj...@bowlerhat.dev>
wrote:

> Thank you, Harbs! Wrapping the variable name in a
> goog.reflect.objectProperty() call works perfectly. This is exactly why I
> started this thread, to see if anyone could suggest possible alternatives.
>
> Thankfully, we can keep the same simple data structure as before, and my
> initial proposal with functions can be forgotten. In a release build, I can
> see that goog.reflect.objectProperty() calls are replaced by a simple
> string literal (containing the minified variable name), so we don't have to
> worry about extra performance impact.
>
> --
> Josh Tynjala
> Bowler Hat LLC <https://bowlerhat.dev>
>
>
> On Wed, Jan 15, 2020 at 8:32 PM Harbs <harbs.li...@gmail.com> wrote:
>
>> Sounds good!
>>
>>
>> https://github.com/google/closure-compiler/wiki/Type-Based-Property-Renaming
>> <
>> https://github.com/google/closure-compiler/wiki/Type-Based-Property-Renaming
>> >
>>
>> The function seems to be goog.reflect.objectProperty()
>>
>> I’m not sure exactly how it works though.
>>
>> > On Jan 16, 2020, at 1:37 AM, Greg Dove <greg.d...@gmail.com> wrote:
>> >
>> > actually just as another fyi, Harbs pointed out some intriguing goog
>> > methods recently - I don't have an immediate reference to it sorry. One
>> of
>> > those seemed to allow for access to renamed names by wrapping the
>> original
>> > names in a 'magic' method that presumably GCC recognises (but presumably
>> > returns the name unchanged in debug mode)
>> >
>> >
>> > On Thu, Jan 16, 2020 at 12:33 PM Greg Dove <greg.d...@gmail.com> wrote:
>> >
>> >> reflection data has similar stuff to support release mode get/set for
>> >> public vars.
>> >>
>> >> I did not look at MXML startup assignments like this, but it sounds
>> good
>> >> to me. I don't know if it makes sense, but considering this is just
>> startup
>> >> assignments, could one function combine all of the startup assignments
>> (in
>> >> the same sequence as before)?
>> >>
>> >>
>> >> On Thu, Jan 16, 2020 at 12:23 PM Josh Tynjala <
>> joshtynj...@bowlerhat.dev>
>> >> wrote:
>> >>
>> >>> According to the commit linked below, the -warn-public-vars compiler
>> >>> option
>> >>> was added because setting a public var in MXML does not currently work
>> >>> properly in a release build.
>> >>>
>> >>>
>> >>>
>> https://github.com/apache/royale-compiler/commit/eed5882ba935870a98ba4fe8cbf499e5d8344f60
>> >>>
>> >>> In other words, this MXML code won't work if it's a public variable
>> and
>> >>> not
>> >>> a setter:
>> >>>
>> >>> <Component publicVar="value"/>
>> >>>
>> >>> For reference, the compiler currently writes the name of the public
>> >>> variable as a string to the generated JS, like this:
>> >>>
>> >>> var data = [
>> >>> Component,
>> >>>    1,
>> >>>    'publicVar',
>> >>>    true,
>> >>>    'value'
>> >>> ]
>> >>>
>> >>> At runtime, it interprets this array of properties, and basically runs
>> >>> code
>> >>> like this:
>> >>>
>> >>> comp['publicVar'] = 'value';
>> >>>
>> >>> Since Closure compiler rewrites variable names during the minification
>> >>> process, this code keeps using the original name, but other code in
>> the
>> >>> app
>> >>> might start looking for a shorter variable name like "uB". This is the
>> >>> failure that we're warning about.
>> >>>
>> >>> I propose updating the code generated by the compiler to something
>> like
>> >>> this instead:
>> >>>
>> >>> var data = [
>> >>>    Component,
>> >>>    1,
>> >>>    function(){ this.publicVar=true }
>> >>> ]
>> >>>
>> >>> At runtime, the class that interprets MXML data will detect the
>> function
>> >>> and call it like this:
>> >>>
>> >>> func.apply(comp);
>> >>>
>> >>> Because this new code will no longer use a string, Closure can
>> rewrite the
>> >>> property name with its minified version, just like in other parts of
>> the
>> >>> app, and we'll no longer need to warn on declarations of public
>> variables.
>> >>>
>> >>> I have a working prototype for primitive values, like String,
>> Boolean, and
>> >>> Number. Objects and Arrays follow a different path in the MXML data
>> >>> interpreter, but I don't see why I wouldn't be able to handle those
>> with a
>> >>> similar approach.
>> >>>
>> >>> Thoughts?
>> >>>
>> >>> --
>> >>> Josh Tynjala
>> >>> Bowler Hat LLC <https://bowlerhat.dev>
>> >>>
>> >>
>>
>>

Reply via email to