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:02
reportable6 left
01:03
reportable6 joined
02:01
squashable6 left
03:03
squashable6 joined
03:14
frost joined
04:38
evalable6 left,
linkable6 left,
evalable6 joined
05:40
linkable6 joined
06:02
reportable6 left
06:03
reportable6 joined
07:11
frost left
07:27
squashable6 left
08:03
timo left
|
|||
Nicholas | good *, #moarvm | 08:26 | |
09:25
linkable6 left,
evalable6 left
09:28
linkable6 joined
09:29
squashable6 joined
10:27
evalable6 joined
10:45
frost joined
11:05
Altai-man joined
11:46
lizmat_ joined
11:47
TempIRCLogger left
11:48
nebuchad` joined,
lizmat_ left,
lizmat_ joined
11:50
TempIRCLogger joined
11:51
bartolin_ joined,
Util_ joined,
RakuIRCLogger joined
11:55
lizmat_ left,
lizmat_ joined,
lizmat left,
gfldex left,
bartolin left,
JRaspass left
11:56
nebuchadnezzar left,
Nicholas left,
Util left,
gfldex_ joined,
lizmat_ left,
lizmat joined,
Nicholas joined
12:02
reportable6 left
12:03
JRaspass joined
12:06
frost left
13:05
reportable6 joined
13:56
squashable6 left
13:58
squashable6 joined
14:27
leonzh joined
|
|||
nine | Funny observation. That "expected Int but got Str" error disappears when I run with --ll-exception. Or rather, it still happens as normal part of trying to bind to a multi candidate. But it's not reported and instead we continue testing the next candidate (which then succeeds) | 14:36 | |
lizmat | that *is* werid | 14:39 | |
*weird even | |||
leonzh | Hello, I plan to use MoarVM in a tiny indie game. If I plan to use only the interpreter, does the dynamic optimizer also optimize the bytecode for the interpreter? (like type specialization etc,) If so, that would be great. | 14:42 | |
nine | Weird as it may be, it is the first clue that makes sense. This is after all about extremely fragmented call stacks. A call stack cleanup issue with regards to exceptions could explain this multi dispatch issue | ||
leonzh: it does | 14:43 | ||
leonzh | =D nice! | ||
nine | Oh the crucial difference is actually that we're calling bind_sig instead of try_bind_sig | 15:03 | |
vrurg | nine: BTW, what's the semantic difference between the two? When try_bind_sig is used? | 15:12 | |
nine | Well try_bind_sig should not throw an exception and just return success or failure instead | 15:13 | |
vrurg | Ok, thanks! grep will tell where it's used. :) | 15:14 | |
nine | Oh, wait a minute. The generated bytecode is identical. We first do a try_bind_sig, and only if that succeeds we're supposed to do a bind_sig. | 15:18 | |
15:19
Kaiepi left
|
|||
lizmat | wasn't the idea to only do that once ? | 15:22 | |
I mean, if the bind_sig succeeded, to use the result immediately ? | |||
nine | Maybe that's NYI for destructuring | 15:23 | |
jnthnwrthngtn | It uses the slow-path binder, but it still doesn't repeat the work | 15:29 | |
Assuming we're talking about actual calls | |||
nine | This is weird....in the failing case we never call try_bind_sig | 15:30 | |
jnthnwrthngtn | Capture to signature smart-matching always goes through the slow-path binder for example | ||
15:31
leonzh left
|
|||
nine | Ah, got it! MVMCallStackRecord *under_frame = frame_rec->prev; | 15:34 | |
under_frame is a callstack region record, but we're looking for the bind control record | |||
and fixed | 15:36 | ||
(on the assumption that a region start record is the only thing that can get in between that bind control record and the frame record) | 15:37 | ||
jnthnwrthngtn | Yes, I don't think a continuation tag could get in there | 15:40 | |
Maybe we need to extract a "next_significant_record" or similar function | |||
nine | Well, this is already using the callstack iterator | 15:42 | |
jnthnwrthngtn | ah, OK | 15:55 | |
16:08
Kaiepi joined
|
|||
Nicholas | Um, quiz question - I shouldn't be able to get to "MoarVM panic: Internal error: Unwound entire stack and missed handler | 16:46 | |
" | |||
jnthnwrthngtn | No, although I think some cases of native callbacks leaking exceptions can lead to that | 16:49 | |
Nicholas | I will see if I can reduce it a bit | ||
jnthnwrthngtn | I thought we got a better error for it, but apparently not | ||
Well, or we lost it somewhere along the way | 16:50 | ||
Nicholas | It's a return inside a Cro get handler | ||
jnthnwrthngtn | Oh. | ||
Nicholas | Yes. I thought roughly this too | ||
jnthnwrthngtn | Yeah, you'll need to use a sub, not a block | ||
Nicholas | at least, I added a few lines which I thought were innocent | ||
jnthnwrthngtn | Since `return` binds to the enclosing `sub` | 16:51 | |
Nicholas | ah OK. But still, it shouldn't panic? | ||
jnthnwrthngtn | I suspect you have something like `sub routes() { route { get -> { return } } }` or similar | ||
No, it should complain that the handler is not in dynamic scope | 16:52 | ||
(The sub that the `return` binds to was already exited) | |||
Nicholas | Do I need to make a better test case? | ||
jnthnwrthngtn | m: sub foo() { -> { return 42 } }; foo()() | ||
camelia | Attempt to return outside of immediately-enclosing Routine (i.e. `return` execution is outside the dynamic scope of the Routine where `return` was used) in block <unit> at <tmp> line 1 |
||
jnthnwrthngtn | So there it works | ||
But I wonder if this is because the `get` block runs on another thread | |||
m: sub foo() { start { return 42 } }; foo(); sleep 1; | 16:53 | ||
camelia | Unhandled exception in code scheduled on thread 4 Attempt to return outside of immediately-enclosing Routine (i.e. `return` execution is outside the dynamic scope of the Routine where `return` was used) in block at <tmp> line 1 |
||
jnthnwrthngtn | Nope | ||
Yes, I think we'll need it golfed | |||
Since the basic cases work fine | |||
Nicholas | OK. I'm going to eat first. And possibly other | 16:54 | |
but I do have 2 crates of beer in stock, so I can take my time... | |||
jnthnwrthngtn | It's important to other enough. | ||
Especially on a Friday. | |||
jnthnwrthngtn has plenty of other in the beer fridge too :) | 16:55 | ||
17:47
Colt left,
Colt joined
17:56
Colt left
17:59
Colt joined
18:02
reportable6 left
18:07
Colt left,
Colt joined
18:38
[Coke] left
|
|||
Nicholas | jnthnwrthngtn: sub MAIN() { ... } is important to the panic. I can golf it to this: paste.scsys.co.uk/596213 | 18:42 | |
I don | |||
I don't know how to golf the Cro out of that. | |||
18:43
Altai-man left
|
|||
Nicholas | In that, I suspect it's what Cro is doing with threads and supplies, but I don't know what the important shape is that triggers the panic | 18:43 | |
One gets the panic when the route is run - ie GET localhost:10000/notifications | |||
18:45
[Coke] joined
|
|||
Nicholas | doesn't need to be the implicitly called MAIN - having the code in a sub foo and then calling that does the trick too | 18:58 | |
jnthnwrthngtn | ohh | 19:17 | |
m: sub { await start return }() | |||
camelia | MoarVM panic: Internal error: Unwound entire stack and missed handler | ||
jnthnwrthngtn | So it's important the sub is in dynamic scope on a *different* thread | 19:18 | |
And that's why the simpler golf didn't nail it | 19:19 | ||
Nicholas | wow, your golf is so much shorter than mine. But I would never have got to it | 19:22 | |
20:57
colemanx left
21:01
colemanx joined
21:03
reportable6 joined
22:03
evalable6 left
22:11
[Coke] left
22:13
[Coke] joined
22:34
kjp joined
22:45
squashable6 left
23:31
dogbert11 left,
dogbert11 joined
23:53
lizmat_ joined,
RakuIRCLogger left,
TempIRCLogger left
23:54
Geth left,
lizmat left
|