(for some reason the followup message didn't seem to make it to es-discuss the 
first time I redirected them.  so here goes using an alternative technique.  
Sorry in advance with we end up with duplicate messages)

Begin forwarded message:

> From: Tom Van Cutsem <[email protected]>
> Date: November 19, 2012 10:04:56 AM PST
> To: Allen Wirfs-Brock <[email protected]>
> Cc: "Mark S. Miller" <[email protected]>, Jason Orendorff 
> <[email protected]>
> Subject: Re: possible excessive proxy invariants for Object.keys/etc??
> 
> Hi Allen,
> 
> 2012/11/18 Allen Wirfs-Brock <[email protected]>
> The proxy spec.for Object.getOwnPropertyNames/kets/etc. seem to be doing 
> quite a bit more than this. They
> 
> 1) always copy the array returned from the trap?  Why is this necessary?  
> Sure the author of a trap should probably always return a fresh object but 
> not doing so doesn't violate the integrity of the frozen/sealed invariants?  
> In most cases they will provide a fresh object and  copying adds unnecessary  
> work  that is proportional to the number of names to every such call.
> 
> The copying is to ensure:
> a) that the result is an Array
> b) that all the elements of the result are Strings
> c) to ensure the stability of the result.
> 
> You can think of a + b as implementing a type coercion of the trap result to 
> "Array of String". This coercion is not too dissimilar from what the 
> getOwnPropertyDescriptor has to do (normalization of the returned property 
> descriptor by creating a fresh copy).
> 
> c) on the other hand is crucial for the non-configurability/non-extensibility 
> checks mentioned below. It's no use checking some invariants on a data 
> structure if that data structure can later still be mutated.
> 
> If we don't care about any of a, b and c, then the result array wouldn't need 
> to be copied.
>  
> 2) ensuring that the list of property keys contains no duplicates.  Why is 
> this essential?  Again, I don't see what it has to do with the integrity of 
> the frozen/sealed invariants.  It is extra and probably unnecessary work that 
> is at least proportional to the number of names).
> 
> We've been going back and forth over whether or not we wanted to prevent 
> duplicates. I remember Andreas Gal being concerned about these kinds of 
> issues (that was when he was doing the first Firefox prototype for old 
> proxies, in the context of the enumerate() trap, which was called during a 
> live for-in loop. IIRC, Firefox already did de-dupe checks, as properties 
> already enumerated in a child object should not be re-visited when visiting a 
> parent object)
> 
> More recently, at the last TC39 meeting in Boston, we decided to change the 
> return type of the enumerate() trap from Array[String] to Iterator, and in 
> doing so waiving the duplicate properties check. Quoting from the "Open 
> issues" section of 
> <http://wiki.ecmascript.org/doku.php?id=harmony:direct_proxies#open_issues>:
> 
> "Enumerate trap signature: consider making the enumerate() trap return an 
> iterator rather than an array of strings. To retain the benefits of an 
> iterator (no need to store collection in memory), we might need to waive the 
> duplicate properties check. Resolution: accepted (duplicate properties check 
> is waived in favor of iterator return type)"
> 
> I guess if duplicate properties are not crucial for enumeration, they're also 
> not crucial for Object.getOwnPropertyNames and Object.keys and can be 
> dropped. Mark, can you comment?
>  
> 3) Every name in the list returned by the trap code is looked up on the 
> target to determine whether or not it exists, even if the target is 
> extensible.   Each of those lookup is observable (the target might itself be 
> a proxy) so, according to the algorithm they all must be performed.
> 
> This is where we get into actual checks required to enforce 
> non-configurability/non-extensibility.
> 
> Granted, the ES5 spec is not clear about the invariants on 
> getOwnPropertyNames and keys. The currently specified invariants are a 
> common-sense extrapolation of the existing invariants to cover these 
> operations.
> 
> In practice, it determines the degree of confidence that a programmer can 
> have in Object.getOwnPropertyNames and friends when dealing with a frozen 
> object. If we waive these invariant checks, then the result of those 
> operations can never be trusted on to reliably introspect on a frozen 
> object's list of property names:
> 
> Object.isFrozen(proxy) // true
> Object.getOwnPropertyNames(proxy) // ['foo']
> Object.getOwnPropertyNames(proxy) // [ ]
> 
> Here, the 'foo' property apparently disappeared on a frozen object.
> 
> If neither the for-in loop nor Object.getOwnPropertyNames nor Object.keys can 
> reliably report an object's own properties, then we've made it impossible to 
> reliably traverse and inspect a presumably deep-frozen object graph.
>  
> 4) Every own property of the target, is observably looked up (possibly a 
> second time) even if the object is extensible  and has no non-configurable 
> properties.
> 
> We may be able to remove the redundancy of two lookups by restructuring the 
> algorithm.
> There previously was some redundancy in other checks as well.
>  
> It isn't clear to me if any of this work is really necessary to ensure 
> integrity.  After all, what can you do with any of these names other than use 
> them as the property key argument to some other trap/internal method such as 
> [[SetP]], [[DefineOwnProperty]], etc.  Called on a proxy, those fundamental 
> operations are going to enforce the integrity invariants of the actual 
> properties involved so the get name checks doesn't really seem to be adding 
> anything essential.
> 
> Perhaps we can just get rid of all the above checking.  It seems like a good 
> idea to me.
> 
> Alternatively,  it suggests that a [[GetNonConfigurablePropertyNames]] 
> internal method/trap would be a useful call to have as the integrity 
> invariants only care about non-configurable properties. That would 
> significantly limit the work in the case where there are none and limit the 
> observable trap calls to only the non-configurable properties.
> 
> That would be one way to speed things up.
> 
> I share your concern that the current spec algorithm may be a bit too 
> restrictive for implementations to allow optimizations. It's very imperative. 
> We should ask the spec implementors to have a look at the draft spec and 
> share their concerns.
> 
> Cheers,
> Tom

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to