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