I vote for A.

We can also do B which would require manually changing all access to brackets 
and quote all names in object literals.

I might be nice to add some comment decorations to enable/disable 
-js-dynamic-access on a case-by-case basis, but I think it’s reasonable to have 
a global on/off requirement. I’m already doing this for a library I wrote which 
has a lot of dynamic data structures which does not survive minification and 
the results are fine.

My $0.02,
Harbs

> On Dec 11, 2018, at 8:47 PM, Alex Harui <aha...@adobe.com.INVALID> wrote:
> 
> IMO, some folks will want to rely on minification of object field names so 
> save space.  I think -js-dynamic-access blocks minification.
> 
> So, to try to pose the problem another way, you can rely on minification 
> object field names if you are building a single-js-file app, but as soon as 
> you start using modules, things may break.  So what should we tell folks?
> 
> A) if you use modules you must turn off minification in objects with 
> -js-dynamic-access
> B) here are some ways to hack your code so you can still rely on minification
> C) something else?
> 
> We can manually rename fields in ROYALE_CLASS_INFO and other structures to 
> make our code less readable in debug mode but save space in release mode, but 
> that does not solve the general case problem.  Folks may have other objects 
> in their apps and modules that work until you add some code to one of the 
> projects that changes which object fields get renamed.
> 
> -Alex
> 
> On 12/11/18, 9:31 AM, "Harbs" <harbs.li...@gmail.com> wrote:
> 
>    I’m not following why this is the same point.
> 
>    I’m using -js-dynamic-access-unknown-members=true to handle this kind of 
> problem. It works flawlessly…
> 
>    I’d personally argue that true should be the default, but whether the 
> default is true or not, we do have an option to deal with these kinds of data 
> structures.
> 
>> On Dec 11, 2018, at 6:39 PM, Alex Harui <aha...@adobe.com.INVALID> wrote:
>> 
>> Yes, we can use our own short names in code we generate, but that's not 
>> really the point.
>> 
>> The point is that any plain object field can be renamed based on other code 
>> in the compile.  So if you just have:
>> 
>> Var obj:Object = { harbs: 1};
>> Public static function foo()
>> {
>>  Trace(obj.harbs);
>> }
>> 
>> Use of foo() in one compile may result in harbs being renamed, and another 
>> wouldn't.  And that poses a problem when data structures are shared between 
>> compiled outputs.
>> 
>> This is a natural way to write AS, but the JS results when minified and 
>> shared between app and modules can fail.  So what restrictions should we 
>> place if any on how folks use plain objects?
>> 
>> HTH,
>> -Alex
>> 
>> On 12/11/18, 7:36 AM, "Harbs" <harbs.li...@gmail.com> wrote:
>> 
>>   I was about to make the same suggestion. We can use “I” for interfaces, 
>> “c” for class, “k” for kind, “n” for names. etc.
>> 
>>> On Dec 11, 2018, at 2:52 PM, Frost, Andrew <andrew.fr...@harman.com> wrote:
>>> 
>>> Hi
>>> 
>>> Not sure that I fully understand this but would a valid compromise be 
>>> something where the field name isn't renamed at all automatically, but we 
>>> just change it in the JS generation code to be "i" rather than 
>>> "interfaces", and update the Language is/as functions to work with this 
>>> property name? Not sure whether it would work and I don't know whether the 
>>> Reflection stuff would then need to change too, but if this is all in the 
>>> generated outputs and/or the framework's own code then it shouldn't be 
>>> something that the end user would bother about..
>>> 
>>> thanks
>>> 
>>> Andrew
>>> 
>>> 
>>> -----Original Message-----
>>> From: Alex Harui [mailto:aha...@adobe.com.INVALID] 
>>> Sent: 11 December 2018 08:32
>>> To: dev@royale.apache.org
>>> Subject: [EXTERNAL] ROYALE_CLASS_INFO, renaming, modules, Objects
>>> 
>>> I spent some time today trying to get Tour De Flex to run in production 
>>> mode with the main app and modules being separately minified.
>>> 
>>> I've fixed a few things here and there, but an interesting issue I ran into 
>>> has to do with the plain object we use in ROYALE_CLASS_INFO (and will apply 
>>> to other objects).
>>> 
>>> The ROYALE_CLASS_INFO is generated on each class and has a "names" property 
>>> and an optional "interfaces" property.  An example is:
>>> 
>>> org.apache.royale.html.beads.models.PanelModel.prototype.ROYALE_CLASS_INFO 
>>> = { names: [{ name: 'PanelModel', qName: 
>>> 'org.apache.royale.html.beads.models.PanelModel', kind: 'class' }], 
>>> interfaces: [org.apache.royale.core.IBead, 
>>> org.apache.royale.core.IPanelModel] };
>>> 
>>> Because the field names are not quoted, then in most output, the field name 
>>> "interfaces" is renamed and all code referencing this field is renamed as 
>>> well.  This is good because it means that you don't have to download the 
>>> word "interfaces" once per-class. Instead of 10 characters, it is usually 
>>> one or two.  100 classes saves you about 900 bytes.
>>> 
>>> However, it turns out that in Tour De Flex, the main app uses Reflection 
>>> and Reflection uses a quoted 'interfaces' string and thus, the field name 
>>> 'interfaces' in ROYALE_CLASS_INFO isn't renamed, but in most modules 
>>> "interfaces" is renamed since no other code in the module has a quoted 
>>> string for 'interfaces'.  But that means that when a module loads, the 
>>> Language.is/as won't work since classes in the main app are using 
>>> "interfaces" but the classes in the module are using some short name.
>>> 
>>> One solution is to always quote that field in the compiler output and 
>>> Language is/as so it doesn't get renamed, but that means that field will 
>>> never get renamed and you lose saving those bytes.
>>> 
>>> Another is let folks figure out their own workarounds, by adding some code 
>>> that will prevent the renaming in the modules.
>>> 
>>> Other ideas are welcome.  I'm done for tonight.
>>> 
>>> Thoughts?
>>> -Alex
>>> 
>> 
>> 
>> 
> 
> 
> 

Reply via email to