There is: nondeterministicGetWeakMapKeys, defined in TestingFunctions.cpp.
It's only available in the shell, though.


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

Reply via email to