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

