I'm assuming (but can't find any directly relevant links ;-) that this is because the JS spec (ECMA) says that an object's properties should be addressable with quoted AND dotted notification (i.e. obj['prop'] and obj.prop). If the compiler renamed the property, it would remove the ability to use quoted access...
EdB On Mon, Apr 6, 2015 at 3:36 PM, Alex Harui <aha...@adobe.com> wrote: > Hi Erik, > > That’s interesting. I’ll try that site. I would have expected the > compiler to rename position to some one or two-letter variable. Can you > tell me why it didn’t? > > -Alex > > On 4/6/15, 5:17 AM, "Erik de Bruin" <e...@ixsoftware.nl> wrote: > >>Alex, >> >>I used 'http://closure-compiler.appspot.com/' with this input: >> >>// ==ClosureCompiler== >>// @compilation_level ADVANCED_OPTIMIZATIONS >>// @warning_level VERBOSE >>// @language ECMASCRIPT5_STRICT >>// ==/ClosureCompiler== >> >>'use strict'; >> >>/** >> * @constructor >> */ >>var org_apache_flex_utils_BinaryData = function () {} >> >>/** >> * @private >> * @type {number} >> */ >>org_apache_flex_utils_BinaryData.prototype.position_ = 0; >> >>Object.defineProperties(org_apache_flex_utils_BinaryData.prototype, { >> position: { >> /** @this {org_apache_flex_utils_BinaryData} */ >> get: function() { >> return this.position_; >> }, >> /** @this {org_apache_flex_utils_BinaryData} */ >> set: function(value) { >> this.position_ = value + 10; >> } >> } >>}); >> >>var binaryData = new org_apache_flex_utils_BinaryData(); >>binaryData.position = 100; >>console.log(binaryData.position); >> >>And I got this output (no errors, no warnings): >> >>'use strict';function >>a(){}a.prototype.a=0;Object.defineProperties(a.prototype,{position:{get:fu >>nction(){return >>this.a},set:function(c){this.a=c+10}}});var b=new >>a;b.position=100;console.log(b.position); >> >>What about the above output isn't what you expect? >> >>EdB >> >> >> >>On Mon, Apr 6, 2015 at 9:25 AM, Erik de Bruin <e...@ixsoftware.nl> wrote: >>> Have you tried it without the quotes around the property name in >>> Object.defineProperties? >>> >>> Also, if you're looking to prevent renaming by the GCC, you may want to >>>look >>> into the use of 'externs' files: >>> >>> >>>https://developers.google.com/closure/compiler/docs/api-tutorial3#externs >>> >>> EdB >>> >>> >>> >>> On Mon, Apr 6, 2015 at 8:18 AM, Alex Harui <aha...@adobe.com> wrote: >>>> Thanks for the suggestion. It didn’t seem to help. I’ve grepped the >>>>GCC >>>> code and didn’t see any attempt to handle defineProp. >>>> >>>> I think the issue is that GCC doesn’t expect code in the >>>>defineProperties >>>> functions to be referencing other functions in the class and vice >>>>versa. >>>> >>>> For example, this method references productService which is defined in >>>>the >>>> Object.defineProperties: >>>> >>>> /** >>>> * @private >>>> */ >>>> FlexJSStore.prototype.startService = function() { >>>> this.productService.send(); >>>> }; >>>> >>>> Object.defineProperties(FlexJSStore.prototype, { >>>> 'productService': { >>>> >>>> The optimizer renames “this.productServices.send()” to something like >>>> “this.Jj.send()”. It doesn’t seem to know about the defineProperties >>>> structure and that there is a non-renamable property called >>>> ‘productService’ so it uses a renaming variable like “Jj”. >>>> >>>> >>>> Putting all of the functions on the prototype slots would allow the >>>> optimizer to rename everything together. But we’d still need a way to >>>> teach GCC that the properties in the defineProperties structure can’t >>>>be >>>> renamed. GCC has deprecated @expose. It appears to be trying to be >>>>smart >>>> about use of string literals as a hint as to what can’t be renamed, >>>>but it >>>> isn’t very cautious. Use of ‘productService’ in the MXML output array >>>> won’t prevent renaming. It probably has to be a more direct usage off >>>>of >>>> a reference to the class or instance. There appears to be a blacklist >>>> Regex you can use to prevent renaming as well. It might be possible >>>>for >>>> the compiler to build out that regex. >>>> >>>> >>>> Thanks, >>>> -Alex >>>> >>>> On 4/4/15, 11:36 PM, "Erik de Bruin" <e...@ixsoftware.nl> wrote: >>>> >>>>>Alex, >>>>> >>>>>When working with Object.definePropert(y)(ies), did you experiment >>>>>using with the setting: >>>>> >>>>>options_.setLanguageIn(LanguageMode.ECMASCRIPT5_STRICT) >>>>> >>>>>in the class JSClosureCompilerWrapper? >>>>> >>>>>The compiler defaults to ECMASCRIPT3 and I guess that might explain >>>>>why it doesn't handle 'newer' features properly? >>>>> >>>>>EdB >>>>> >>>>> >>>>> >>>>>On Sat, Apr 4, 2015 at 5:12 PM, Alex Harui <aha...@adobe.com> wrote: >>>>>> After getting this working for the js-debug version, I’ve come to the >>>>>> conclusion that the Google Closure Compiler cannot handle the >>>>>> defineProperties pattern I proposed. The variable and property >>>>>>renaming, >>>>>> and a few other places, gets totally confused by the code in the >>>>>>object >>>>>> structure, even after I added @this JSDoc annotations. It does not >>>>>> recognize the code in the object structure as belonging to the rest >>>>>>of >>>>>>the >>>>>> code in the class and thus renames everything in the object >>>>>>structure in >>>>>> an incompatible way with the rest of the code in the class that has >>>>>>the >>>>>> classname.prototype pattern. It also reports that code in the >>>>>>structure >>>>>> is accessing properties in the class that it shouldn’t and vice >>>>>>versa. >>>>>> >>>>>> So, I’m mulling over the options. The direction I’m currently >>>>>>thinking >>>>>>of >>>>>> trying is to go back to the get_ and set_ pattern and then name those >>>>>> functions in the object structure. Thus the code would look like the >>>>>>old >>>>>> code, but there’d be an additional defineProperties structure like >>>>>>this: >>>>>> >>>>>> /** >>>>>> * @return {number} The offset to write to or read from. >>>>>> */ >>>>>> org_apache_flex_utils_BinaryData.prototype.get_position = function() >>>>>>{ >>>>>> return this.position_; >>>>>> }; >>>>>> >>>>>> >>>>>> /** >>>>>> * @param {number} value The offset to write to or read from. >>>>>> */ >>>>>> org_apache_flex_utils_BinaryData.prototype.set_position = >>>>>>function(value) { >>>>>> this.position_ = value; >>>>>> }; >>>>>> >>>>>> >>>>>> Object.defineProperties(org_apache_flex_utils_BinaryData.prototype, { >>>>>> 'position': { >>>>>> get: org_apache_flex_utils_BinaryData.prototype.get_position, >>>>>> set: org_apache_flex_utils_BinaryData.prototype.set_position >>>>>> } >>>>>> }); >>>>>> >>>>>> In addition, each property in the structure would have to be >>>>>>‘exposed’ >>>>>>as >>>>>> “not rename-able” probably by doing something like this: >>>>>> >>>>>> >>>>>> /** >>>>>> * @type {number} The offset to write to or read from. >>>>>> */ >>>>>> org_apache_flex_utils_BinaryData.prototype.position; >>>>>> >>>>>> This has the disadvantage of adding more prototype slots at startup, >>>>>>but >>>>>> might make debugging easier. Right now, the call stacks are less >>>>>>helpful >>>>>> because they often contain a function call “set” and you don’t know >>>>>>what >>>>>> setter it is. This new pattern would hopefully result in the >>>>>>debugger >>>>>> showing the function with its set_position name. We’ll see. >>>>>> >>>>>> >>>>>> Another option is to try to get GCC to not rename any variables and >>>>>>absorb >>>>>> the extra code size until they get around to handling this better. >>>>>> >>>>>> Thoughts? I could have certainly missed something about how to get >>>>>>GCC >>>>>>to >>>>>> handle this correctly. >>>>>> >>>>>> -Alex >>>>>> >>>>>> >>>>>> On 3/12/15, 9:15 PM, "Alex Harui" <aha...@adobe.com> wrote: >>>>>> >>>>>>>I’ve been plugging away trying to convert the FlexJS framework to use >>>>>>>Object.defineProperty. >>>>>>> >>>>>>>I’m looking to get other’s thoughts on how to indent, comment and >>>>>>>otherwise format or style the actual code. Here’s what I mean: >>>>>>> >>>>>>>The old code looked like this: >>>>>>> >>>>>>>/** >>>>>>> * @expose >>>>>>> * @return {number} The offset to write to or read from. >>>>>>> */ >>>>>>>org_apache_flex_utils_BinaryData.prototype.get_position = function() >>>>>>>{ >>>>>>> return this.position_; >>>>>>>}; >>>>>>> >>>>>>> >>>>>>>/** >>>>>>> * @expose >>>>>>> * @param {number} value The offset to write to or read from. >>>>>>> */ >>>>>>>org_apache_flex_utils_BinaryData.prototype.set_position = >>>>>>>function(value) >>>>>>>{ >>>>>>> this.position_ = value; >>>>>>>}; >>>>>>> >>>>>>> >>>>>>> >>>>>>>I think the equivalent with Object.defineProperties is this: >>>>>>> >>>>>>>Object.defineProperties(org_apache_flex_utils_BinaryData.prototype, { >>>>>>> 'position': { >>>>>>> get: function() { >>>>>>> return this.position_; >>>>>>> }, >>>>>>> set: function(value) { >>>>>>> this.position_ = value; >>>>>>> } >>>>>>> } >>>>>>> }); >>>>>>> >>>>>>>As you can see, it looks like we are building out object structures >>>>>>>with >>>>>>>functions as values. One of the things I don’t like is it causes the >>>>>>>code >>>>>>>to be indented pretty far in. And when you start placing in >>>>>>>comments, >>>>>>>they are also indented and it really starts to look cluttered. >>>>>>> >>>>>>> >>>>>>>I’m also wondering whether comments even matter for the Google >>>>>>>Closure >>>>>>>Compiler. No code will directly access the get or set properties of >>>>>>>these >>>>>>>subobjects. >>>>>>> >>>>>>>Finally, I’ve been reading that @expose is deprecated in GCC. I’m >>>>>>>wondering how we are supposed to prevent property renaming, if at >>>>>>>all. >>>>>>> >>>>>>> >>>>>>>Thoughts? >>>>>>> >>>>>>>Thanks, >>>>>>>-Alex >>>>>>> >>>>>>> >>>>>> >>>>> >>>>> >>>>> >>>>>-- >>>>>Ix Multimedia Software >>>>> >>>>>Jan Luykenstraat 27 >>>>>3521 VB Utrecht >>>>> >>>>>T. 06-51952295 >>>>>I. www.ixsoftware.nl >>>> >>> >>> >>> >>> -- >>> Ix Multimedia Software >>> >>> Jan Luykenstraat 27 >>> 3521 VB Utrecht >>> >>> T. 06-51952295 >>> I. www.ixsoftware.nl >>> >>> >>> -- >>> Ix Multimedia Software >>> >>> Jan Luykenstraat 27 >>> 3521 VB Utrecht >>> >>> T. 06-51952295 >>> I. www.ixsoftware.nl >> >> >> >>-- >>Ix Multimedia Software >> >>Jan Luykenstraat 27 >>3521 VB Utrecht >> >>T. 06-51952295 >>I. www.ixsoftware.nl > -- Ix Multimedia Software Jan Luykenstraat 27 3521 VB Utrecht T. 06-51952295 I. www.ixsoftware.nl