Is there some way we can declare MXML differently so GCC can know that we’re 
using properties? Maybe instead of strings we can use object literals with 
proper references?

> On Aug 10, 2017, at 6:39 PM, Alex Harui <aha...@adobe.com.INVALID> wrote:
> 
> FWIW, I found out that some of that savings is because when something no
> longer has @export, it is eligible for dead code removal.  That's sort of
> good, except that GCC's dead code removal can't detect usage from MXML and
> data binding so it removed stuff it shouldn't.  The main SWCs may have to
> always export everything for cross-module usage.
> 
> Of course, I could be wrong...
> -Alex
> 
> On 8/10/17, 1:45 AM, "Harbs" <harbs.li...@gmail.com> wrote:
> 
>> For kicks I tried modifying the compiler to not emit @export for my code
>> (it still has the @exports for SDK code).
>> 
>> The result on code size was more than 50KB smaller AFTER gzipping. That’s
>> a reduction of more than 10%. Pretty significant. That’s without any
>> class renaming.
>> 
>> Anyway, it blew up my app on properties that were used in data binding in
>> MXML. I didn’t fix that to see the next place it blew up.
>> 
>> If we go this route, we probably need to make MXML output smarter…
>> 
>>> On Aug 10, 2017, at 12:31 AM, Alex Harui <aha...@adobe.com.INVALID>
>>> wrote:
>>> 
>>> I've seen GCC not track renames before.  The Object.defineProperty is
>>> just
>>> a data structure and doesn't add to the set of APIs for a class
>>> definition.
>>> 
>>> I just realized that the class names are used by SimpleCSSValuesImpl to
>>> determine the type selectors.  So if you rename those strings you will
>>> have to change your CSS.
>>> 
>>> Also, I have not removed the exportSymbol calls on each class yet.  I
>>> will
>>> try that as well.
>>> 
>>> -Alex
>>> 
>>> 
>>> On 8/9/17, 2:11 PM, "Harbs" <harbs.li...@gmail.com> wrote:
>>> 
>>>> 
>>>>> On Aug 9, 2017, at 11:56 PM, Alex Harui <aha...@adobe.com.INVALID>
>>>>> wrote:
>>>>> 
>>>>> The change I just made should only be for MXML.  But I think I saw
>>>>> that
>>>>> I
>>>>> never did remove the @export for getters and setters in AS.  However,
>>>>> doing so would probably break MXML setting of those properties.
>>>>> 
>>>>> I don't think you can tell when compiling a SWC which properties
>>>>> someone
>>>>> is going to use from MXML, so I'm not sure passing through @export or
>>>>> somehow marking certain APIs as "don't rename" is going to be useful.
>>>> 
>>>> It would be useful for client code because I do know which properties
>>>> my
>>>> MXML will use.
>>>> 
>>>>> On
>>>>> the other hand, MXML does know every property that you accessed from
>>>>> MXML
>>>>> so maybe that's what I'll try next.  I think I see an API in GCC where
>>>>> you
>>>>> can tell it things that shouldn't be renamed.
>>>> 
>>>> That sounds interesting.
>>>> 
>>>>> IMO, this is a bug or missing capability in GCC.  They don't see
>>>>> Object.defineProperties as part of the class definition so they don't
>>>>> track the renames properly.  So, removing @exports from getters in AS
>>>>> may
>>>>> also just fail in calls from other AS classes.
>>>> 
>>>> I lost you. Where did you see that GCC doesn’t track the definitions?
>>>> 
>>>>> Regarding obfuscation, if we have to export getters, is that really
>>>>> exposing important secrets?
>>>> 
>>>> Not sure, but I’d like to keep the code as difficult to follow as
>>>> possible.
>>>> 
>>>>> The actual code for a getter/setter is
>>>>> elsewhere in the output file.  It might be possible to do string
>>>>> replacement on the exported names after the minification.
>>>> 
>>>> String replacement is definitely an option if it comes to that. I’m
>>>> probably going to do that for class names and paths as I don’t really
>>>> see
>>>> that we currently have a solution for that.
>>>> 
>>>>> Thoughts?
>>>>> -Alex
>>>>> 
>>>>> On 8/9/17, 1:24 PM, "Harbs" <harbs.li...@gmail.com> wrote:
>>>>> 
>>>>>> I just compiled with the new option and it appears to work. Yay. On
>>>>>> the
>>>>>> other hand, only functions and variables are being minified. getters
>>>>>> and
>>>>>> setters (which is a very large percentage of the signature of my
>>>>>> code)
>>>>>> is
>>>>>> not.
>>>>>> 
>>>>>> It looks like that adds the @exports for non-mxml files as well. Can
>>>>>> we
>>>>>> output the @exports for only MXML declared variables?
>>>>>> 
>>>>>> If a comment with @export is added in AS code, will that be passed
>>>>>> through to the JS output?
>>>>>> 
>>>>>> If yes, I think @exporting ids declared in MXML should be the only
>>>>>> case
>>>>>> we need. I can probably handle any specific cases where that might
>>>>>> break
>>>>>> output code by manually inserting @export statements.
>>>>>> 
>>>>>>> On Aug 9, 2017, at 10:20 PM, Alex Harui <aha...@adobe.com.INVALID>
>>>>>>> wrote:
>>>>>>> 
>>>>>>> Hmm.  I thought GCC didn't rename those.  Anyway, I added back the
>>>>>>> @export.  See if that works for you and then see if you think there
>>>>>>> is
>>>>>>> enough obfuscation.
>>>>>>> 
>>>>>>> Thanks,
>>>>>>> -Alex
>>>>>>> 
>>>>>>> On 8/9/17, 12:45 AM, "Harbs" <harbs.li...@gmail.com> wrote:
>>>>>>> 
>>>>>>>> The problem is as follows:
>>>>>>>> 
>>>>>>>> Taking textInput as an example, the MXML gets compiled into the
>>>>>>>> following:
>>>>>>>> textInput: {
>>>>>>>> /** @this {com.printui.view.components.PaletteSlider} */
>>>>>>>> get: function() {
>>>>>>>>  return this.textInput_;
>>>>>>>> },
>>>>>>>> /** @this {com.printui.view.components.PaletteSlider} */
>>>>>>>> set: function(value) {
>>>>>>>>  if (value != this.textInput_) {
>>>>>>>>    this.textInput_ = value;
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> this.dispatchEvent(org.apache.flex.events.ValueChangeEvent.createUpd
>>>>>>>> at
>>>>>>>> eE
>>>>>>>> ve
>>>>>>>> nt(this, 'textInput', null, value));
>>>>>>>>  }
>>>>>>>> }
>>>>>>>> },
>>>>>>>> 
>>>>>>>> which gets minified to this:
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> yw:{get:r('Nja'),set:function(a){a!=this.Nja&&(this.Nja=a,this.dispa
>>>>>>>> tc
>>>>>>>> hE
>>>>>>>> ve
>>>>>>>> nt(yR(this,iI,null,a)))}}
>>>>>>>> 
>>>>>>>> goog has no way of knowing that the original textInput property
>>>>>>>> name
>>>>>>>> is
>>>>>>>> used anywhere so all references to textInput are changed to yw.
>>>>>>>> 
>>>>>>>> I think the solution to this is to add @export tags to the
>>>>>>>> Object.defineProperty specification for any property that’s
>>>>>>>> declared
>>>>>>>> or
>>>>>>>> used in the MXML.
>>>>>>>> 
>>>>>>>> If localId is used, there might be another option which would be to
>>>>>>>> rename the id to some value that’s one or two characters long. I’m
>>>>>>>> pretty
>>>>>>>> sure that goog will not rename really short property names like
>>>>>>>> that.
>>>>>>>> (We
>>>>>>>> can’t do that for id because it might be used by CSS.)
>>>>>>>> 
>>>>>>>> Harbs
>>>>>>>> 
>>>>>>>>> On Aug 9, 2017, at 10:25 AM, Harbs <harbs.li...@gmail.com> wrote:
>>>>>>>>> 
>>>>>>>>> Here’s a problem I ran into:
>>>>>>>>> 
>>>>>>>>> I have a component which has the following:
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpa
>>>>>>>>> st
>>>>>>>>> e.
>>>>>>>>> ap
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> ache.org%2FcN1T&data=02%7C01%7C%7C5b5c51c82fc94c95d9d408d4defa99bb%
>>>>>>>>> 7C
>>>>>>>>> fa
>>>>>>>>> 7b
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 1b5a7b34438794aed2c178decee1%7C0%7C0%7C636378615292281524&sdata=FPa
>>>>>>>>> am
>>>>>>>>> WR
>>>>>>>>> Ac
>>>>>>>>> t5HAYakAZnFzT8biHOT%2F%2F0%2BCFlY32%2BvZtg%3D&reserved=0
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fp
>>>>>>>>> as
>>>>>>>>> te
>>>>>>>>> .a
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> pache.org%2FcN1T&data=02%7C01%7C%7C5b5c51c82fc94c95d9d408d4defa99bb
>>>>>>>>> %7
>>>>>>>>> Cf
>>>>>>>>> a7
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636378615292281524&sdata=FP
>>>>>>>>> aa
>>>>>>>>> mW
>>>>>>>>> RA
>>>>>>>>> ct5HAYakAZnFzT8biHOT%2F%2F0%2BCFlY32%2BvZtg%3D&reserved=0>
>>>>>>>>> 
>>>>>>>>> In the script block I have references to disableBead, textInput,
>>>>>>>>> etc.
>>>>>>>>> 
>>>>>>>>> The instance correctly has properties of disableBead, textInput,
>>>>>>>>> etc.,
>>>>>>>>> but every reference to these properties is renamed.
>>>>>>>>> 
>>>>>>>>> textInput.addEventListener
>>>>>>>>> becomes:
>>>>>>>>> this.yw.addEventListener
>>>>>>>>> 
>>>>>>>>> disableBead.disabled
>>>>>>>>> becomes
>>>>>>>>> this.Jm.disabled
>>>>>>>>> 
>>>>>>>>> etc.
>>>>>>>>> 
>>>>>>>>> this.yw and this.Jm are both undefined
>>>>>>>>> 
>>>>>>>>>> On Aug 9, 2017, at 9:10 AM, Harbs <harbs.li...@gmail.com
>>>>>>>>>> <mailto:harbs.li...@gmail.com>> wrote:
>>>>>>>>>> 
>>>>>>>>>> I’ll give it a go and see.
>>>>>>>>>> 
>>>>>>>>>>> On Aug 9, 2017, at 8:31 AM, Alex Harui <aha...@adobe.com.INVALID
>>>>>>>>>>> <mailto:aha...@adobe.com.INVALID>> wrote:
>>>>>>>>>>> 
>>>>>>>>>>> I don't think getters and setters get renamed because they are
>>>>>>>>>>> keys
>>>>>>>>>>> in the
>>>>>>>>>>> Object.defineProperties data structure.  I'm wondering if that
>>>>>>>>>>> will
>>>>>>>>>>> be
>>>>>>>>>>> enough obfuscation for you or not.
>>>>>>>>>>> 
>>>>>>>>>>> -Alex
>>>>>>>>>>> 
>>>>>>>>>>> On 8/8/17, 10:22 PM, "Harbs" <harbs.li...@gmail.com
>>>>>>>>>>> <mailto:harbs.li...@gmail.com>> wrote:
>>>>>>>>>>> 
>>>>>>>>>>>> I have a custom component “A” which implements a DisabledBead
>>>>>>>>>>>> in
>>>>>>>>>>>> ActionScript. It has a getter called “enabled”.
>>>>>>>>>>>> 
>>>>>>>>>>>> I have another MXML file “B” which uses the component and
>>>>>>>>>>>> specifies
>>>>>>>>>>>> enabled=“false”.
>>>>>>>>>>>> 
>>>>>>>>>>>> I’m assuming the “enabled” property in “A” will be renamed
>>>>>>>>>>>> without
>>>>>>>>>>>> an
>>>>>>>>>>>> @export.
>>>>>>>>>>>> 
>>>>>>>>>>>> The mxml in “B” will still be using a string for the property
>>>>>>>>>>>> name
>>>>>>>>>>>> which
>>>>>>>>>>>> will be “enabled” that will be undefined.
>>>>>>>>>>>> 
>>>>>>>>>>>>> On Aug 9, 2017, at 7:55 AM, Alex Harui
>>>>>>>>>>>>> <aha...@adobe.com.INVALID
>>>>>>>>>>>>> <mailto:aha...@adobe.com.INVALID>> wrote:
>>>>>>>>>>>>> 
>>>>>>>>>>>>> I just tried DataBindingExample.  MyInitialView is
>>>>>>>>>>>>> essentially a
>>>>>>>>>>>>> custom
>>>>>>>>>>>>> component.  What are you thinking won't work?
>>>>>>>>>>>>> 
>>>>>>>>>>>>> -Alex
>>>>>>>>>>>>> 
>>>>>>>>>>>>> On 8/8/17, 2:30 PM, "Harbs" <harbs.li...@gmail.com
>>>>>>>>>>>>> <mailto:harbs.li...@gmail.com>> wrote:
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Did you try MXML with custom components? I’m not sure I
>>>>>>>>>>>>>> understand
>>>>>>>>>>>>>> how
>>>>>>>>>>>>>> that would work.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> On Aug 9, 2017, at 12:01 AM, Alex Harui
>>>>>>>>>>>>>>> <aha...@adobe.com.INVALID
>>>>>>>>>>>>>>> <mailto:aha...@adobe.com.INVALID>>
>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Some things I found were that MXML isn't a problem because
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>> id
>>>>>>>>>>>>>>> maps
>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>> a getter/setter which maps to Object.DefineProperty which
>>>>>>>>>>>>>>> takes
>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>> object
>>>>>>>>>>>>>>> structure where the ids are keys so they don't get renamed.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>> 
>>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>> 
>> 
> 

Reply via email to