----- 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

Reply via email to