Hello,

yes you're right, the problem of the contracts researched by prof.
Thiemann was, that the targets behind the proxies could not be compared
by == and ===.

How can I merge contracts of multiple proxies and represent them by just
a single proxy, if I cannot compare them (or get the target)?

We have discussed first an approach with new operators spezific to proxy
comparism but this is not the way.
If I can include a trap for asking the proxy if he's transparent or not,
it is possible to use the same operators by asking the proxy.

Best regards
Andreas

Am 03.12.2013 12:08, schrieb Tom Van Cutsem:
> 2013/12/2 Mark S. Miller <erig...@google.com <mailto:erig...@google.com>>
>
>     Why not use the identity-preserving membrane pattern?
>
>
> I believe the issue is that they have different "contract" proxies
> pointing to the same target object. Even with the membrane pattern,
> you would have distinct wrappers, one for each type of contract. To
> obtain identity on both sides of the membrane, the "contract" proxies
> would need to be merged (e.g. by taking the union of the 2 contracts,
> if that's at all possible).
>
> I believe the open research question here is when and how contracts
> could be merged to preserve strong object identity (because the merged
> contracts can be represented by just a single proxy). I don't think
> weakening object identity (which is the current proposal we're
> debating) is going to really improve things.
>
> Cheers,
> Tom
>  
>
>
>
>     On Mon, Dec 2, 2013 at 10:36 AM, Andreas Schlegel
>     <schlegel.andr...@gmail.com <mailto:schlegel.andr...@gmail.com>>
>     wrote:
>
>         Hello Tom,
>
>         you're right I'm working with prof. Peter Thiemann.
>
>         The intention was to compare the targets not the proxy, if the
>         isTransparent trap is set, but your right I haven't observed
>         your case. But I think also the developer have to decide, if
>         he want to implementation the trap.
>
>         The problem of prof. Peter Thiemann is, that the Proxies
>         aren't really transparent and in an environment with multiple
>         proxies for one target he cannot compare them. I think also it
>         would be nice to give an alternative with an really
>         transparent proxy. In my opinion this could also be a new
>         variation of proxies, but this is my opinion.
>
>         Is it eventually possible to include a check for the
>         isTransparent trap into the get trap to get either the target,
>         if wanted, or the error?
>
>         At the moment I've changed the LooselyEqual and StrictlyEqual
>         methods of the Interpreter.cpp to get the target instead of
>         the proxy. But after a chat in the jsapi IRC today, I know I
>         need to change a lot more in the JIT to get all Fast Path
>         cases for == and ===.
>
>         If there is a way to change only a part of the Proxy API
>         instead, e.g. the get trap, to get the target, if wanted. It
>         would be really nice.
>
>         Thank you for your feedback, I hope I don't work against your
>         opinion.
>
>         Best regards,
>         Andreas
>
>
>         Am 02.12.2013 18:10, schrieb Tom Van Cutsem:
>>         Hello Andreas,
>>
>>         I'm not going to give implementation-level advice but as one
>>         of the designers of the Proxy API rather some high-level
>>         feedback on your proposal:
>>
>>         I assume you're working with prof. Peter Thiemann who has
>>         been using proxies to implement contracts in JavaScript, so I
>>         think I know where you're coming from.
>>
>>         Nevertheless, I'm not sure whether your goal of allowing
>>         proxies to intercept the '==' and '===' operators _in
>>         general_ makes much sense.
>>
>>         Consider:
>>
>>         var target = { x: 42 };
>>         var p1 = new Proxy(target, { isTransparent: function() {
>>         return true; } }); // a transparent forwarding proxy
>>         var p2 = new Proxy(target, {get: function() { throw new
>>         TypeError(); } });
>>
>>         In this case,
>>
>>         p1.x === 42
>>         p2.x // throws TypeError
>>
>>         Yet, you want to make it possible for p1 and p2 to be
>>         identity-equal (if they implement your isTransparent() trap).
>>
>>         I believe this will go against the expectations of most code,
>>         which assumes that if p1 and p2 are identity-equal, one
>>         should be able to substitute p1 for p2 without any observable
>>         difference.
>>
>>         Is it really necessary to make a general extension to proxies
>>         to make your use case work?
>>
>>         Best regards,
>>         Tom
>>
>>         2013/12/1 Brendan Eich <bren...@mozilla.com
>>         <mailto:bren...@mozilla.com>>
>>
>>             This just came in on the SpiderMonkey internals dev list
>>             -- can you provide guidance? Feel free to bounce to
>>             es-discuss. Thanks,
>>
>>             /be
>>
>>             Begin forwarded message:
>>
>>>             *From:* schlegel.andr...@gmail.com
>>>             <mailto:schlegel.andr...@gmail.com>
>>>             *Date:* December 1, 2013 at 11:16:56 AM GMT
>>>             *To:* dev-tech-js-engine-internals@lists.mozilla.org
>>>             <mailto:dev-tech-js-engine-internals@lists.mozilla.org>
>>>             *Subject:* *[JS-internals] Transparency of JavaScript
>>>             Proxies*
>>>
>>>             Hello,
>>>
>>>             I'm a student at the university of Freiburg.
>>>
>>>             I write my master thesis about transparency of
>>>             JavaScript proxies.
>>>
>>>             The topic is, that the proxies are not really
>>>             transparent, because the Equal-Operators (== and ===)
>>>             compare the references of the proxies and not of the
>>>             targets. Also the WeakMap uses the proxy as key and
>>>             don't allow the target also as key, if a proxy was inserted.
>>>
>>>             First Question:
>>>             ---------------
>>>             I should implement an addition for the Proxy API in form
>>>             of a new Handler Trap, which says if a proxy is really
>>>             transparent or not.
>>>
>>>             The trap should look like this:
>>>
>>>             var handler = {
>>>                isTransparent: function(){
>>>                    return true;
>>>                }
>>>             };
>>>
>>>             With this trap I should change the operators for
>>>             comparing either the target or the proxy, dependent of
>>>             the result of the trap.
>>>
>>>             I've implemented the following Methods for the
>>>             BaseProxyHandler and Proxy:
>>>
>>>             bool
>>>             BaseProxyHandler::isTransparent(JSContext *cx,
>>>             HandleObject proxy, bool *bp)
>>>             {
>>>                return Proxy::isTransparent(cx, proxy, bp);
>>>             }
>>>
>>>             bool
>>>             Proxy::isTransparent(JSContext *cx, HandleObject proxy,
>>>             bool *bp)
>>>             {
>>>                JS_CHECK_RECURSION(cx, return false);
>>>                return
>>>             proxy->as<ProxyObject>().handler()->isTransparent(cx,
>>>             proxy, bp);
>>>             }
>>>
>>>             How can I integrate the new trap into the proxy?
>>>             I've found the "const Class
>>>             js::ObjectProxyObject::class_" must I do an new entry
>>>             for the trap?
>>>
>>>
>>>             Second Question:
>>>             ---------------
>>>             I've found the "static JSObject *
>>>             proxy_WeakmapKeyDelegate(JSObject *obj)". Can I make a
>>>             trap to use a Proxy as key in a WeakMap but use the
>>>             target to get the value with this method?
>>>
>>>             Third Question:
>>>             ---------------
>>>             Is there a documentation for the Proxy API specific to
>>>             the C++ implementation?
>>>
>>>             Thanks a lot
>>>
>>>             Andreas Schlegel
>>>             _______________________________________________
>>>             dev-tech-js-engine-internals mailing list
>>>             dev-tech-js-engine-internals@lists.mozilla.org
>>>             <mailto:dev-tech-js-engine-internals@lists.mozilla.org>
>>>             https://lists.mozilla.org/listinfo/dev-tech-js-engine-internals
>>
>>
>
>
>
>
>     -- 
>         Cheers,
>         --MarkM
>
>

_______________________________________________
dev-tech-js-engine-internals mailing list
dev-tech-js-engine-internals@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-tech-js-engine-internals

Reply via email to