00:31
<rkirsling>
<continuing> yeah I guess I just assumed that indirect eval could never be returned to being direct eval but apparently that's false
00:33
<shu>
yeah, it's not a taint tracking model, it's much more brilliant where we just pick on one particular identifier :P
00:34
<devsnek>
you can rename `eval` to `evil` and then you don't have to use (0, eval)
00:38
<rkirsling>
shu: lol
00:41
<devsnek>
am i the only one bothered by `promiseResolve` being after `promiseCapability` in that recent patch
00:42
<rkirsling>
devsnek: but isn't that `evil` somewhat less evil than `eval` then
00:42
<devsnek>
a non-zero amount of evil is still evil
00:58
<rkirsling>
bakkot_: devsnek: do you either of you have an opinion about what you expected eval?.() to be?
00:59
<bakkot_>
not especially
00:59
<devsnek>
i can't construct any meaningful rule about direct/indirect evals
01:34
<shu>
wait till you hear about ablative eval
01:35
<bakkot_>
eval, but every time you use it one random name in scope is removed
01:37
<shu>
that is the suffering passive
01:38
<rkirsling>
et tu eval
02:16
<rkirsling>
ugh I think I'll still create an issue before the PR just so the PR doesn't come off like an attack
03:10
<ljharb>
rkirsling: up to you, but i doubt that would be a problem
03:10
<rkirsling>
ljharb: played it safe -- https://github.com/tc39/ecma262/issues/2062 https://github.com/tc39/ecma262/issues/2063
13:10
<devsnek>
ljharb: https://www.python.org/dev/peps/pep-0622/
15:41
<jorendorff>
littledan: thanks for your comment in https://github.com/tc39/proposal-promise-any/issues/38 ... i didn't say anything, but i agree
15:42
<bradleymeck>
jridgewell: are there any major blocking points on private declarations recently
15:42
<jridgewell>
Just waiting for private fields to ship before bringing it up again
15:43
<jorendorff>
littledan: it bothered me a little bit that Mark didn't reply to https://github.com/tc39/proposal-promise-any/issues/38#issuecomment-634822974
15:44
<jorendorff>
I'd love to understand what invariant is being proposed
15:45
<bradleymeck>
jridgewell: was the `outer` contextual keyword just to remove the [] / simplify the grammar?
15:46
<jorendorff>
or ... invoked, or whatever
15:47
<bradleymeck>
jorendorff: all those internal slots are not reflected to JS as first class APIs
15:47
<jridgewell>
`outer` seems the simplest solution, and avoids me having to explain reification
15:48
<devsnek>
what is `outer`
15:48
<jridgewell>
`class Foo { [#bar] = 1 }` seems too much like I've reified the key and can use it as a value
15:48
<bradleymeck>
jorendorff: the concern is around an internal slot not being able to be intercepted via a hook like other meta-object-protocol hooks
15:48
<devsnek>
oh for shared private fields
15:48
<devsnek>
can we not just reify them as values
15:48
<bradleymeck>
jridgewell: idc either way XD, it can be reified even if it isn't in the same value space!
15:48
<jorendorff>
bradleymeck: I don't understand the "as first class APIs" part of the distinction
15:48
<bradleymeck>
lets not add value spaces
15:49
<jridgewell>
https://github.com/tc39/proposal-private-declarations
15:49
<devsnek>
why do we need first class syntax for this aaaa
15:49
<bradleymeck>
jorendorff: fn.environment isn't a thing, basically even if the internal slot stores state it isn't able to be reached by user JS
15:49
<jorendorff>
bradleymeck: [[Prototype]] has a getter (`.__proto__`)
15:50
<bradleymeck>
yes, and that has a Proxy MOP hook
15:51
<jorendorff>
bradleymeck: [[ViewedArrayBuffer]] also has a getter https://tc39.es/ecma262/#sec-get-%typedarray%.prototype.buffer
15:51
<bradleymeck>
devsnek: to get me to stop using super override?
15:51
<devsnek>
bradleymeck: i mean why are we not just making them values
15:51
<bradleymeck>
jorendorff: yes, and a review of stuff was being done by caridy about all those cases as they break membranes.
15:51
<devsnek>
making a private version of every possible use of properties seems like a poor design path
15:52
<bradleymeck>
devsnek: because lack of prototype lookup would be hella confusing
15:52
<jridgewell>
Making a private field value is difficult to get through
15:52
<devsnek>
it doesn't have to lack prototype lookup
15:52
<bradleymeck>
devsnek: i'd state it must
15:52
<devsnek>
why lol
15:52
<bradleymeck>
match fields
15:52
<devsnek>
?
15:52
<bradleymeck>
also matches weakmaps
15:53
<devsnek>
we aren't making weakmaps we're making access control
15:53
<bradleymeck>
basically private lookups in JS haven't historically been delegated
15:53
<bradleymeck>
internal slots, private fields, weak map, all of them do not delegate
15:54
<bradleymeck>
so, it should be something else if it seeks to delegate
15:54
<devsnek>
first class access control doesn't exist in js yet
15:54
<jorendorff>
i'm a little confused as to whether we're having one conversation or two
15:54
<bradleymeck>
what isn't first class?
15:54
<bradleymeck>
jorendorff: I am having 2
15:55
<jorendorff>
great
15:55
<jridgewell>
I think there are 2
15:55
<devsnek>
there was a discussion about private field syntax
15:55
<devsnek>
and i'm ranting about private symbols
15:55
<jorendorff>
bradleymeck: so another example is that Map and Set are nothing *but* methods that provide access to data stored in private slots
15:56
<bradleymeck>
jorendorff: per your topic ECMA402 was at the SES meeting (2?) times ago and wanted to plug a similar hole
15:57
<bradleymeck>
jorendorff: yes, but the concern isn't about the values themselves it is the ability to intercept things
15:57
<jorendorff>
bradleymeck: ok, intercept how?
15:57
<bradleymeck>
you can to some extent replace builtin methods to "patch" out the issue, but there is push back even within the Realms call (not just SES)
15:58
<bradleymeck>
jorendorff: replace methods with userland wrappers
15:58
<jorendorff>
bradleymeck: it should be possible to express this clearly, as an adversarial game perhaps
15:58
<jorendorff>
bradleymeck: but if there is a known technique for this (replace features on the builtin prototype) then it would work just as well for new things as for existing things
15:58
<bradleymeck>
various membranes have to do this where they freeze Map.prototype, but have to replace all the methods in order to intercept the values in/out
15:58
<bradleymeck>
jorendorff: it isn't actually applied to all kinds of membranes
15:59
<bradleymeck>
a lot of things like salesforce have much more minimal membranes and would wrap the Map as it crosses rather than each .get/.set
16:00
<devsnek>
i need to join an ses call at some point to ask about boxes for records
16:00
<bradleymeck>
its really the realms call
16:00
<bradleymeck>
like 50% of people there aren't using SES
16:00
<devsnek>
whoever it is that takes issue with boxes
16:00
<bradleymeck>
the concerns are just that you cannot intercept these internal slot lookups with a Proxy
16:00
<bradleymeck>
devsnek: thats the call you want to join
16:01
<devsnek>
which
16:01
<bradleymeck>
you can even add it to the agenda https://docs.google.com/document/d/1FZ95-NZIQE9fw3A8Sgcz2BKep6MlC_Kng0dlf1ehabQ/edit#heading=h.f8mfwudm59mq
16:02
<bradleymeck>
devsnek: its on the tc39 calendar "SES Strategy - Weekly" (had that name for years)
16:02
<devsnek>
> We had an engaging conversation with the champions of Records and Tuples, and the related proposals for deep paths and boxes.
16:02
<bradleymeck>
https://calendar.google.com/calendar/embed?src=mozilla.com_l7b50itpaa9bnrvr61nebqrne8%40group.calendar.google.com&ctz=America%2FChicago
16:02
<devsnek>
i guess there's no notes policy for these
16:02
<bradleymeck>
devsnek: they are recorded to youtube
16:02
<bradleymeck>
https://www.youtube.com/channel/UCpY91oQLh_Lp0mitdZ5bYWg/videos
16:05
<devsnek>
oh nice
16:06
<jorendorff>
bradleymeck: it's a known flaw of proxies that they can't intercept internal slot lookups. but normally the result of that is that access fails (e.g. RequireInternalSlot is attempted on a proxy; it'll always fail and throw)
16:06
<jorendorff>
bradleymeck: are we talking about some scenario in which access can't be blocked?
16:06
<devsnek>
my private symbols setup allowed you to pass symbols you wanted to intercept to the proxy constructor
16:07
<jridgewell>
https://www.youtube.com/watch?v=QzASLxg2VIk
16:07
<devsnek>
maybe something similar could be done with private fields
16:07
<bradleymeck>
jorendorff: having a 2nd context that has a builtin and running it on the value as a receiver
16:07
<devsnek>
though they'd need to be reified in some way for that
16:07
<bradleymeck>
jorendorff: join the call this week as this topic is the only agenda item?
16:08
<bradleymeck>
i'm just explaining the concern to my understanding
16:08
<jorendorff>
I'd so much rather have this written down somewhere
16:09
<jorendorff>
but maybe we can work toward that
16:09
<bradleymeck>
jorendorff: it will be recorded at least
16:09
<jorendorff>
bradleymeck: I don't see the Realms meeting on the TC39 calendar
16:09
<jorendorff>
I see an SES Strategy meeting
16:11
<bradleymeck>
jorendorff: yes thats the call. it has had that name for years / has historically been the focus but SES as a proposal has started splitting up into other things like Realms/Compartments these days
16:11
<jorendorff>
ugh, i can't make it this week, it's the one day i have an appointment i can't move :-P
16:12
<devsnek>
it would be cool if compartments had a hook for math.random
16:12
<devsnek>
either seeding it or just controlling it outright
16:12
<bradleymeck>
devsnek: just replace the global XD
16:12
<devsnek>
i guess
16:13
<bradleymeck>
Realms/Compartments are seeing pretty big pushback due to how much they do already so they got stripped down once
16:13
<devsnek>
couldn't it get access to the original by creating a new realm
16:13
<littledan>
jorendorff: We're planning on discussing this topic in the SES call tomorrow
16:14
<bradleymeck>
devsnek: yes, you have to wrap the Realm constructor :-/
16:14
<littledan>
the SES Strategy meeting
16:14
<jorendorff>
littledan: I can't make that meeting, unfortunately, but maybe someone from Moz can be there
16:14
<devsnek>
bradleymeck: also, seeding might be preferable for perf reasons
16:14
<bradleymeck>
we had a bunch of talks about how to not force people to wrap the realm constructor
16:14
<devsnek>
well its not that big a deal except for
16:14
<devsnek>
Date.now
16:14
<devsnek>
Math.random
16:14
<devsnek>
Symbol.for
16:15
<devsnek>
is there anything else
16:15
<bradleymeck>
there are a variety of things you have to wrap, but if you don't wrap then you have to make a composition model and some people didn't like that
16:15
<devsnek>
could have a hook for CreateRealm
16:16
<devsnek>
hm i guess we sort of already do with InitializeHostDefinedRealm
16:16
<bradleymeck>
could, but then it needs to nest
16:16
<devsnek>
yeah i mean realms created inside would automatically delegate to the parent for that
16:16
<bradleymeck>
a lot of the complaints are about nesting e.g. not having the same Web Settings object faces pushback from some Web standards
16:17
<jorendorff>
bradleymeck: I still don't understand this: "having a 2nd context that has a builtin and running it on the value as a receiver"
16:17
<bradleymeck>
yea, the delegation is part of the complaints, because the deeper you go the more costly it is to create another realm
16:17
<jorendorff>
bradleymeck: because applying any (non-generic) builtin to a proxy will just fail
16:17
<bradleymeck>
jorendorff: in web terms, make a same origin iframe and use the intrinsic getter function and call it on the value from the original frame
16:18
<bradleymeck>
membranes that just do deep freezing won't prevent that
16:18
<jorendorff>
bradleymeck: if there is no Proxy around the value, then I don't understand the complaint that this can't be intercepted. Of course if you don't have a proxy there, you won't be intercepting anything
16:18
<jorendorff>
if there is a Proxy around the value, the getter just won't work
16:18
<devsnek>
proposal: `import { #promiseState, #promiseResult } from 'std:private-fields/promise'; new Proxy(promise, handler, { intercept: [#promiseState, #promiseResult] })`
16:18
<bradleymeck>
jorendorff: agreed on both, but there are people not using Proxies around all values
16:19
<bradleymeck>
they only put proxies on the boundary
16:21
<jorendorff>
bradleymeck: well ... I guess I don't understand why such users would complain about private slots
16:21
<jorendorff>
if there's no proxy there... what is the expectation to be able to intercept something?
16:32
<jorendorff>
...Anyway, regardless of such details, a concrete statement of the desired rule would help
17:19
<annevk>
If someone could refactor InitializeHostDefinedRealm to not be weird that'd be great
17:30
<ljharb>
devsnek: thanks, i'll add it
17:33
<shu>
annevk: what's the weirdness?
17:41
<annevk>
shu: the way you have to allocate global and global this are rather awkward
17:47
<devsnek>
here's my idea: CreateRealm(global, thisValue)
17:47
<devsnek>
performs all the intrinsic allocation and setting of globals and stuff
17:47
<devsnek>
if a host needs to add additional properties after that it can just do that, no need to specifically make a step for it
17:56
<shu>
devsnek: i think those need to be abstract closures that do the actual creation
17:57
<shu>
since you presumably want to allocate the new stuff inside the create Realm, not outside of it
17:57
<shu>
the created*
17:57
<devsnek>
i'm not entirely sure what you mean
17:57
<shu>
annevk: how does that sound? passing in closures?
17:59
<devsnek>
do you mean a closure for performing arbitrary host setup of the realm?
17:59
<devsnek>
i'm not sure why that needs to be part of the spec
17:59
<shu>
devsnek: when hosts want to create a global object for a new Realm, it seems most natural to create the global object in the scope of the created Realm instead of somewhere else
18:00
<devsnek>
OH i see what you mean
18:00
<devsnek>
yeah that makes sense
18:02
<annevk>
shu: yeah, something like that would be good
18:02
<shu>
annevk: i'm still working on a relatively large PR that separates out the notion of a "host" as an implementation that layers with ecma262 via some set of enumerated host APIs instead of any arbitrary implementation-defined/dependent points
18:03
<shu>
annevk: i'll put this on the queue after that
18:03
<annevk>
\o/
18:26
<devsnek>
jsc people, why are all the releases missing https://webkitgtk.org/jsc-built-products/x86_64/release/
18:26
<devsnek>
rkirsling: ^
18:29
<rkirsling>
webkitgtk is its own project so you'd have to ask an Igalian that works on it
18:36
<rkirsling>
the JSCOnly builders don't have an archive upload step (https://build.webkit.org/waterfall?category=misc) but GTK build archives are located at the usual archive.webkit.org (e.g. https://build.webkit.org/builders/GTK%20Linux%2064-bit%20Release%20%28Build%29/builds/35021/steps/transfer-to-s3/logs/stdio)
18:36
<rkirsling>
so at a glance, I don't think anything for webkitgtk.org would happen automatically
18:39
<devsnek>
https://gc.gy/60728945.png
18:44
<rkirsling>
I don't know what that's coming from
18:48
<devsnek>
rkirsling: archives.webkit.org uploads a zip with README.md containing that
18:49
<devsnek>
luckily i found a way to get around that
18:49
<devsnek>
https://github.com/devsnek/esvu/commit/988ed899cd126f5faab8f63634c7459f7d2c182d
18:49
<rkirsling>
oh I see
18:52
<devsnek>
these archives are huge