Thank you for your reply.

I've solved the testing problem. I can write normal JSTests with this
function.
But I get everytime the underlying Object, even if I have a proxy as Key.

Is there a better way as to test the result array for isProxy()?

If I insert more than one "transparent" Proxy for one target, I want
only to get one entry.
I will test if the correct proxy (the first inserted) is the key.

I've debugged the code and it seems so, but automated tests would be better.

Thanks a lot
Andreas

Am 29.12.2013 16:22, schrieb Andrew McCreight:
>
> ----- Original Message -----
>> There is: nondeterministicGetWeakMapKeys, defined in TestingFunctions.cpp.
>> It's only available in the shell, though.
> It is actually also available in chrome code in the browser via 
> Components.utils:
>   
> http://mxr.mozilla.org/mozilla-central/source/dom/browser-element/BrowserElementParent.jsm#78
>   
> http://mxr.mozilla.org/mozilla-central/source/toolkit/components/ctypes/tests/unit/head.js#26
>
> Andrew
>
>>
>> cheers,
>> till
>>
>>
>> On Sun, Dec 29, 2013 at 3:01 PM, Andreas Schlegel <
>> [email protected]> wrote:
>>
>>> Hello,
>>>
>>> is there any possibility to iterate through all entries of a WeakMap, or
>>> to get all key objects of a weakmap for testing purposes from JavaScript?
>>>
>>> Thanks a lot
>>> Andreas
>>>
>>> Am 27.12.2013 17:29, schrieb Andreas Schlegel:
>>>> Hello,
>>>>
>>>> I've found another hash policy for "DefaultHasher< EncapsulatedPtr<T> >".
>>>>
>>>> I've changed my implementation now and the code compiles.
>>>>
>>>> The implementation is as follows:
>>>>
>>>> // Hash policy for WeakMaps for JSObject*.
>>>> template<class T>
>>>> struct WeakMapHasher
>>>> {
>>>>     typedef EncapsulatedPtr<T>  Key;
>>>>     typedef T *Lookup;
>>>>
>>>>     static uint32_t hash(Lookup l) {
>>>>         JSRuntime * rt = JS_GetObjectRuntime(l);
>>>>         JSContext *cx = DefaultJSContext(rt);
>>>>         return DefaultHasher<T *>::hash(GetIdentityObject(cx, l));
>>>>     }
>>>>
>>>>     static bool match(const Key &k, Lookup l) {
>>>>         JSRuntime * rt = JS_GetObjectRuntime(k.get());
>>>>         JSContext *cx = DefaultJSContext(rt);
>>>>         Key kval(GetIdentityObject(cx, k.get()));
>>>>
>>>>         rt = JS_GetObjectRuntime(l);
>>>>         cx = DefaultJSContext(rt);
>>>>         Key lval(GetIdentityObject(cx,l));
>>>>
>>>>         return kval == lval;
>>>>     }
>>>>     static void rekey(Key &k, const Key& newKey) {
>>>>         k.unsafeSet(newKey);
>>>>     }
>>>> };
>>>>
>>>> typedef WeakMap<EncapsulatedPtrObject, RelocatableValue,
>>>> WeakMapHasher<JSObject> > ObjectValueMap;
>>>>
>>>> I must test the code after compilation.
>>>>
>>>> If someone knows a better way for implementation, e.g. an other
>>>> (better) way to get the JSContext of the values, I'm open for all
>>> answers.
>>>> Thanks
>>>> Andreas
>>>>
>>>> Am 27.12.2013 17:04, schrieb Andreas Schlegel:
>>>>> Hello,
>>>>>
>>>>> I've tested some options the last time to get my code running, but
>>>>> with every variation of the Hasher I get the same error messages
>>>>> during compile time.
>>>>>
>>>>> One of the implementations is as followed:
>>>>>
>>>>> // Hash policy for WeakMaps for JSObject*.
>>>>> struct WeakMapHasher : DefaultHasher<EncapsulatedPtrObject>
>>>>> {
>>>>>     typedef EncapsulatedPtrObject Key;
>>>>>     typedef Key Lookup;
>>>>>
>>>>>     static uint32_t hash(const Lookup &l) {
>>>>>         JSRuntime * rt = JS_GetObjectRuntime(l.get());
>>>>>         JSContext *cx = DefaultJSContext(rt);
>>>>>         return DefaultHasher<JSObject
>>>>> *>::hash(EncapsulatedPtrObject(GetIdentityObject(cx, l.get())));
>>>>>         //return PointerHasher<JSObject *, 3>::hash(obj) ^
>>>>>         //           PointerHasher<const Class *,
>>>>> 3>::hash(obj->getClass());
>>>>>     }
>>>>>
>>>>>     static bool match(const Key &k, const Lookup &l) {
>>>>>         JSRuntime * rt = JS_GetObjectRuntime(k.get());
>>>>>         JSContext *cx = DefaultJSContext(rt);
>>>>>         Key kval(GetIdentityObject(cx, k.get()));
>>>>>
>>>>>         rt = JS_GetObjectRuntime(l.get());
>>>>>         cx = DefaultJSContext(rt);
>>>>>         Key lval(GetIdentityObject(cx, l.get()));
>>>>>
>>>>>         return kval == lval;
>>>>>     }
>>>>>     static void rekey(Key &k, const Key& newKey) {
>>>>>         k = newKey;
>>>>>     }
>>>>> };
>>>>>
>>>>> The typedef of the WeakMap was changed as followed:
>>>>>
>>>>> typedef WeakMap<EncapsulatedPtrObject, RelocatableValue,
>>>>> WeakMapHasher> ObjectValueMap;
>>>>>
>>>>> I've the following error log:
>>>>>
>>>>>
>>> /home/fedora/workspace/mozilla/mozilla-central/js/src/jsweakmap.cpp:311:29:
>>>>> von hier erfordert
>>>>> ./dist/include/js/HashTable.h:223:34: Fehler: keine passende Funktion
>>>>> für Aufruf von »js::HashMap<js::EncapsulatedPtr<JSObject>,
>>>>> js::RelocatableValue, js::WeakMapHasher,
>>>>> js::RuntimeAllocPolicy>::lookupForAdd(const JS::Rooted<JSObject*>&)«
>>>>> ./dist/include/js/HashTable.h:223:34: Anmerkung: Kandidat ist:
>>>>> In file included from ../gc/Barrier.h:16:0,
>>>>>                  from ../jsatom.h:14,
>>>>>                  from ../vm/Runtime.h:19,
>>>>>                  from ../jscntxt.h:15,
>>>>>                  from
>>>>>
>>> /home/fedora/workspace/mozilla/mozilla-central/js/src/builtin/TypeRepresentation.h:51,
>>>>>                  from
>>>>>
>>> /home/fedora/workspace/mozilla/mozilla-central/js/src/jscompartment.h:12,
>>>>>                  from
>>>>> /home/fedora/workspace/mozilla/mozilla-central/js/src/jsweakmap.h:10,
>>>>>                  from
>>>>> /home/fedora/workspace/mozilla/mozilla-central/js/src/jsweakmap.cpp:7:
>>>>> ./dist/include/js/HashTable.h:135:12: Anmerkung: js::HashMap<Key,
>>>>> Value, HashPolicy, AllocPolicy>::AddPtr js::HashMap<Key, Value,
>>>>> HashPolicy, AllocPolicy>::lookupForAdd(const Lookup&) const [with Key
>>>>> = js::EncapsulatedPtr<JSObject>; Value = js::RelocatableValue;
>>>>> HashPolicy = js::WeakMapHasher; AllocPolicy = js::RuntimeAllocPolicy;
>>>>> js::HashMap<Key, Value, HashPolicy, AllocPolicy>::AddPtr =
>>>>> js::detail::HashTable<js::HashMapEntry<js::EncapsulatedPtr<JSObject>,
>>>>> js::RelocatableValue>, js::HashMap<js::EncapsulatedPtr<JSObject>,
>>>>> js::RelocatableValue, js::WeakMapHasher,
>>>>> js::RuntimeAllocPolicy>::MapHashPolicy,
>>>>> js::RuntimeAllocPolicy>::AddPtr; js::HashMap<Key, Value, HashPolicy,
>>>>> AllocPolicy>::Lookup = js::EncapsulatedPtr<JSObject>]
>>>>> ./dist/include/js/HashTable.h:135:12: Anmerkung:   keine bekannte
>>>>> Umwandlung für Argument 1 von »const JS::Rooted<JSObject*>« nach
>>>>> »const Lookup& {aka const js::EncapsulatedPtr<JSObject>&}«
>>>>> make[1]: *** [jsweakmap.o] Fehler 1
>>>>> make: *** [default] Fehler 2
>>>>>
>>>>> There must be something wrong with the type conversation, but I'm
>>>>> able to find the error.
>>>>> I've tested also, if the functions for getting the JSContext are
>>>>> wrong or make the error but if I implement only stubs which compare
>>>>> the given values the error occurs too.
>>>>>
>>>>> Can anyone help me to implement the Hasher for the WeakMap?
>>>>>
>>>>> Thanks a lot
>>>>> Andreas
>>>>>
>>>>> Am 21.12.2013 11:55, schrieb Andreas Schlegel:
>>>>>> Hello,
>>>>>>
>>>>>> I've another general problem, like in the "Re: [JS-internals]
>>>>>> JIT-Test: self-test/assertDeepEq.js" thread.
>>>>>>
>>>>>> I need the Context to get the value from the Proxy handler trap in
>>>>>> the HashPolicy structure, which is implemented like this (not tested
>>>>>> at the moment, because I don't know how I can get the JSContext ):
>>>>>>
>>>>>> // Hash policy for WeakMaps for JSObject*.
>>>>>> template<>
>>>>>> struct WeakMapHasher<JSObject*> : DefaultHasher<JSObject*> {
>>>>>>     typedef JSObject* Key;
>>>>>>     typedef Key Lookup;
>>>>>>
>>>>>>     static uint32_t hash(const Lookup &l) {
>>>>>>         return *GetIdentityObject(cx, *l);*;
>>>>>>     }
>>>>>>
>>>>>>     static bool match(const Key &k, const Lookup &l) {
>>>>>> *        Key kval = GetIdentityObject(cx, *k);**
>>>>>> **        Key lval = GetIdentityObject(cx, *l);*
>>>>>>
>>>>>>         return *kval == *lval;
>>>>>>     }
>>>>>> };
>>>>>>
>>>>>> The GetIdentityObject-Method need the Context to call the
>>>>>> Proxy::isTransparent() method:
>>>>>>
>>>>>> inline JSObject *
>>>>>> GetIdentityObject(JSContext *cx, JSObject &obj)
>>>>>> {
>>>>>>    ...
>>>>>> *   JS::RootedObject handleEqualsObj(cx,equalsObj);*
>>>>>>    if(!Proxy::isTransparent(*cx*, handleEqualsObj, &result) || !result)
>>>>>>    ...
>>>>>> }
>>>>>>
>>>>>> The handler function, which is called by Proxy::isTransparent()
>>>>>> needs the Context to declare a RootedValue for the trap and call
>>>>>> other functions, which needs the context:
>>>>>>
>>>>>> bool
>>>>>> ScriptedDirectProxyHandler::isTransparent(JSContext *cx,
>>>>>> HandleObject proxy, bool *bp)
>>>>>> {
>>>>>>     // step 1
>>>>>>     RootedObject handler(*cx*, GetDirectProxyHandlerObject(proxy));
>>>>>>
>>>>>>     // step 2
>>>>>>     JSString* propStr = JS_InternString(*cx*, "isTransparent");
>>>>>>     JSAtom& atom = propStr->asAtom();
>>>>>>     *RootedValue trap(cx);*
>>>>>>     if (!JSObject::getProperty(*cx*, handler, handler,
>>>>>> atom.asPropertyName(), &trap))
>>>>>>         return false;
>>>>>>    ...
>>>>>>     *RootedValue trapResult(cx);*
>>>>>>     if (!Invoke(*cx*, ObjectValue(*handler), trap, 0, argv,
>>>>>> &trapResult))
>>>>>>         return false;
>>>>>>    ...
>>>>>> }
>>>>>>
>>>>>> How can I get here the needed JSContext?
>>>>>>
>>>>>> Thanks a lot
>>>>>> Andreas
>>>>>>
>>>>>> Am 20.12.2013 18:07, schrieb Andreas Schlegel:
>>>>>>> Hello,
>>>>>>>
>>>>>>> thank you for your answer.
>>>>>>>
>>>>>>> First I will change the WeakMap.
>>>>>>>
>>>>>>> If I change the typedef for ObjectValueMap, I have to remove also
>>>>>>> the default value for the HashPolicy of the WeakMap (jsweakmap.h),
>>>>>>> I'm right?
>>>>>>>
>>>>>>> template <class Key, class Value,  class HashPolicy =
>>>>>>> DefaultHasher<Key> >
>>>>>>> class WeakMap : public HashMap<Key, Value, HashPolicy,
>>>>>>> RuntimeAllocPolicy>, public WeakMapBase
>>>>>>>
>>>>>>> Have I to implement more than one template, if I want to
>>>>>>> distinguish between JSObject and the other types?
>>>>>>> I want only change the behaviour for JSObject and JSObject*,
>>>>>>> because only this types can be a Proxy type.
>>>>>>>
>>>>>>> In the HashTable.h are three implementations:
>>>>>>>
>>>>>>>   * a generic one for pointer types
>>>>>>>   * a generic one for Class Types
>>>>>>>   * one for double Types
>>>>>>>
>>>>>>> Can I implement something like this:
>>>>>>>
>>>>>>> template <class Key>
>>>>>>> struct WeakMapHasher : DefaultHasher
>>>>>>> {
>>>>>>> ...
>>>>>>> }
>>>>>>>
>>>>>>> template <>
>>>>>>> struct WeakMapHasher<JSObject> : DefaultHasher<JSObject>
>>>>>>> {
>>>>>>> ...
>>>>>>> }
>>>>>>>
>>>>>>> template <>
>>>>>>> struct WeakMapHasher<JSObject*> : DefaultHasher<JSObject*>
>>>>>>> {
>>>>>>> ...
>>>>>>> }
>>>>>>>
>>>>>>> And change the implementation of hash() and match()?
>>>>>>>
>>>>>>> Thanks a lot
>>>>>>> Andreas
>>>>>>> Am 19.12.2013 19:58, schrieb Jason Orendorff:
>>>>>>>> On 12/19/13 3:21 AM, Andreas Schlegel wrote:
>>>>>>>>> Hello Jason,
>>>>>>>>>
>>>>>>>>> for comparing "transparent" proxies I have to change some things for
>>>>>>>>> WeakMap Map and Set.
>>>>>>>>>
>>>>>>>>> I should compare the key from a transparent Proxy with its object,
>>> e.g.
>>>>>>>>> for getting the value .
>>>>>>>>>
>>>>>>>>> I found the lookup is in the HashTable.h in the Folder JS/public
>>> may I
>>>>>>>>> change something there, or are this includes from somewhere?
>>>>>>>>>
>>>>>>>> (adding the list)
>>>>>>>>
>>>>>>>> Don't change js/public/HashTable.h.
>>>>>>>>
>>>>>>>> For Map and Set, you have to change hash() and match() methods in
>>>>>>>> builtin/MapObject.h and .cpp.
>>>>>>>>
>>>>>>>> For WeakMap, I think you need to modify js/src/vm/WeakMapObject.h.
>>> You
>>>>>>>> need to add a struct that is a hash policy (as defined in comments in
>>>>>>>> js/public/HashTable.h) and implements hash() and match() correctly
>>> for
>>>>>>>> your purpose. Then change this line:
>>>>>>>>
>>>>>>>>     typedef WeakMap<EncapsulatedPtrObject, RelocatableValue>
>>> ObjectValueMap;
>>>>>>>> to pass your new hash policy as the third parameter. (The default
>>>>>>>> HashPolicy has hash() and match() methods based on pointer equality.
>>> You
>>>>>>>> must provide an explicit hash policy to override that.)
>>>>>>>>
>>>>>>>> -j
>>>>>>>>
>>>>>>>>
>>> _______________________________________________
>>> dev-tech-js-engine-internals mailing list
>>> [email protected]
>>> https://lists.mozilla.org/listinfo/dev-tech-js-engine-internals
>>>
>> _______________________________________________
>> dev-tech-js-engine-internals mailing list
>> [email protected]
>> https://lists.mozilla.org/listinfo/dev-tech-js-engine-internals
>>
> _______________________________________________
> dev-tech-js-engine-internals mailing list
> [email protected]
> https://lists.mozilla.org/listinfo/dev-tech-js-engine-internals

_______________________________________________
dev-tech-js-engine-internals mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-js-engine-internals

Reply via email to