Geth MoarVM/main: c1d1f60e71 | (Daniel Green)++ | 3 files
Fix format specifiers clang on OSX complains about
00:36
MoarVM/main: f4680765ff | MasterDuke17++ (committed using GitHub Web editor) | 3 files
Merge pull request #1876 from MasterDuke17/fix_printf_format_specifiers_clang_on_osx_complains_about

Fix format specifiers clang on OSX complains about
02:08 guifa joined
guifa so my journey on multicast has brought me to the innards of MoarVM. I'm going to try to cobble together something that works -- seems to be *fairly* straightforward 02:10
whoa I think I got it 04:39
it's kind of cludged together and ugly, but it works
Would it be best for me to submit a PR as is, get feedback, and adjust the code per feedback or ? 04:57
ab5tract guifa: seems like a reasonable approach to me 05:04
guifa ab5tract typing it up now and will submit as a draft pull request (forgot that those were a thing) 05:05
Geth MoarVM: alabamenhu++ created pull request #1878:
Preliminary multicast support
05:14
09:14 sena_kun joined 09:32 sena_kun left 18:49 sena_kun joined 22:33 sena_kun left
guifa What is the best way to convert an MVMString to a char*? 22:52
timo you have to encode it 22:53
there's one function that gives you a null byte terminated utf8 string, and there's utf8-c8 which can be useful 22:54
it depends very much on your use case?
guifa So bind-udp(...) takes a string value for the hostname (IP address or e.g. 'localhost' etc)
timo we have other places where we handle addresses right? 22:55
guifa Yeah, it's probably done somewhere else. I'm doing lots of digging around ha. This was more of a "here's hoping someone knows how offhand to avoid an 30-60min of digging" type question :) 22:56
aha 22:58
MVM_string_utf8_encode_C_string
timo the API you offer via syscall or nqp:: op could also just take a buf8 and then the decision how to encode it is done in nqp or raku code 22:59
for the possibly unusual case where you need to have a hostname or ip address that is for some reason invalid utf8?
what if on windows you have to pass a wide string? i have no idea ...
guifa so basically there's a function A that handles resolving the hostname/port into an special struct, and then calls function B. It makes more sense for me to do my edits in function B, but I need access to the hostname/port there 23:01
there's some lib_uv functions that are not as pretty that I can use but it makes more sense to pass the MVMString to function B, do resolution there, and just do the quick MVMStr to C string conversion there 23:03
but this is my first time working with MoarVM code so major n00b alert
timo it should be fine to just cook up a prototype with the utf8_encode_c_string function and when it's working change the API if it's needed 23:10
guifa Yeah -- maybe I'm being a bit too perfectionist. the "easy" way out will be to add two members to the SSI struct (current a a bind_addr and flags, would become bind_addr, host, port, flags, and I could combine port and flags no problem in the same space as the flag since port is 16 bit and flags are 2 bit, but flag is 64bit in the struct). it's definitely not the hottest bit of code out there 23:15
guifa also can't see an easy way to copy a MVMString so doing that with a char* is also easier ha 23:16
timo you don't copy MVMString, they are immutable 23:20
guifa is it safe to pass them around?
timo yes, with the usual caveat that being a GC-managed object, any place where you call something that allocates, even indirectly, the variable with the pointer has to be MVMROOTed if you want to use it again after 23:21
guifa okay so I've seen the MVMROOT2/MVMROOT3 stuff 23:22
So for instance here github.com/MoarVM/MoarVM/blob/f468...udp.c#L581 23:25
The MVM_io_resolve_host_name() handles allocation, but because the allocation happens within that MVMROOT3 thing, it's safe to use ? 23:27
timo the MVMROOT macros protect the variables that you pass in 23:31
guifa what's the difference between MVMROOT2 and MVMROOT3 (and assuming there's a 1 also) 23:32
timo it also indicates, though it's not a guarantee, that the functions called inside the body can allocate (and therefore do a GC run) and that also means that the function you're in needs to be called with rooting itself
only the number of arguments it takes
variadic macros are apparently not entirely a thing?
MVMROOT1 is simply MVMROOT 23:37
guifa ah ok. i'll mirror the level that i see in the block I'm editing 23:38
timo the precise explanation is that when the GC runs, it needs to know every pointer to GC-managed objects both for finding objects that have to be considered alive and also for updating the pointers because the objects move around 23:39
and that's what MVMROOT does, it adds a "temporary root" that acts like a stack, so at the open curly it pushes and at the closing curly it pops 23:40
and if the GC run happens while a local variable in a C function on the C stack is in a temporary root, it will be updated while the GC does its thing
and if you forget it, you'll be working with a copy of the object that used to be there, but it's conceptually been freed, so you have essentially a "use after free" bug if you forget to do that 23:41
i've got to head to bed soon, so if you have some more questions you can ask them quickly and i'll still be able to explain some stuff 23:43
guifa I think that's more than enough for me to handle improving my PR 23:46
at least to make it good enough for someone to do a review of it
guifa has added in multicast support, all because I wanted to do add in Zeroconf support in Raku lol
timo well, implementing things to scratch an itch you have is a time-honoured tradition 23:47
guifa yeah. I just didn't think how far down the rabbit hole I'd have to go :-) 23:49
timo yup, rabbit holes all the way down until you finally reach elephants and, eventually, turtles 23:58