00:01 vendethiel- joined 00:15 vendethiel joined 00:47 AlexDaniel joined 01:03 AlexDani` joined
samcv hello all 01:42
looking at ticket 01:47
"UTF-8 could be extended up to 0x108430ffff" (lol)
i don't even think there's enough written languages in the history of the world to fill that space
if we somehow magically knew all of them
Zoffix
.oO( BREAKING NEWS: we made contact with extraterrestials and all of their quintillions of worlds... )
samcv :O
well by then we will be advanced enough to go beyond the confines of java's UTF-16
01:49 ilbot3 joined
samcv can't be unicode because unicode would have to do it officially :P 01:51
but maybe a font mapped to asci characters or something
which would be unicode incompatible :P
geekosaur lots of PUA fonts... 01:54
(how long have geeks been trying to get Tengwar into Unicode?)
also I have been forever ruined by languagelog.ldc.upenn.edu/nll/?p=29480 :p 01:56
samcv wugs 03:35
kind of looks like a baby chick
05:02 Voldenet joined
Voldenet hello 05:03
How would I introduce my own op into moarvm + nqp?
I've tried doing this without docs on my own, but nqp gives me "Bytecode validation error" 05:04
samcv uhm. what steps did you take 05:05
Voldenet Here's the diff: ix.io/pgo 05:06
samcv in mvm you ran the script to add the op after editing that file right?
Voldenet then I've ran a tool to re-generate ops
(easy to spot - moarvm didn't really compile without that)
samcv i think you're missing some stuff? not 100% sure. should look at the last few times i added ops
sec
Voldenet, github.com/MoarVM/MoarVM/commit/1a...0fc52961c4 this is what mine looked like. 05:08
uhm Voldenet did you add your op at the END 05:09
before before the spesh ops?
in src/core/oplist that is
see where i added it if you scroll down a bit
Voldenet nope, I added my op directly after killprocasync
samcv then you run that script
then you add it to interp.c 05:10
yeah. so i would copy that op and then reset everything
add it after the indexic_s op (which i think is currrently the newest op)
then run tools/update_ops.p6 05:11
then add it to interp.c
1. 2. 3. then once you've done that and nqp compiles properly i'll help you make sure it works on the nqp side
Voldenet okay, i'll follow those steps then 05:12
samcv ok great :)
Zoffix, you ever get anything done for proposed MVM logo ;)
Voldenet, in interp.c you can add it wherever you want after you run the update_ops.p6 script btw. but the oplist file is order sensitive. if you put it not at the end. it will change the mapping of the opcodes and everything breaks :) 05:14
Zoffix samcv: only in my head. "MoarVM" with first "M" stylized as a sitting dragon, with its tail following the rest of the letters and looping over "VM" with either the tail's arrow-like end forming part of top of "V" or something like that. 05:17
Voldenet Ah, I see. That's why it was not the best thing to do :)
samcv i may have made that mistake before. well at least i've made multiple mistakes over the time of adding ops 05:18
05:19 TimToady joined
Voldenet it looks like it has built, now time to check out if it really works 05:25
Zoffix OOC what sort of op are you adding? 05:26
Voldenet i needed the pid out of process spawned 05:27
'spawn' op doesn't really have anything like that, but the 'spawnprocasync' actually returns the object which contains reference to libuv process 05:28
samcv
.oO( wonders if we should have a ā€œprivate useā€ area of MVM ops)
06:18
they're 64 bit opcodes or 32bit? 06:19
oh they're 16bit
so room for 65,535 ops 06:21
Voldenet Hm, most of actual 'ops' use cases could be covered by native calls 06:22
The thing I wonder tho is if I should try pushing changes without any special meaning just because of my use case 06:35
samcv Voldenet, i read a proposa for extension ops though 07:26
github.com/MoarVM/MoarVM/blob/mast...s.markdown 07:28
Voldenet that would simplify things a bit :) 07:29
07:40 domidumont joined 07:44 domidumont joined
timotimo samcv: we do have a "private use area" for mvm ops, it's called "extops", you can see how rakudo uses it in src/vm/moar/ops/ 09:23
09:48 geekosaur joined 10:05 domidumont joined 10:40 geekosaur joined 11:18 geekosaur joined 11:38 geekosaur joined 11:39 geekosaur joined 11:52 geekosaur joined 11:55 geekosaur joined 11:58 geekosaur joined 12:04 geekosaur joined 12:13 geekosaur joined 12:21 geekosaur joined 12:28 geekosaur joined 12:38 MasterDuke joined 12:49 geekosaur joined 12:57 geekosaur joined 13:01 geekosaur joined 13:03 geekosaur joined 13:06 geekosaur joined 13:28 geekosaur joined 13:33 geekosaur joined 13:37 geekosaur joined 13:38 geekosaur joined 14:06 Ven joined 14:07 geekosaur joined 14:14 geekosaur joined 14:31 Ven_ joined 14:58 zakharyas joined 15:13 AlexDaniel joined 15:20 Ven joined
AlexDaniel samcv: ā€œbut maybe a font mapped to asci characters or somethingā€ that's what private use area is for :) 15:24
ah 15:38
blah, that's exactly what was mentioned in the next message :)
geekosaur :) 15:44
timotimo ascii and you shall receive 16:48
geekosaur better than pulling fonts out of your ascii, I guess 16:56
timotimo do you think some people deserve a solid asciiking? 16:58
MasterDuke ascii stupid question, get a stupid ansi 17:05
17:13 geekosaur joined
timotimo *groan* 17:14
MasterDuke timotimo: you up for native attribute questions? 17:42
17:44 domidumont1 joined 17:45 domidumont joined
samcv good * 18:06
Zoffix \o
.ask brrt if a largish method that's called thousands of times doesn't get speshed/jitted is there a way to find out what's preventing it? 18:08
yoleaux2 Zoffix: I'll pass your message to brrt.
lizmat Zoffix: are you aware of MVM_JIT_LOG ? 18:09
Zoffix Only in the terms of "giant file"
lizmat hehe... well, you *can* see in there whether a callable was rejected for jitting, but am not sure you can see why then 18:10
timotimo has more experience in that, I think 18:11
Zoffix Thanks. I'll take a look.
MasterDuke if i do `MVM_TRACING=1 perl6-m -e 'say "hi"'`, shouldn't i get some debugging output? 18:44
timotimo MasterDuke: i should have seen this question coming! 18:46
MasterDuke timotimo: heh, i gave fair warning
18:47 chsanch joined
timotimo if a frame doesn't get speshed, it's difficult to figure out why 18:47
if a frame gets speshed but not jitted, that's easy
oh, i think we don't spesh when there's flattening involved
that's a hint
chsanch Hi! 18:48
timotimo hi
MasterDuke: i hope you'll not be too disappointed when it turns out i have no idea what i'm talking about :) 18:49
MasterDuke: where did you get MVM_TRACING from?
MasterDuke interp.c:97 `#if MVM_TRACING` 18:50
oh, there also `if (tracing_enabled) {`
inside the #if
chsanch I'm using rakudobrew in a pocketchip computer (armv7l), and I'm trying to build 2017.03 with the command: rakudobrew build moar 2017.03, but it failed, I posted the last lines of the log here: gist.github.com/chsanch/5c7ff94d3c...992bfd828a 18:53
I don't know if there is another way to build it besides rakudobrew, which is the tool IĀ“ve using on other machines without any issue 18:54
MasterDuke chsanch: that sort of error is usually because you ran out of memory and the OOM killer killed it
chsanch oh, I see 18:55
MasterDuke you usually need ~2G available, or sufficient swap space to compensate (but that'll be pretty slow)
chsanch Ok, yah, well this computer just have 512M of RAM 18:56
MasterDuke i know people have built it on a raspberry pi, but they had to use swap 18:57
i don't know who it was, you might have a better chance asking in #perl6
chsanch Ok, thanks! 18:58
MasterDuke np
timotimo MasterDuke: you tell me how an environment variable can influence the #defines that were set at compile time :) 18:59
you need to both turn tracing on and enable that tracing thingie during runtime 19:00
MasterDuke hm, did a `make tracing install` but still no output 19:02
timotimo oh i didn't know about that target 19:04
MasterDuke from build/help.txt: `tracing rebuild executable with tracing dispatch` 19:05
list of makefile targets
timotimo you will also want to disable the jit
MasterDuke wait, is that really doing what i think it's doing? 19:06
timotimo there's apparently a flag you have to pass to the moar part of the invocation
it's "--tracing"
so edit your perl6-m or nqp-m depending on what you want
i have no idea what you think it's doing :) 19:08
MasterDuke ok, finally kind of got it 19:09
anyway, what i'm really trying to do is figure out why `perl6-m -e 'class :: { has uint64 $.foo; }.new( foo => 9223372036854775807 )'` does a decont_i, instead of decont_u 19:11
i think the problem is more in nqp or rakudo, but i haven't been able to figure out where exactly 19:12
timotimo i can imagine it'd be in the buildallplan and such 19:14
inside of Mu.pm
19:21 domidumont joined 19:29 MasterDuke joined
MasterDuke in src/Perl6/Metamodel/BUILDPLAN.nqp i see this: `my $typespec := nqp::objprimspec($_.type); if $typespec { @plan[+@plan] := [nqp::add_i(4, $typespec), $obj, $name, $attr_name]; }` 19:31
could i do something here with `if nqp::objprimunsigned($_.type) { <...> }`? 19:32
samcv what do you guys think of this PR i made yesterday? github.com/MoarVM/MoarVM/pull/563 19:37
to improve error on trying to encode a surrogate to give a more informative answer
timotimo is objprimunsigned a thing?
samcv m: chr(0xD800) 19:39
camelia WARNINGS for <tmp>:
Useless use of "chr(0xD800)" in expression "chr(0xD800)" in sink context (line 1)
samcv m: say chr(0xD800)
camelia Error encoding UTF-8 string: could not encode codepoint 55296
in block <unit> at <tmp> line 1
timotimo or do we have an p6int object that we can just ask? about its size and signedness?
samcv would change that to be: Error encoding UTF-8 string: could not encode Unicode Surrogate codepoint %d
well in the case it's a surrogate at least. if it's not a surrogate it will still use the same generic message 19:40
MasterDuke m: use nqp; say nqp::objprimunsigned(uint64)
camelia 1
MasterDuke m: use nqp; say nqp::objprimunsigned(int64)
camelia 0
timotimo oh! neat. 19:42
MasterDuke used exactly once in nqp 19:45
and not at all in rakudo
afk for a bit & 19:46
samcv gonna improve the out of bounds error too 20:01
99999999.chr
Error encoding UTF-8 string: could not encode codepoint 199999999, codepoint out of bounds. Cannot encode higher than 1114111
timotimo, what do you think i should say here? Highest Unicode codepoint is 1114111? and previously it didn't use hex just decimal so it makes sense to do the same for the highest cp 20:02
m: 99999999.chr
camelia ( no output )
samcv m: 99999999.chr.say
camelia Error encoding UTF-8 string: could not encode codepoint 99999999
in block <unit> at <tmp> line 1
timotimo the questions confuses me 20:07
samcv want to change the errror to "Error encoding UTF-8 string: could not encode codepoint 199999999 (0xBEBC1FF), codepoint out of bounds. Cannot encode higher than 1114111 (0x10FFFF)" 20:13
does that sound good to you
timotimo sure 20:17
samcv k 20:19
good to have it tell you why it can't encode something 20:20
20:46 timotimo joined
MasterDuke timotimo: back again. i know nothing about build plans, what does that `nqp::add_i(4, $typespec)` in the first element mean/do? 20:50
timotimo hm, let's see 20:51
oh, you know that all the things in the buildplan are documented in Mu.pm?
oh, no, at the top of BUILDPLAN.nqp 20:52
okay, you know how objprimspec gives 0, 1, or 2?
or 3
224539 florolf ā”‚ aber daran hat sich eigentlich auf vaporsound-seite nix geaendert
224543 niklas ā”‚ florolf: hab schon 3x rebootet 20:53
224547 niklas ā”‚ hmpf
... that's not what i put into this paste buffer
# 5 class name attr_name = set a native int attribute
# 6 class name attr_name = set a native num attribute
MasterDuke heh, was going to say, i don't know german either
timotimo # 7 class name attr_name = set a native str attribute
if the primspec is 1, you end up with 5, that means "set a native int attribtue"
if the primspec is 2, nu, if the primspec is 3, str 20:54
MasterDuke hm, don't see any signed vs unsigned options there
timotimo yup 20:55
i expect the last time this was touched unsigned wasn't A Thing yet 20:56
m: use nqp; say nqp::objprimunsigned(str)
camelia 0
timotimo m: use nqp; say nqp::objprimunsigned(int)
camelia 0
timotimo m: use nqp; say nqp::objprimunsigned(uint) 20:57
camelia 0
timotimo m: use nqp; say nqp::objprimunsigned(uint32)
camelia 1
timotimo then what is uint?
MasterDuke that's annoying 20:58
timotimo what is?
MasterDuke that uint is wrong 20:59
or at least seems wrong
timotimo yeah, does seem wrong, doesn't it 21:00
m: use nqp; say nqp::objprimunsigned(byte)
camelia 1
timotimo m: use nqp; say nqp::objprimunsigned(uint8)
camelia 1
timotimo how in the frick? 21:01
must be a bug when you specifiy "unsigned" but no "bytesize"
MasterDuke `const MVMStorageSpec *ss = REPR(type)->get_storage_spec(tc, STABLE(type)); GET_REG(cur_op, 0).i64 = ss->boxed_primitive;`
that's the meat of `OP(objprimspec): {` 21:02
oh, i'm looking at objprimspec, not objprimunsigned
`const MVMStorageSpec *ss = REPR(type)->get_storage_spec(tc, STABLE(type)); GET_REG(cur_op, 0).i64 = ss->boxed_primitive == 1 ? ss->is_unsigned : 0;`
timotimo i see what's wrong 21:03
github.com/MoarVM/MoarVM/blob/mast...#L158-L159
can you spot it?
MasterDuke repr_data->bits isn't set if you don't explicitly name it? 21:04
in the type i mean
timotimo that's right
well, i expect it to be the case
there's .^set_nativesize and .^set_unsigned 21:05
$!nativesize inside Perl6::Metamodel::NativeHOW is an object, so it can be a null object 21:06
but it looks like it sets nativesize to 0 by default
MasterDuke wait, it's just making the storage spec with the contents of ->is_unsigned, which is getting set with MVM_repr_get_int(tc, is_unsigned_o); 21:07
timotimo what is?
MasterDuke line 158-159 21:08
timotimo the point is that the if condition prevents this from happening if you don't have "is nativesize" on the type 21:09
MasterDuke so why doesn't uint cause a .^set_nativesize and .^set_unsigned 21:10
timotimo because it dosen't have a "is nativesize" in its definition 21:11
look at rakudo's src/core/natives.pm
MasterDuke ah
interesting
timotimo i wonder what the motivation behind being able to have a nativesize of 0 is 21:12
MasterDuke to use the machine default of wherever it was compiled? 21:14
timotimo oh, i see 21:16
there's the default_storage_spec that gets returned if repr_data->bits is set to 0 21:17
so by setting unsigned but no size, we're signaling "use the default" even though the default is actually signed
so That's Wrongā„¢
MasterDuke ah, so any fix for e.g., uint64, would probably not have worked for uint? 21:19
so it should be `if (repr_data->bits) mk_storage_spec(tc, repr_data->bits, repr_data->is_unsigned, &repr_data->storage_spec); else mk_storage_spec(tc, sizeof(MVMint64) * 8, repr_data->is_unsigned, &repr_data->storage_spec);`? 21:20
timotimo huh? why a fix for uint64? 21:24
uint64 already works though?
no, that's not what it should be, i don't think
i imagined it more like "if repr_data->bits or repr_data->is_unsigned { make_storage_spec }" 21:25
MasterDuke i meant a higher level fix for uint64 as an attribute type might not have worked for uint 21:27
m: class :: { has uint64 $.foo; }.new( foo => 9223372036854775808 ).foo.say 21:28
camelia -9223372036854775808
MasterDuke e.g., ^^^
timotimo oh, right 21:29
yes, it's true
luckily you've been using uint64 all the time
MasterDuke hm, just changing to `if (repr_data->bits || repr_data->is_unsigned)` still gives 0 for uint 21:35
timotimo oh 21:36
when we find out that ->bits is 0, but is_unsigned is 1, we'll want to use the same value for size and alingment as the default storage spec does
i'd put that logic into an else branch of the !MVM_is_null(tc, bits_o) 21:37
with an extra if
MasterDuke hm, turns out none of that code at all is called when you do `perl6-m -e 'use nqp; say nqp::objprimunsigned(uint)'` 21:44
oh, i need to rebuild rakudo 21:49
ugh, i've gotten used to not having to rebuild rakudo when making moarvm changes 21:55
timotimo you're right 22:03
it's most probably coming from the serialized blob
and that code is only run when you compile nqp
that whole thing we were just looking at is part of the compose dance-and-song 22:05
the traits "is unsigned" and "is nativesize" will set attributes on the NativeHOW 22:06
when the { } of the class (that you use these traits on) closes, rakudo will call compose on the HOW
that's what you see in NativeHOW; it creates a nqp::hash it calls $info
that's the very same hash that we get in as MVMObject *info_hash in static void compose 22:07
MasterDuke because my earlier testing was without rebuilding nqp/rakudo, i just tried this: after the `if (repr_data->bits)` i added `else if (repr_data->is_unsigned)`, but that else if branch never gets called
timotimo does that help?
aaah
yes, need to recompile nqp
MasterDuke it does, thanks
timotimo well, that or rakudo
MasterDuke did both to be sure
timotimo or create a new class yourself that has the P6int repr and nativesize and/or unsigned
ok, it's still not getting called?
MasterDuke still not getting called 22:08
also, i just tried `my native blash is repr('P6int') is Int { }`, but it complains it doesn't know P6int 22:09
timotimo huh, ok, how about the whole function in general?
oh
WFM 22:10
MasterDuke oops, that was a shell quoting error
timotimo did you accidentally use perl6 -e with '' and then put '' inside is repr, too?
yeah, F the shell
MasterDuke ok, added fprintfs in those two branches and added a final else with an fprintf also, now rebuilding 22:13
`my native foo is repr("P6int") is Int { }` never prints at all 22:15
`my native foo is repr("P6int") is Int is unsigned { }` doesn't print either
timotimo you're right, and i'm confused 22:16
MasterDuke `my native foo is repr("P6int") is Int is nativesize(32) { }` does print in the if (repr_data->bits) branch
so why isn't compose() being called at all for the first two? 22:17
timotimo could it be that it deduplicates equivalent classes?
oh, another interesting tidbit
NativeHOW won't call compose at all unless you have nativesize set 22:18
so that wants a check for unsigned, too
MasterDuke ah, then that would explain that
so int, uint, and num aren't getting composed at all?
timotimo hm, does NatveHOW also get used for num? 22:19
oh, yes, indeed
anyway, i think i'll head off to bed 22:20
i think we made some progress on stuff!
you got an idea what to do regarding the buildplan?
MasterDuke maybe
timotimo i'd suggest adding a new opcode to the end, i.e. decide on a new number to use for "set unsigned int attribute" 22:21
then if the objprimspec is 1 (aka int) but it's also objprimunsigned, you use that number instead of 4 + objprimspec-return-value 22:22
and inside the two or more "interpreters" for buildplans you add a case that handles that
MasterDuke not add an if inside the int case?
do you think this decont is the problem one? github.com/rakudo/rakudo/blob/nom/...Mu.pm#L213 22:23
timotimo there is no int case
you're looking at the wrong spot 22:24
i was talking about BUILDPLAN.nqp
just like the decision between "is this native int, native num, or native string?" is encoded into the buildplan by BUILDPLAN.nqp, i suggest you give it a new number 22:25
MasterDuke yeah, i meant instead of create a new op for "set unsigned int attribute", check for unsignedness where "set int attribute" is done
timotimo i.e. the "nqp::if( # 5" you have there, that's the one for "signed int attribute" 22:26
and later on you'd add an "nqp::if # 99" for "unsigned int attribute"
i can't imagine how you could do that in a cheap way there?
MasterDuke ok, but what i need to differently, whether in a different op or not, is use a decont_u instead of decont 22:27
timotimo like, would you "if self.^attributes.grep(*.name eq $attrname).is_unsigned { bindattr_u } else { bindattr_i }"?
MasterDuke *do differently
timotimo that part i don't know anything about :) 22:28
i thought it'd have to stay "decont", but become bindattr_u instead of bindattr_i
you know that part better than me
MasterDuke probably that too, but `class :: { has uint64 $.foo; }.new( foo => 9223372036854775808 ).foo.say` dies in a decont_i for me (and will for camelia with the next moar/nqp bump) 22:29
thanks for the help, good luck sleeping, and i'm sure i'll bother you again tomorrow 22:30
timotimo yes, i'm glad i've been minimally useful
please also consider:
the code you're looking at, the one in Mu.pm, that's run every single time a .new (or rather, a bless) is called 22:31
i.e. if i have a class Point { has int $.x; has int $.y } and i Point.new($_, $_) for ^100_000 it better not become any slower from your patch :)
MasterDuke heh, i'll attempt to be more correct and also no slower 22:32
timotimo it'll be easy if you do it the way i described, with the new number that's generated in BUILDPLAN.nqp and checked in Mu.pm 22:35
MasterDuke yeah, starting to try it out now
timotimo yays 22:36
in the future, we'll actually generate a proper code object for executing the buildplan
i tried to do that already, but i got quite mysterious errors
anyway, bedtime!
MasterDuke oh, ugh, there is no bindattr_u 22:37
well, i'll create one and see what happens 22:38
arg, also no getattr_u, could add one of those as well. i've been down this path before... 22:40
22:47 Voldenet joined 23:29 agentzh joined