David Bruant (2013-07-30T08:25:45.000Z)
domenic at domenicdenicola.com (2013-08-04T22:47:20.568Z)
2013/7/30 Allen Wirfs-Brock <allen at wirfs-brock.com> > no special "this" here. I'm just saying that at the implementation level, > when you are doing something with an object value what you really have is > a "reference" (ie a pointer) to a heap allocated data structure. If the > implementation code is going to do something that depends on the data > structures actual memory layout, then you better be sure that you have a > pointer to the actual data structure you expect. This apply to Date and the "time value", but I fail to see why this doesn't apply to every object and every property. For instance, every object is expected to have a [[Prototype]] object (at least in the ES5 era), which most likelty had a reserved slot in current implementations. Proxies challenge this, because they don't have a [[Prototype]], so the same sort of "memory safety hazard" apply for [[Prototype]]. But I'm not too worry about that. I imagine implementors are well-aware of how deeply proxies are to integrate (retrofit!) in the object model. They'll figure it out for Date objects as well. > What this is really saying is that this method only works on object > instances that have the internal layout created by the Date constructor. There is no "really saying". There is saying, there are implementations that rely on this saying of the spec and since the saying is changing (admittedly somewhere else in the spec), they'll have to adapt their implementation to take into account the new sayings. I'm not sure worrying about implementations is helpful in this debate. This is a low-level feature. A good test suite applying built-in algorithms to proxies will go a long way preventing implementation issues. > For a broader discussion of the use of [[Class]] in ES5 see > https://docs.google.com/document/d/1sSUtri6joyOOh23nVDfMbs1wDS7iDMDUFVVeHeRdSIw/edit?hl=en&authkey=CI-FopgC&pli=1 Cases are annoyingly numerous, but finite. A test suite can go a long way. I heard the test suite is moving to Github :-) Only missing is an extensive doc of the test framework. > It is exactly branding, but branding for the specific characteristics that > are defined ES6 clause 8.4.2. It doesn't include other things that > [[Class]] was sometimes used for. If the intent behind branding is "internal memory layout", I argue that this is implementation details leaking into abstraction and that it's a bad idea especially as it serves no purpose other than memory safety issues that *might* happen in the transition era between the "before proxy" world and the "after proxy" world. > A proxy with an Array as its target is not an Array. Whether such an > object is substitutable for an Array instance is high dependent on the > details of its handler and other aspects of its implementation. Also > please see > http://wiki.ecmascript.org/doku.php?id=harmony:virtual_object_api which > address related issues. This is not enough. this-binding ("proxy.getMonth()" when the target is a Date) is only half of the story. The other half remains unadressed ("Date.prototype.getMonth.call(proxy)"). Exotic objects aren't always used as "this" value. This is exactly Tom's feedback actually. We need the same solution for both cases (this and non-this usage of methods). > The major of such test in the spec. are abstracting over such > implementation hazards. That's why they are there. Let's let implementors deal with implementation issues. Let's just make sure the spec isn't impossible or too high barrier to implement. A test suite will do the rest. Let's care only for tests that make sense when authoring. Implementors are free to dive in here to say I'm wrong and why. > No, the design actually creates potential safety issues that must be > carefully guarded against. For example, the default delegation semantics > for [[Invoke]] (it would be the same if [[Get]]/[[Ca]] is used) calls a > method on the target object with the proxy object as its this value. If the > target object is exotic or has implementation specific private state (eg, > [[DateValue]]) the this value (the Proxy) is the wrong kind of object for > the method to operate upon. Any implementation level optimization must > include some sort of guard. Again, this is an implementation concern. The implementors needs you describe are in the way of authoring (based on the feedback brought to the list). > Here is a simple way Proxies fail your expectations. > > ... > > None of the has anything to do with the presence of absence of the ES<=5.1 > [[Class]] internal property. Instead it is much more fundamental to the > semantics of Proxy. A target and a proxy have a different object reference. If the difference can be kept to that, transparent membranes can be implemented, even your Branded class. Any code can expect objects with 2 identities to behave differently anyway. > You suggestion is? My point is ES internal branding, whether you call it > "check for exotic XXX object", "check for the[[XXX]] internal data > property" or check if [[Class]] == "Array" h does not work with the Direct > Proxy default handler semantics. > Is there a handler semantics with which it can fully work? That's all is needed. > It depends upon the type of handler you use for the Proxy's that are form > your membrane. The default delegating handler behavior isn't what you > want. But a ForwardingHanlder should work for you. At least that's what > MarkM and TomVC tell me. After Tom initial post on this thread? Apparently not based on feedback Tom brought to the list. He had to patch the built-ins for cases where the argument of a built-in is an exotic object of a given sort. > My question still stands. What do you mean when you say "x is a Date". > What characteristics of Date are you actually trying to test. oh ok. Then the important part of my sentence is "to one algorithm" (that implicitly repeats to the other part listed exotic object types). I don't care about the exact definition used in the built-in algorithms. It just doesn't feel clean if an object can impersonate a Date (whatever definition is used) in a built-in algorithm and a RegExp (whatever definition is used) in another built-in algorithm. Maybe I just need to get over this point. That's not the major concern here. > Is this a Date according to what you have in mind: > > ```js > let obj = new Date(); > obj.__proto__ = null; > ``` The definition used in most spec algorithms is "has a this time value", so I guess this passes. > This one I have specifically discussed with Tom and Mark. It depends upon > using the right kind of handlers for you membrane. This thread feedback brings new data and it seems that the current handler offering isn't enough (and I understand can't be).