lizmat | jnthn: re the usefulness of .cow: if we just bind each element of an array to another, then changes propagate back | 00:00 | |
m: class Foo { has $.a is rw }; my @a = Foo.new(a => $++) xx 2; my @b; @b[$_] := @a[$_] for ^2; dd @a, @b; @a[0] = 42; dd @a,@b | |||
camelia | rakudo-moar d4a0e0: OUTPUT«Array @a = [Foo.new(a => 0), Foo.new(a => 1)]Array @b = [Foo.new(a => 0), Foo.new(a => 1)]Array @a = [42, Foo.new(a => 1)]Array @b = [42, Foo.new(a => 1)]» | ||
lizmat | if you however .cow the array, then the change does *not* propagate back: | ||
m: class Foo { has $.a is rw }; my @a = Foo.new(a => $++) xx 2; my @b = @a.cow; dd @a, @b; @a[0] = 42; dd @a,@b | 00:01 | ||
camelia | rakudo-moar d4a0e0: OUTPUT«Array @a = [Foo.new(a => 0), Foo.new(a => 1)]Array @b = [Foo.new(a => 0), Foo.new(a => 1)]Array @a = [42, Foo.new(a => 1)]Array @b = [Foo.new(a => 0), Foo.new(a => 1)]» | ||
lizmat | m: class Foo { has $.a is rw }; my @a = Foo.new(a => $++) xx 2; my @b = @a.cow; dd @a, @b; @b[0] = 42; dd @a,@b | ||
camelia | rakudo-moar d4a0e0: OUTPUT«Array @a = [Foo.new(a => 0), Foo.new(a => 1)]Array @b = [Foo.new(a => 0), Foo.new(a => 1)]Array @a = [Foo.new(a => 0), Foo.new(a => 1)]Array @b = [42, Foo.new(a => 1)]» | ||
lizmat | however, the values *are* bound, because: | ||
m: class Foo { has $.a is rw }; my @a = Foo.new(a => $++) xx 2; my @b = @a.cow; dd @a, @b; @b[0].a = 42; dd @a,@b | |||
camelia | rakudo-moar d4a0e0: OUTPUT«Array @a = [Foo.new(a => 0), Foo.new(a => 1)]Array @b = [Foo.new(a => 0), Foo.new(a => 1)]Array @a = [Foo.new(a => 42), Foo.new(a => 1)]Array @b = [Foo.new(a => 42), Foo.new(a => 1)]» | ||
lizmat | note that in this last case, @a[0] and @b[0] are still referring to the same object | 00:02 | |
m: class Foo { has $.a is rw }; my @a = Foo.new(a => $++) xx 2; my @b = @a.cow; dd @a, @b; @b[0].a = 42; say @a[0] === @b[0] | 00:03 | ||
camelia | rakudo-moar d4a0e0: OUTPUT«Array @a = [Foo.new(a => 0), Foo.new(a => 1)]Array @b = [Foo.new(a => 0), Foo.new(a => 1)]True» | ||
lizmat | m: my %h = a => 42; my $m = %h.Map; dd $m; %h<a>++; dd $m # sigh, mutable .Map | 00:42 | |
camelia | rakudo-moar d4a0e0: OUTPUT«Map $m = Map.new((:a(42)))Map $m = Map.new((:a(43)))» | ||
pyrimidine | moritz: I think irclog.perlgeek.de is down, not seeing archived logs anymore | 01:31 | |
dalek | kudo/nom: 9b6d0cc | lizmat++ | src/core/Hash.pm: Fix Hash.Map - handle case of completely empty Hash - add support for :view parameter - create actual cow copy otherwise |
||
pyrimidine | yup: www.downforeveryoneorjustme.com/htt...erlgeek.de | 01:32 | |
lizmat | pyrimidine: it will be some hours before moritz wakes up | 01:35 | |
pyrimidine | lizmat: not a problem | 01:52 | |
awwaiid | lizmat: so .cow is sort of shallow-cow? | 02:38 | |
lizmat | not sure what you mean by shallow exactly in this context | 02:40 | |
instead of aliasing the container, the value in the container is aliased | |||
so that the new container will retain the value if the original container is changed | |||
awwaiid | m: my @a = [[[1]]] ; my @b = @a.cow; dd @a, @b; @a[0][0][0] = 42; dd @a, @b | 02:43 | |
camelia | rakudo-moar 9b6d0c: OUTPUT«Array @a = [1]Array @b = [1]Cannot modify an immutable Int in block <unit> at <tmp> line 1» | ||
awwaiid | hm | 02:44 | |
m: my @a = [1, [2, [3]]] ; my @b = @a.cow; dd @a, @b; @a[1][1][0] = 42; dd @a, @b | 02:45 | ||
camelia | rakudo-moar 9b6d0c: OUTPUT«Array @a = [1, [2, [3]]]Array @b = [1, [2, [3]]]Array @a = [1, [2, [42]]]Array @b = [1, [2, [42]]]» | ||
awwaiid | it would be neat if .cow magically did deep deep cow | ||
lizmat | how would it know to go deeper ? | 02:46 | |
because the value is Iterable ? | |||
awwaiid | magic I guess | ||
sure, iterable sounds good :) | |||
lizmat | hmmm.... | ||
in any case, before I go on, I'd like to see what TimToady thinks of the idea | |||
awwaiid | maybe this could be a flag or property of any object | ||
ya | |||
lizmat | and whether we should have any syntactic suger | 02:47 | |
*sugar | |||
awwaiid | seems like a very interesting idea to explore in any case | ||
lizmat | this is basically also a result of TheDamian's functional programming course and a conversation I had with TimToady afterwards | ||
awwaiid | ah cool. I did a lot of OCaml with purely-functional datastructures, and behind the scenes COW is what made it realistic | 02:48 | |
ocaml, iirc, has it baked in all the time. I guess like clojure does it -- extra layers of pointers all the time | 02:49 | ||
clojure uses COW functional data structures as a key part of its concurrency story | 02:53 | ||
dalek | ast: 0d86018 | LLFourn++ | S32-str/split.t: Test for RT #128481 |
03:33 | |
kudo/nom: 9ee9693 | lizmat++ | src/core/BagHash.pm: Simplify BagHash.Bag |
03:40 | ||
kudo/nom: ff63582 | lizmat++ | src/core/Capture.pm: Simplify Capture.hash |
|||
kudo/nom: 8d5a9e4 | lizmat++ | src/core/CompUnit/Handle.pm: Simplify CompUnit::Handle.new|from-unit |
|||
kudo/nom: d78d8cd | lizmat++ | src/core/Enumeration.pm: Simplify ENUM_VALUES |
|||
kudo/nom: 2b12326 | lizmat++ | src/core/HyperSeq.pm: Simplify HyperSeq.new Simplify HyperWorkBuffer.new |
|||
kudo/nom: 6018ccd | lizmat++ | src/core/IO/Special.pm: Simplift IO::Special.new |
|||
kudo/nom: 4f3b650 | lizmat++ | src/core/Iterable.pm: Simplify Iterable.flat|lazy iterator.new |
|||
kudo/nom: e2b90ab | lizmat++ | src/core/MixHash.pm: Simplify MixHash.Mix |
|||
kudo/nom: cc6d2a3 | lizmat++ | src/core/Seq.pm: Simplify Seq.new |
|||
kudo/nom: 6d824ec | lizmat++ | src/core/Str.pm: a556a86 | lizmat++ | src/core/Attribute.pm: Not sure what the effect is, if any. They *do* get called during module installation after setting compilation. |
|||
lizmat | all of these commits basically changed the same thing | 03:49 | |
It's spectest clean, but sometimes runs deep in the internals | 03:50 | ||
in order for bisectable to be able to bisect any problems found, I did these all in separate commits | |||
lizmat | good night, #perl6-dev! | 04:52 | |
psch | alright, so, the patch method doesn't show up in qbidToCodeRef because it doesn't get a CodeRefAnnotation during jast2bc.JASTCompiler.compileMethod | 07:08 | |
and it doesn't get a CRA because it neither has a crCuid nor an outer | |||
i *think* i probably have to add an outer, but i have no clue how i can find out which CR *is* the appropriate outer | |||
because during COMP_MODE we never add a cuid | |||
Woodi | m: my @a = [1, 2, 3]; my @b = @a.cow; @b[0] = 4; dd @b; dd @a | 07:51 | |
camelia | rakudo-moar a556a8: OUTPUT«Array @b = [4, 2, 3]Array @a = [1, 2, 3]» | ||
[Tux] | This is Rakudo version 2016.06-46-ga556a86 built on MoarVM version 2016.06 | 09:03 | |
test 16.492 | |||
test-t 9.864 | |||
csv-parser 21.979 | |||
dalek | kudo/nom: e071e40 | lizmat++ | src/core/Attribute.pm: More correct translation of given/when structure |
13:06 | |
psch | alrighty then, lets see if carrying every single jclass compiled with one compiler instance gives me back the missing method | 13:25 | |
+along | |||
well, apparently it kinda works | 14:18 | ||
unfortunately the StaticCodeInfo of the CodeRef seems to get lost somewhere | 14:19 | ||
which is kind of the same problem as before, only one goal post further... vOv | |||
llfourn | gist.github.com/LLFourn/135680d93e...86b49fa20e # backtrace on the segfaults I'm getting for anyone interested | 14:23 | |
timotimo | llfourn: unfortunately that's utterly useless without the filename and line number | 14:25 | |
because every single REPR has a gc_mark function | |||
though perhaps the right clue to behold is that frame_force_to_heap is in the backtrace; jnthn? | |||
llfourn | oh. Yeah I was never able to build with debug symbols on mac last time. | ||
timotimo | damn :( | 14:26 | |
llfourn will attempt again | |||
timotimo | thanks | ||
llfourn | how to do again? | 14:27 | |
timotimo | give moarvm's Configure.pl the --debug=3 flag | ||
psch now carries the CodeRefBuilder for each file around as well | 14:29 | ||
hope that has the info for e.g. oLexStatic | |||
...although, probably not | |||
timotimo | psch: it's kind of amusing how you can tell by the cpu usage graphs on collect when you're working on rakudo-jvm :D | ||
psch | *but* it might have the info for building the stuff for oLexStatic etc... | ||
timotimo: i'm glad i'm not compiling locally 'cause it would be lots too hot here then :) | 14:30 | ||
timotimo | :D | ||
yeah | |||
psch | ohh, what's ram usage say? | 14:33 | |
for rakudo specifically | |||
'cause i have a feeling that'll increase a lot | |||
i mean, during rakudo build | |||
timotimo | hardly noticable on the graph, as the machine has like 20 gigs | 14:34 | |
psch | i mean, during CORE compilation i have to carry all JAST::Methods of all CompUnits around | ||
timotimo | llfourn: btw, gfldex isn't in this channel, so even though he's interested, he's not going to have seen that backtrace | ||
psch | but yeah, in the grand scheme of 20 gigs on a server that probably doesn't matter too much | 14:35 | |
ISTR we did have r-j compilation problems due to stack size in the past... | |||
anyway, i'll take a break now 'cause everything's getting hairy again with the CodeRefBuilder stuff >_> | |||
llfourn | timotimo: thanks. | 14:38 | |
ek. after rebuilding with --debug=3 there seems to be less info -_- | 14:39 | ||
timotimo | that's fantastic! | ||
llfourn | looks like: #0 0x0000000100063cf4 in ?? () from /Users/llfourn/src/rakudo/install/lib/libmoar.dylib | 14:40 | |
timotimo | that'd happen when going through the jit (or something) makes the stack unreadable to the debugger | ||
you can try if it still happens with MVM_JIT_DISABLE=yes in your env | |||
llfourn | ah. thanks. | ||
timotimo: updated gist - gist.github.com/LLFourn/135680d93e...86b49fa20e | 14:43 | ||
but it's still empty :S | |||
in terms of info with MVM_JIT_DISABLE | 14:44 | ||
timotimo | well, it's not necessarily the same crash | ||
does file tell you something interesting about the dylib? | |||
like "not stripped"? | |||
llfourn | how do I check? | ||
timotimo | "file" is a commandline program | ||
llfourn | /Users/llfourn/src/rakudo/install/lib/libmoar.dylib: Mach-O 64-bit dynamically linked shared library x86_64 | 14:45 | |
timotimo | hm | ||
mine looks like this: perl6/install/lib/libmoar.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=092ad8a65bd5594c1e60c3e6ab1f34a216c519a6, not stripped | 14:49 | ||
llfourn | this is BSD file vs gnu I guess | ||
timotimo | *shrug* | 14:50 | |
also, i don't think BuildID is a thing on every linux distro | |||
so probably also not on mac osx | |||
llfourn | I think "stripped" is a thing on BSD file though because it mentions it in the man page | ||
stmuk | I did wonder at one point if upstream file(1)s should recognise moar magic | 14:54 | |
maybe they do already | |||
timotimo | they probably don't yet | 14:55 | |
nine | psch: CORE compilation won't be affected since it's a single CompUnit | ||
Zoffix | the `parse` stage went up from 54s to 83s when I switched my 4-core VM to 1 core | 14:56 | |
timotimo | i wonder if the jvm switches GCs depending on whether or not multiple cores are available | 14:57 | |
Zoffix | (I'm talking about moar FWIW) | 14:58 | |
timotimo | oh | ||
huh | |||
Zoffix | ¯\_(ツ)_/¯ | ||
stmuk | gist.github.com/ilmari/2a23f96373163a1fa45b | 15:00 | |
ilmari: have you made any attempt to commit that upstream to GNU and any BSD projects? | 15:01 | ||
timotimo | i wonder if the format changed since then | 15:02 | |
stmuk | not sure . I stuck in my /etc/magic and it seems to work | ||
timotimo | well, of course it seems to work | 15:03 | |
it just reads values from the first ~100 bytes | |||
it can hardly crash :) | |||
but the values could be wrong | |||
stmuk | thats what I meant | 15:04 | |
/opt/rakudo-star-2016.01/share/perl6/runtime/perl6.moarvm: MoarVM bytecode (version 5), 5 serialization contexts, 1 extension ops, 11 frames, 8 callsites, 199 strings, 1576 bytes serialized data (version 16), 3020 bytes bytecode, 492 bytes annotations | |||
timotimo | ah, ok :) | 15:05 | |
ilmari | stmuk: nope | 15:45 | |
psch | nine: it already is. i have to keep track of all CUs compiled by a given instance of a HLL::Compiler to still reach the already-defined-but-later-lost method that refers to the inner CU | 15:53 | |
because that's a thing i noticed; we compile that method that later goes missing before we compile the inner CU | 15:54 | ||
s:2nd/before/after/ | 15:55 | ||
err, there's no 1st vOv | |||
ilmari | stmuk: I tired to get the hll name, but I couldn't figure out a way to get the Nth string in the string heap | 16:05 | |
llfourn | timotimo: \o/ I got debugging symbols to show up: gist.github.com/LLFourn/135680d93e...86b49fa20e | 16:07 | |
not with gdb but with lldb | |||
b2gills | Should IO::ArgFiles.eof() act per input file, or should it be for the entire list of input files ( fixing other problems with it currently ) | 17:04 | |
timotimo | that looks very interesting, i'll have to look at it later today - i hope i'll make it | 17:51 |