Fair enough. :) I prefer to do something different, but I take your point. IMO WeakMap is not that useful in js (which also applies to ObjectMap), compared to how a Dictionary with weak keys was useful in flash. It still has some usefulness, but not to the same degree, because if there is any iteration over keys ( often the case with Dictionary instances in legacy code) then WeakMap is not an option, so a lot of the time it has been necessary to use Map with strong keys even in the case of weak keys in the original Dictionary code. When I am porting, I try to keep as much of the original code as possible the same. Dictionary is an example of one minor pain point where things do need to change in all the usage sites (unless it is a string-keys only, and you switch it to use a plain object, something which would have been equally possible in the original flash/flex code). I do hope to avoid the need to change the code in future support (the compiler will expand the [] access to get/set calls and delete operator to delete call), and also to get iteration over weak keys working, but it will very likely be slower than ObjectMap or using native Map.
On Sun, Nov 14, 2021 at 1:52 PM Edward Stangler <estang...@bradmark.com> wrote: > > ObjectMap hides the whole WeakMap vs. Map vs. Object / any stuff, so it > just seems convenient, while still trying to be performant and reducing > strong references. > > Worked well for XMLNotifier. > > > > On 11/13/2021 6:12 PM, Greg Dove wrote: > > Using ObjectMap could be an option if you want both SWF and JS code to > run, > > but is not really warranted IMO if the main goal is to migrate away from > > SWF, because the api is the same as Map, and is indirect use of the Map > - > > so why add the extra overhead? Also if you can avoid switching the > original > > code to the new api in some cases, when all that is needed (for string > > keys) is an object hash, so that's why I think that's a bit easier. After > > porting 8 or 9 codebases now, this is simply the approach I have settled > on > > in these cases. > > > > What I hope to do is get something similar to work, but for it to use the > > original dynamic access that works for flash.utils.Dictionary for both > > targets instead of switching both implementations to use the approach > that > > Map uses (get/set/delete methods). That's not possible simply using > > javascript Proxy, but it will be possible using some compiler smarts and > > internal use of WeakRef in js implementation in the case of weak keys. > > Something for later... > > > > > > > > > > > > On Sun, Nov 14, 2021 at 12:57 PM Edward Stangler > > wrote: > > > >> Why not use org.apache.royale.utils.ObjectMap? > >> > >> > >> > >> On 11/13/2021 3:24 PM, Greg Dove wrote: > >>> Sure, if you want, Andrew. This is the way I do it currently, and in > some > >>> cases this has been done within the current framework code (e.g. in > Crux > >>> code there is some use of Map to replace Dictionary in js, iirc) > >>> > >>> I do expect to come up with an approach that works much closer to the > >>> original flash Dictionary using a combination of compiler support, > >> similar > >>> to thej [RoyaleArrayLike] support and framework code (which would use > the > >>> relatively recent WeakRef support in js). > >>> I also believe it will be possible to match flash event listener apis > >> with > >>> support for weak listeners (also using WeakRef - and I would add event > >>> priority support at the same time). > >>> But both of these updates would be opt-in and would only be for quite > >>> modern browsers, but would allow for more unchanged code when porting > >>> legacy apps. At the moment these are just ideas/vague plans, I need to > >> find > >>> the time for that. > >>> > >>> > >>> > >>> > >>> On Sun, Nov 14, 2021 at 10:07 AM Andrew Wetmore wrote: > >>> > >>>> Greg, can I throw that into documentation as a workaround? > >>>> > >>>> On Sat., Nov. 13, 2021, 4:45 p.m. Greg Dove, wrote: > >>>> > >>>>> Hi Hugo, > >>>>> > >>>>> I might change this in the near future. But for now, here is the > >> general > >>>>> 'rule of thumb' that I use: > >>>>> > >>>>> If the instance only has string keys (or int/uint/Number/Boolean keys > >>>>> should be ok too) then use a plain Object. All code can pretty much > >> then > >>>>> remain unchanged. > >>>>> > >>>>> If it is using object instances (any complex object like functions or > >>>> class > >>>>> instances, or generic object instances) as keys, then > >>>>> > >>>>> a) use native js Map if the original constructor argument does not > have > >>>>> weakKeys=true, or if it has weakKeys= true and there is any form of > >>>>> iteration over keys (you cannot iterate over keys in a WeakMap in > >>>>> javascript) > >>>>> > >>>>> b) otherwise use WeakMap. > >>>>> > >>>>> Both (a) and (b) require you to change code for get/set ([] > >>>>> access/assignment in as3) or delete operator, and also code related > to > >>>>> iteration (use map.forEach in js). > >>>>> see docs for those: > >>>>> > >>>>> > >> > https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map > >> > https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap > >>>>> > >>>>> > >>>>> On Sun, Nov 14, 2021 at 9:34 AM Hugo Ferreira < > hferreira...@gmail.com> > >>>>> wrote: > >>>>> > >>>>>> Hi, > >>>>>> > >>>>>> I see that there is no Dictionary on Royale, probably because there > is > >>>> a > >>>>>> better method. > >>>>>> What the approach in Royale for a Dictionary ? > >>>>>> > >> > >