Welcome to the main channel on the development of MoarVM, a virtual machine for NQP and Rakudo (moarvm.org). This channel is being logged for historical purposes.
Set by lizmat on 24 May 2021.
00:07 reportable6 left 00:08 reportable6 joined 00:36 jnthnwrthngtn left 00:37 jnthnwrthngtn joined 01:38 timo left 01:55 frost joined 02:34 frost left 02:37 frost joined 03:37 coverable6 left, unicodable6 left, evalable6 left, greppable6 left, benchable6 left, bisectable6 left, statisfiable6 left, tellable6 left, committable6 left, nativecallable6 left, shareable6 left, quotable6 left, sourceable6 left, notable6 left, releasable6 left, linkable6 left, reportable6 left, bloatable6 left, squashable6 left 03:38 greppable6 joined, bloatable6 joined, statisfiable6 joined 03:39 releasable6 joined, notable6 joined, nativecallable6 joined, unicodable6 joined, committable6 joined, quotable6 joined, shareable6 joined 03:40 sourceable6 joined, benchable6 joined, squashable6 joined 04:31 frost left 04:39 linkable6 joined, bisectable6 joined 05:39 evalable6 joined
Nicholas good *, * 07:00
lizmat /o Nicholas 07:04
08:08 reportable6 joined 08:40 tellable6 joined
Nicholas I assume that it's (relatively) sensible to merge the C11 atomics stuff now? 08:42
releasable6: help
releasable6 Nicholas, status | status link # See wiki for more examples: github.com/Raku/whateverable/wiki/Releasable
Nicholas releasable6: status
releasable6 Nicholas, Next release in ≈3 days and ≈10 hours. 1 blocker. Changelog for this release was not started yet
Nicholas, Details: gist.github.com/b445ca955c46fd8aed...8463e4ed7a
Nicholas but the atomics stuff is optional, and default off, so it seems safe
nine I say go for it 08:48
Geth__ MoarVM/master: 6 commits pushed by (Nicholas Clark)++ 11:38
11:40 coverable6 joined
MasterDuke so changing `!$obj.prec<iffy>` to `!nqp::getattr($obj.prec,Map,'$!storage')<iffy>` here github.com/rakudo/rakudo/blob/mast....nqp#L2745 causes the segfault not to happen 12:05
but that seems like masking over an underlying problem. i.e., why don't all infixes cause a segfault? 12:07
12:07 reportable6 left
MasterDuke maybe the difference is that only infixes that return an empty hash from .prec cause the segfault? 12:10
m: dd &infix:<< +> >>.prec; dd &infix:<< +< >>.prec; dd &infix:<< +| >>.prec; dd &infix:<< ~< >>.prec; 12:12
camelia {}
{:assoc("left"), :prec("t=")}
nine But still, none of these may even cause a segfault.
MasterDuke those are just some examples. it looks like anything that returns {} from .prec will segfault, but other things do
nine i.e. they are not allowed to 12:13
MasterDuke oh yeah, definitely
but i think it's something in dispatching. disabling spesh doesn't change anything 12:14
i.e., dispatch is not de-containerizing in some cases 12:18
oh interesting. rakudo 2021.09 + that change in Optimizer.nqp segfaults also. so not new-disp's fault 12:23
13:09 reportable6 joined 13:38 kjp left
MasterDuke adding `if (!del) die_no_ass_del(tc, st);` here github.com/MoarVM/MoarVM/blob/mast...ue.c#L1468 measn' 13:46
s/measn'/fixes the segfault/ 13:47
which is good.but i still don't know why it's getting the wrong repr anyway 13:48
nine It's getting the wrong repr?
MasterDuke well, it's a P6opaque. STABLE(obj)->debug_name == "Hash" 13:49
so for some of the infixes `.prec` returns a BOOTHash/VMHash. but when it's empty, it's an HLL hash 13:50
13:51 kjp joined
MasterDuke adding `trait_mod:<is>(&infix:«+<»,  :prec($multiplicative));` here github.com/rakudo/rakudo/blob/mast...ce.pm6#L67 also fixes the segfault (with a stock MoarVM) 14:11
and then `dd &infix:<< +> >>.prec` prints `{:assoc("left"), :prec("u=")}` 14:12
that change passes a spectest 14:16
let's see if i can sum up where things stand: `&infix:«+<»` didn't have its precedence set, therefore the call to `.prec` went through Code's method prec, which simple returns `my %`, which is an HLL hash and the optimizer can't operate on them directly, so the atkey goes through P6opaque and that's where the segfault happens because it's 14:24
ass_del_slot != -1, but get_obj_at_offset() still returns 0x0
the missing precedences in precedence.pm6 seems like an accidental omission, so those should be added, and that nicely fixes the segfault 14:27
anything else i'm not sure about
i don't know if there's some problem with `my %`, but it's only used a couple other times in rakudo 14:29
heh. removing those added precedences and instead changing github.com/rakudo/rakudo/blob/mast...de.pm6#L25 to `my % = ()` also fixes the segfault 14:33
interesting, there's definitely different ast for a sub returning `my %` vs `my % = ()` 14:37
gist.github.com/MasterDuke17/a8f3e...f6f7e8d3d3 not the easiest thing to read in a gist, but a vimdiff of the only relevant different in the asts 14:39
vrurg BTW, I was looking into feasibility of doing coercions via new-disp and it seems making little to no sense. The part with fallback to .COERCE and .new depends on value being coerced and this we barely can cache with new-disp. 15:19
15:29 linkable6 left 15:31 linkable6 joined 15:38 squashable6 left
jnthnwrthngtn vrurg: What do you mean by "the value being coerced"? The value itself, or the type of the value? 15:45
vrurg jnthnwrthngtn: The value itself. Custom methods may have `where` blocks, for example. 15:47
15:47 patrickb left
jnthnwrthngtn Hm, but what are the semantics of whether we use COERCE or new? 15:48
15:48 patrickb joined
vrurg can we .Type -> then .COERCE($value) -> then .new($value) 15:49
.Type is doable.
And the thing I've missed and realized in about 10mins after the first message – I still can iterate method candidates and make sure there are no post-constraints attached to the parameter. 15:50
This would probably be 90%+ of all cases. 15:51
Then the only possible issue is if a method gets wrapped at run-time. But this we can explicitly spec as compile-time possibility only due to optimization needs. 15:52
MasterDuke huh. why don't the precedences in src/core.c/precedence.pm6 always match the ones in src/Perl6/Grammar.nqp ? 16:13
e.g., `my Mu $methodcall       := nqp::hash('prec', 'y=');` vs `my %methodcall      := nqp::hash('prec', 'y=', 'assoc', 'unary', 'dba', 'methodcall', 'fiddly', 1);` 16:14
16:15 kjp left
MasterDuke `%named_unary` is missing entirely from precedence.pm6 16:15
jnthnwrthngtn vrurg: What, so if multi-dispatch to COERCE fails then we try `new`? 16:20
MasterDuke would there be any reason not to have the table and info in precedence.pm6 exactly match what's in Grammar.nqp? 16:31
16:38 squashable6 joined
vrurg jnthnwrthngtn: Kind of. If .cando($value) on target type COERCE fails. 16:43
I'll be afk for a couple of hours. 16:44
16:47 kjp joined
nine MasterDuke: oh, so there's probaby 2 bugs here. The severe one where MoarVM's at_key assumes without checking that if there's an associative delegate attribute, it's also initialized, leading to the segfault and the triggering one in the optimizer which expects a low level hash but gets an HLL one 16:54
MasterDuke for the first, is adding `if (!del) die_no_ass_del(tc, st);` (or a throw with a different error message) here github.com/MoarVM/MoarVM/blob/mast...ue.c#L1468 a correct fix? or should something more complicated be done? 16:59
for the second, i have no idea
nine MasterDuke: I'm leaning towards returning tc->instance->VMNull instead of throwing an exception. The type after all does support associative operations. It's just that there's no data yet, so we ought to pretend that there's just an empty hash there. 17:05
MasterDuke: for the thing in the optimizer, unless nqp::ishash($hash) { $hash := $hash.FLATTENABLE_HASH(); } seems to be the idiom for "downgrading" a possible HLL hash 17:06
17:17 kjp left 17:24 linkable6 left, linkable6 joined
lizmat I've merged MasterDuke's PR 17:25
please note that in RakuAST all of that precedence stuff is kept in *one* place :-)
nine I for one welcome our new AST overloards! 17:35
18:07 reportable6 left, reportable6 joined 18:10 kjp joined 19:51 nebuchadnezzar left, nebuchadnezzar joined
MasterDuke ah, that'll be nice 20:40
guess i won't bother syncing up the two places now 20:41
nine: re the optimizer, that sort of seems like papering over a problem, given that changing the `my %` to `my % = ()` makes the hash non-HLL 20:42
21:41 linkable6 left, evalable6 left 21:42 evalable6 joined, linkable6 joined 22:13 discord-raku-bot left 22:14 discord-raku-bot joined 22:18 discord-raku-bot left, discord-raku-bot joined