Hello Till,

thank you for your reply.

Can you explain me how can I use this function?
I use only the Spidermonkey part of mozilla-central repository. At the
moment I write JSTests in JavaScript.
Have I to write JSAPI-Tests to use it directly over C++, or how can I
write a JavaScript test using this function?

Thanks a lot
Andreas

Am 29.12.2013 15:18, schrieb Till Schneidereit:
> 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] <mailto:[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]
>     <mailto:[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