OT: I am getting a lot of warnings in the GCC release build phase. I recall you mentioning something in the past about this being related to GCC versions - is there anything I can do to address this?
On Thu, Sep 29, 2016 at 7:19 AM, Greg Dove <greg.d...@gmail.com> wrote: > I hadn't investigated any of this, just wondered about it I will check the > reflection results today. > I had actually assumed that @export and @expose explicitly prevented > renaming, but also had not checked this. > > > > > On Thu, Sep 29, 2016 at 7:13 AM, Alex Harui <aha...@adobe.com> wrote: > >> In fact, when I last touched it, Reflection was optional. Unless you >> actually use a reflection API (whose code path access >> FLEXJS_REFLECTION_INFO), GCC did not output FLEXJS_REFLECTION_INFO in the >> minified results. Probably worth verifying that is still true. >> >> What I don't know is whether dead code is removed before renaming. I hope >> so (and it makes sense to do it that way), otherwise the strings in >> FLEXJS_REFLECTION_INFO may prevent renaming. >> >> All that is part of Pay-as-you-go. A related goal is to make the "opt-in" >> automatic. IOW, we don't want folks to have to set compiler options to >> get features. They should come in as you use the APIs. >> >> -Alex >> >> On 9/28/16, 11:05 AM, "Greg Dove" <greg.d...@gmail.com> wrote: >> >> > "reflection support could be opt-in (or opt-out)" >> > >> >On reflection (pun unintended) maybe that is not sensible, given it is >> >baked in to the framework classes. If GCC does dead-code elimination, >> >maybe >> >that does the job anyhow. >> > >> > >> > >> >On Thu, Sep 29, 2016 at 7:02 AM, Greg Dove <greg.d...@gmail.com> wrote: >> > >> >> Alex, I had also considered the same idea of doing the qualifiedName >> >> splitting in the reflection data because I think you would reduce a lot >> >>of >> >> long string variation in the GCC release build simply by doing >> >> 'org.apache.flex.'+'Package.'+'ClassName' etc >> >> >> >> Isn't using the reflection member definition names for access also >> >>another >> >> use that would qualify as 'dynamic' access? I am not sure if GCC can >> >>make >> >> the connection between the reflection data field names and the original >> >> naming of the fields which is why we need @export on instance members >> >>and >> >> @expose on static members (without those it fails iirc). >> >> >> >> One option for the future might be to make Reflection support optional. >> >>I >> >> think we might still want FLEXJS_CLASS_INFO, but perhaps the rest of >> the >> >> the reflection support could be opt-in (or opt-out). This alone could >> >> reduce a lot of code for people who don't need that. >> >> >> >> >> >> >> >> >> >> On Thu, Sep 29, 2016 at 6:17 AM, Alex Harui <aha...@adobe.com> wrote: >> >> >> >>> >> >>> >> >>> On 9/28/16, 3:25 AM, "Harbs" <harbs.li...@gmail.com> wrote: >> >>> >> >>> >I like this idea and would propose taking it one step further: >> >>> > >> >>> >Currently transpiled javascript has fully qualified class names for >> >>> >pretty much everything. This is difficult for closure to minimize >> >>> >completely. I’d really like to have some way to “export” class names >> >>>as >> >>> >well as “import” to define some compact name for packages. Based on >> my >> >>> >playing around, this could save at least tens of KB of JS downloads. >> >>> >> >>> For sure, the amount of download for strings is a significant waste of >> >>> bytes in most cases. However, I'm not sure we need to provide >> renaming >> >>> controls for folks building FlexJS apps, at least not for the >> >>>mainstream. >> >>> >> >>> AIUI, every public property and method in FlexJS is "exported" to >> >>>prevent >> >>> renaming for a few "just-in-case" reasons. First, a review of >> >>>renaming: >> >>> >> >>> FlexJS uses the Google Closure Compiler to optimize/minify the output >> >>>JS >> >>> file. In doing so, GCC tries to renaming variables. For example, >> >>>every >> >>> FlexJS class has a FLEXJS_CLASS_INFO property on it. Google might >> >>>rename >> >>> that property to just "a", so the original JS might look like: >> >>> >> >>> UIBase.prototype.FLEXJS_CLASS_INFO = {..}; >> >>> >> >>> But GCC will cause that to look like: >> >>> >> >>> UIBase.prototype.a = {..}; >> >>> >> >>> If you replace "FLEXJS_CLASS_INFO" with "a" in every FlexJS class, you >> >>>can >> >>> save quite a bit of download size. But then, what happens if someone >> >>> writes code that looks like: >> >>> >> >>> var foo:Object = someUIBase.FLEXJS_CLASS_INFO; >> >>> var bar:Object = someUIBase["FLEXJS_CLASS_INFO"]; >> >>> >> >>> For the first line, GCC will know to alter the code to look like: >> >>> >> >>> var foo:Object = someUIBase.a; >> >>> >> >>> And everything will work fine, but AIUI, GCC does not try to alter >> >>>strings >> >>> so it will not touch the "bar" code and that would fail at runtime >> >>>since >> >>> there is no longer a property called "FLEXJS_CLASS_INFO" on UIBase. >> >>> >> >>> >> >>> But I think that GCC is now smart enough that if you actually have a >> >>>line >> >>> like the "bar" line, that will prevent GCC from renaming >> >>> FLEXJS_CLASS_INFO. GCC might make an alias instead. GCC knows that >> >>>the >> >>> output must have the bytes for "FLEXJS_CLASS_INFO" once in order to >> >>>honor >> >>> the string literal, so it will create an alias like aa = >> >>> "FLEXJS_CLASS_INFO" and then the code is output as: >> >>> >> >>> UIBase.prototype[aa] = {..}; >> >>> And >> >>> var foo:Object = someUIBase[aa]; >> >>> var bar:Object = someUIBase[aa]; >> >>> >> >>> IOW, GCC has a pretty good alias generator, which is why I don't think >> >>>our >> >>> tool chain needs to provide folks with the manual options to rename. >> >>>We >> >>> should just let GCC do its thing. >> >>> >> >>> >> >>> So, AIUI, the reason we export every public thing isn't for the >> >>>standard >> >>> dynamic access case as shown above, but for two others (and related >> >>> scenarios): >> >>> -Dynamic access using generated strings >> >>> -Binding expressions with "dot-paths" >> >>> >> >>> Dynamic access using generated strings are scenarios where you know >> >>>that >> >>> every property starts with "str_" and run code like: >> >>> >> >>> var foo:String = bar["str_" + i]; >> >>> >> >>> GCC isn't smart enough to handle this. >> >>> >> >>> Dot-path Binding Expressions are where you want to use data binding to >> >>> bind to "myModel.subObject.someProperty". GCC will just look at the >> >>> entire string and since it doesn't match any property it will rename >> >>> myModel and subObject and someProperty and the binding will fail at >> >>> runtime. >> >>> >> >>> So, AIUI, we have huge string tables in our apps for these two cases >> >>>even >> >>> though 99% or even 100% of the time, your app isn't going to access >> >>>those >> >>> methods and properties in a way that GCC can't detect. So, before we >> >>>add >> >>> some user-controlled renaming, I think we should first explore a >> >>>compiler >> >>> option like -no-rename where you guarantee that your app doesn't use >> >>> generated strings or dot-path binding expressions and we clear all the >> >>> @exports out of the code before sending it to GCC. >> >>> >> >>> I'll bet somewhere in the framework we do use generated strings and >> >>>will >> >>> have to fix that up, but I think that should be doable. I think the >> >>> compiler could also output string literals with "." in them as >> separate >> >>> strings and that might solve the dot-path problem. IOW, instead of >> >>>simply >> >>> outputting "myModel.subObject.someProperty", the compiler would >> output: >> >>> >> >>> "myModel" + "." + "subObject" + "." + "someProperty" >> >>> >> >>> I've also seen information that indicates we might be able to control >> >>>or >> >>> provide hints to GCC about what it can rename such that a smarter >> >>>FalconJX >> >>> could look for dynamic access and tell GCC not to rename properties in >> >>> classes it knows will be dynamically accesses and let GCC rename >> >>> everything else. >> >>> >> >>> Volunteers are welcome to do more research on leveraging and >> >>>controlling >> >>> GCC renaming. I haven't made it a high priority for me. >> >>> >> >>> My 2 cents, >> >>> -Alex >> >>> >> >>> >> >> >> >> >