MasterDuke | is travis down? | 00:29 | |
just checked and it's still working, just not reporting to the channel it seems | 00:33 | ||
geekosaur | maybe they're finally fixing the irc notifier | 00:36 | |
(the big problem with the current one: someone forks your repo and enables travis for it without changing the travis.yml. you get all the notifications for their builds as well as your own) | |||
[Tux] | This is Rakudo version 2016.10-24-g74d0e36 built on MoarVM version 2016.10-15-g715e39a | 06:39 | |
csv-ip5xs 3.470 | |||
test 18.482 | |||
test-t 7.512 | |||
csv-parser 20.299 | |||
nine | 7.5? Now that looks good! | 06:44 | |
FROGGS | often I wish I could remember what these numbers mean... | 06:57 | |
like if it is not called "test" but "p6something" or so... or that there would be comments after the numbers | |||
samcv | does anybody know if this is supposed to be possible? `open 'foo' or say "Something happened $!"Ā“ | 07:45 | |
gfldex | $! is only valid in a try block. IIRC there is one implicit try block on file scope level but I have no idea what happens in a module. | 07:49 | |
`or` will coerce a Failure (open should return that as its "undefined value") to Bool what marks the exception as handled. | 07:51 | ||
FROGGS | wont open return Failure? | ||
gfldex | if you want to be sure not to catch nonsense have a CATCH block that matches against X::IO | ||
samcv | ah okay. just wanted to check it wasn't a regression and was the correct functionality | ||
FROGGS | what about the orelse constructs? | ||
samcv | orelse also worked in older rakudo but doesn't work now | 07:52 | |
open 'foo' orelse say/die "something happened $!" | |||
gfldex | it should return a Failure if the error is IO based. | ||
samcv: orelse is very very loose. You may want to try //. | 07:53 | ||
FROGGS | $ perl6 -e 'open "foo" orelse say "something happened $_"' | ||
something happened (HANDLED) Failed to open file /home/froggs/foo: no such file or directory | |||
samcv: ^^ | |||
orelse topicalizes | 07:54 | ||
gfldex | $! should stay untouched tho | 07:55 | |
samcv: you may have spotted a rakudobug | 07:56 | ||
lizmat | nine: 7.5 means we lost .6 since yesterday ? | ||
samcv | $_ works. though $! it seems should work says the documentation. hopefully it's a bug gfldex, as i would like to be able to just do `something or say $!Ā“ | 07:57 | |
is there a way to get the bot to test on an older rakudo? | 07:58 | ||
gfldex | samcv: please file a bug report. That's one of those cases that will hardly be tested by users. | ||
samcv | ok :) cool. glad to help | ||
gfldex | one may replace or with orelse because it sounds correcterer without checking if there error is still handled properly | 07:59 | |
nine | lizmat: ooh...indeed, we were at 6.8 yesterday. I've been off by 1 | 08:16 | |
samcv | gfldex, ok i'm logged into rt.perl.org but i can't see how to create a bug report (this is the correct location right?) | 08:27 | |
gfldex | write a mail to [email@hidden.address] | 08:28 | |
samcv | ah ok | 08:29 | |
dalek | kudo/nom: 71a01e9 | lizmat++ | src/core/ (2 files): Introduce Iterator.skip-one A method that can be overriden if you're writing an iterator that can be significantly cheaper when skipping a generated value. Use case, the :10nth parameter with Str.match (aka, give me only the 10th match). By default, it is just a slightly more expensive .pull-one. Also use let Iterator.skip-at-least-pull-one use skip-one, as well as in Rakudo::Internals.SeqSkipNFromIterator . |
11:23 | |
lizmat | in benchmarks, this allows Str.match(/./,:10th) to be about 5x as fast | 11:24 | |
DrForr | Ah, the Nth stuff we were chatting about at OSCON. | 11:31 | |
lizmat | DrForr: indeed | 11:49 | |
iBakeCake | m: MixHash.new-from-pairs( 'a' => -42 ).Bag | 12:24 | |
camelia | rakudo-moar 71a01e: OUTPUTĀ«Use of Nil in string contextā¤ in block <unit> at <tmp> line 1ā¤Use of Nil in string contextā¤ in block <unit> at <tmp> line 1ā¤Found negative values for in ā¤ in block <unit> at <tmp> line 1ā¤ā¤Actually thrown at:ā¤ in block <unit> at <tmp> lā¦Ā» | ||
iBakeCake | Kinda weird that Mixies can have negatives, but baggies can't | 12:25 | |
Or rather, kinda weird that Baggies can't have negatives, but Mixies can | |||
AlexDaniel | :O negative values | 12:35 | |
dalek | ast: 37c8fd4 | (Harrison Chienjo)++ | S32-basics/pairup.t: Add tests for pairup. (#174) * Add test for pairup keys and values. * Add test for pairup list size. * Use clearer test descriptions. * Test for exceptions. |
12:37 | |
lizmat | iBakeCake: you can't have a negative number of things | 12:41 | |
iBakeCake: but you can assign a negative weigth to a thing | |||
*weight | |||
that's the rationale between Bag and Mix | 12:42 | ||
if you want a negative number of things, use a Mix :-) | |||
and just give it Int values | |||
AlexDaniel | āclass Bag ā Immutable collection of distinct objects with integer weightsā | ||
iBakeCake | Sounds like a distinction without a difference. Here's at least what our docs say: | 12:43 | |
Bag: Immutable collection of distinct objects with integer weights | |||
AlexDaniel | āClass Mix ā Immutable collection of distinct objects with Real weightsā | ||
iBakeCake | Mix: Immutable collection of distinct objects with Real weights | ||
AlexDaniel | heheā¦ | ||
that's a very interesting issue | |||
jnthn likes lizmat's "number of things" vs "weights" explanation, fwiw | 12:44 | ||
iBakeCake | As far as speculations go, for bags it clearly says negatives aren't allowed, but for mixes it says impl. may warn on negatives | ||
AlexDaniel | m: say MixHash.new-from-pairs( 'a' => NaN ) # there's also this | 12:45 | |
camelia | rakudo-moar 71a01e: OUTPUTĀ«MixHash.new(a(NaN))ā¤Ā» | ||
iBakeCake | :( | ||
m: say Bag.new-from-pairs( 'a' => NaN ) | |||
camelia | rakudo-moar 71a01e: OUTPUTĀ«Type check failed in assignment; expected Int but got Num (NaN)ā¤ in block <unit> at <tmp> line 1ā¤ā¤Ā» | ||
iBakeCake | ah right | ||
AlexDaniel | and it's also interesting that once you have Inf/NaN in one of the weights you can no longer do anything with your Mixā¦ | 12:50 | |
ah noā¦ nvm | 12:51 | ||
iBakeCake | m: my $m = MixHash.new-from-pairs( 'a' => NaN ); $m<a> = 42; dd $m | ||
camelia | rakudo-moar 71a01e: OUTPUTĀ«MixHash $m = ("a"=>42).MixHashā¤Ā» | ||
lizmat | perhaps we should disallow NaN as a valid weight | 12:52 | |
AlexDaniel | m: say Mix.new-from-pairs( āaā => 42, ābā => Inf).roll | 12:53 | |
camelia | rakudo-moar 71a01e: OUTPUTĀ«Nilā¤Ā» | ||
lizmat | AlexDaniel: that feels like a bug | 12:54 | |
AlexDaniel | dunno | ||
iBakeCake | Is this crappy? multi method AT-KEY(QuantHash:U \SELF: $key) is raw { SELF = self.new; SELF.AT-KEY($key); } | ||
Trying to make Setties and Baggies to autovivify | |||
m: my BagHash $b; $b<foo>++; # and fix this | 12:55 | ||
camelia | rakudo-moar 71a01e: OUTPUTĀ«Type check failed in assignment to $b; expected BagHash but got Hash (${})ā¤ in block <unit> at <tmp> line 1ā¤ā¤Ā» | ||
lizmat | iBakeCake: feels ok to me | ||
iBakeCake | cool | ||
AlexDaniel | m: say Mix.new-from-pairs( āaā => Inf, ābā => -Inf).total # makes sense | 12:57 | |
camelia | rakudo-moar 71a01e: OUTPUTĀ«NaNā¤Ā» | ||
FROGGS | o/ | 13:30 | |
lizmat | FROGGS \o | 13:31 | |
iBakeCake | ZOFVM: Files=1198, Tests=130069, 130 wallclock secs (21.05 usr 3.02 sys + 2348.45 cusr 198.65 csys = 2571.17 CPU) | 13:48 | |
FROGGS | jnthn: I've added a SignatureCheckHOW, but its compose method does not get called... what am I doing wrong? | 13:50 | |
iBakeCake: this gets recorded? | |||
dalek | kudo/nom: 79bb867 | (Zoffix Znet)++ | src/core/QuantHash.pm: Make QuantHash:U AT-KEY autovivify to QuantHash object, not Hash Currently, when attempting to do AT-KEY operations on Setties and Baggies, the autovivification is handled by Any:U.AT-KEY, which defaults to creating a Hash object. This causes issues with my BagHash $b; $b<foo>++, since an attempt to assign a Hash to BagHash variable results in an exception. Fix by adding AT-KEY for QuantHash:U; a role that Setties and Baggies do that will create an appropriate object instead of a Hash. |
13:51 | |
ast: 207ad2b | (Zoffix Znet)++ | S02-types/ (6 files): Test autovivification of Setties and Baggies works right |
13:52 | ||
jnthn | FROGGS: What were you expecting to call it? | ||
iBakeCake | FROGGS: hm? well, it's recorded in logs | ||
So far, I see too much variance for the numbers to be overly useful. There are half a dozen test files that take forever to run and I think they skew the results, since the other 18 cores are just sitting there.,.. | 13:53 | ||
FROGGS | jnthn: well, NativeHOW has such a method which sets up a hash that nativecall (moar) uses.... I want to do the same | ||
jnthn: are we calling it explicitly? | |||
jnthn | Yes, compose methods on meta-objects are called explicitly | 13:54 | |
For meta-attributes, they are called by the meta-object of the type at its compose time | |||
FROGGS | ahh, okay... | ||
jnthn | But if you consider a class, then class A { creates the ClassHOW, and the closing } is the point that we trigger the compose call | 13:55 | |
FROGGS | I guess that's what I had expected... | ||
but I think I'll just call it in the callback that resides in NativeCall.pm or so | 13:56 | ||
jnthn | I think for example SubsetHOW is never composed | ||
It's just created and "is" | |||
FROGGS | yeah | ||
jnthn | Hm, if the goal is for it to take what it knows and configure some other object then it maybe doesn't belong in a compose method | ||
Since compose is about a meta-object getting its own house in order | 13:57 | ||
FROGGS | it is more about configuring itself | ||
jnthn | Ah...hm | ||
FROGGS | very close to what we do in NativeHOW | 13:58 | |
dalek | kudo/nom: 87bba04 | (Zoffix Znet)++ | src/core/Mix (2 files): Make Mix/MixHash.Bag/BagHash coersion ignore negative weights Mixies can have negative weights, but Bag/BagHash can't. If we have a Mixy with negative weights the coercion fails. Make it succeed by having the Mixies toss negative weights before the coersion. |
14:08 | |
ast: 381cf28 | (Zoffix Znet)++ | S02-types/mix (2 files): Test Mixies with negative weights can coerse to Bag/BagHash |
14:09 | ||
japhb | [Tux]: Is there a publicly-visible file somewhere with at least the last, oh say 20 or so, of those csv test timings? | 15:01 | |
|Tux| | yes | 15:02 | |
tux.nl/Talks/CSV6/speed4.html click on timing log | |||
japhb | |Tux|: Ah, excellent, thank you | 15:04 | |
star: use LWP::Simple; my @recent = LWP::Simple.get('tux.nl/Talks/CSV6/speed.log').lines...rds[*-1]); my ($min, $max) = @recent.min, @recent.max; my $range = max($max - $min, .1 * $min); my @bar = (0x2581 .. 0x2588)>>.chr; my $spark = @recent.map({ @bar[(($_ - $min) / $range * (@bar - 1)).round] }).join; say $spark; | 15:36 | ||
camelia | star-m 2016.04: OUTPUTĀ«āāāāāāāāāā āāāāā āā āāāāāāāāāā āāā ā¤Ā» | ||
timotimo | cute | ||
japhb | |Tux|: Something to add to your daily postings? ^^ | ||
timotimo | japhb: do you know about .minmax? | 15:37 | |
m: say ^10 .pick.minmax.perl | |||
camelia | rakudo-moar 87bba0: OUTPUTĀ«7..7ā¤Ā» | ||
timotimo | m: say ^10 .pick.minmax.perl | ||
camelia | rakudo-moar 87bba0: OUTPUTĀ«7..7ā¤Ā» | ||
timotimo | ... huh? | ||
japhb | timotimo: Didn't work right for me for some reason. Seemed to be defined only on Range? | ||
timotimo | oh, haha | ||
m: say ^10 .roll(10).minmax.perl | |||
camelia | rakudo-moar 87bba0: OUTPUTĀ«0..9ā¤Ā» | ||
timotimo | m: say ^10 .roll(10).minmax.perl | ||
camelia | rakudo-moar 87bba0: OUTPUTĀ«0..9ā¤Ā» | ||
timotimo | m: say ^10 .roll(10).minmax.perl | 15:38 | |
camelia | rakudo-moar 87bba0: OUTPUTĀ«0..9ā¤Ā» | ||
timotimo | m: say ^10 .roll(3).minmax.perl | ||
camelia | rakudo-moar 87bba0: OUTPUTĀ«1..8ā¤Ā» | ||
timotimo | m: say ^10 .roll(3).minmax.perl | ||
camelia | rakudo-moar 87bba0: OUTPUTĀ«0..3ā¤Ā» | ||
timotimo | that's better | ||
it's defined on a list of things, it gives you a range as its result | |||
|Tux| | note that there is a bit of noise in the timing. I guess about .25sec over or under | ||
timotimo | though, tbf, if you want to unpack it into its min and its max, that'll require some accessor method calls? | ||
japhb | |Tux|: That was what the 'my $range = max($max - $min, .1 * $min);' bit was about -- the .1 was to try to not blow tiny changes out of proportion, so the full range of the spark line was at *least* 10% of the $min. | 15:40 | |
timotimo: Yeah, not a savings then. | |||
That .1 can be tuned to match the noisiness of the data set. | |||
Or we can just arbitrarily choose a minimum of .25 if that timing noise is truly scale-independent. | 15:41 | ||
timotimo | japhb: you can save a few characters by using ^7 + 0x2581 instead of 0x2581 .. 0x2588 | ||
japhb | (Or apply both minimums, actually) | ||
timotimo: golfing welcome. :-) | |||
timotimo | oh, i'm not in the mood for a full golfing | ||
just a tiny bit | |||
japhb | Fair enough. | 15:42 | |
It would be ^8 instead of .7 | |||
Er ^7 | |||
timotimo | sorry, yes. | 15:43 | |
i'm not wearing my glasses! :P | |||
hold on | |||
oh yeah, you're totally right 8) | |||
japhb | star: use LWP::Simple; my @recent = LWP::Simple.get('tux.nl/Talks/CSV6/speed.log').lines...rds[*-1]); my ($min, $max) = @recent.min, @recent.max; my $range = max($max - $min, .1 * $min, .25); my @bar = (^8 + 0x2581)>>.chr; my $spark = @recent.map({ @bar[(($_ - $min) / $range * (@bar - 1)).round] }).join; say $spark; | 15:44 | |
camelia | star-m 2016.04: OUTPUTĀ«āāāāāāāāāā āāāāā āā āāāāāāāāāā āāā ā¤Ā» | ||
japhb | ^^ both suggestions applied | ||
jnthn | m: uniname 0x2581 | 15:45 | |
camelia | ( no output ) | ||
jnthn | m: say uniname 0x2581 | ||
camelia | rakudo-moar 87bba0: OUTPUTĀ«LOWER ONE EIGHTH BLOCKā¤Ā» | ||
jnthn | m: say uniname 0x2582 | ||
camelia | rakudo-moar 87bba0: OUTPUTĀ«LOWER ONE QUARTER BLOCKā¤Ā» | ||
jnthn | TIL :P | 15:46 | |
timotimo | japhb: are you on a linux system, btw? have you ever experimented with rendering to a window that has an actual alpha channel? | 15:49 | |
twitter.com/loltimo/status/789060624324128769 <- japhb | 15:50 | ||
geekosaur | or just enumerate visuals and pick one with ARGB. you can find sample code in most programs that use opengl directly | 16:01 | |
timotimo | geekosaur: you're very free to patch SDL2 to allow that :) | ||
[Coke] | use iterm2, render actual gifs into your output | 16:05 | |
timotimo | hehe | 16:08 | |
lizmat | iBakeCake: re 79bb8671454171bed3ec , I wonder what autovivification means for immutables such as Set,Bag,Hash | 16:15 | |
m: my Bag $b; $b<a>++ | |||
camelia | rakudo-moar 87bba0: OUTPUTĀ«Cannot resolve caller postfix:<++>(Int); the following candidatesā¤match the type but require mutable arguments:ā¤ (Mu:D $a is rw)ā¤ (Int:D $a is rw)ā¤ā¤The following do not match for other reasons:ā¤ (Bool:D $a is rw)ā¤ (Bool:U $a is rwā¦Ā» | ||
lizmat | m: my BagHasH $b; $b<a>++ | ||
camelia | rakudo-moar 87bba0: OUTPUTĀ«===SORRY!===ā¤Type 'BagHasH' is not declared. Did you mean 'BagHash'?ā¤at <tmp>:1ā¤------> my BagHasHā $b; $b<a>++ā¤Malformed myā¤at <tmp>:1ā¤------> myā BagHasH $b; $b<a>++ā¤ā¤Ā» | ||
lizmat | m: my BagHasH $b; $b<a>++ | 16:16 | |
camelia | rakudo-moar 87bba0: OUTPUTĀ«===SORRY!===ā¤Type 'BagHasH' is not declared. Did you mean 'BagHash'?ā¤at <tmp>:1ā¤------> my BagHasHā $b; $b<a>++ā¤Malformed myā¤at <tmp>:1ā¤------> myā BagHasH $b; $b<a>++ā¤ā¤Ā» | ||
lizmat | m: my BagHash $b; $b<a>++ | ||
camelia | ( no output ) | ||
lizmat | I guess it's still better than it trying to make a Hash | 16:17 | |
dalek | ast: f06324c | (Sterling Hanenkamp)++ | S12-subset/subtypes.t: Test using fail in subset for custom message (#175) |
||
ast: c6e3283 | (Zoffix Znet)++ | S12-subset/subtypes.t: Add test description |
16:19 | ||
ast: 455a94c | (Sterling Hanenkamp)++ | S32-array/splice.t: Resolves #164: tests callable args on splice (#176) |
16:20 | ||
iBakeCake | There's one case I've not thought of tho | 16:22 | |
m: my Bag $b; try $b<a>++; dd $b | |||
camelia | rakudo-moar 87bba0: OUTPUTĀ«Bag $b = ().Bagā¤Ā» | ||
iBakeCake | So I think I'll add an AT-KEY to immutables that throws | 16:23 | |
on :U immutables | |||
lizmat | ah, what would be the sig for that ? | 16:25 | |
I came up with: | |||
SELF.^name.chars == 3 # shoddy heuristic for Set/Bag/Mix | |||
?? die "Cannot auto-vivify an immutable {SELF.^name}" | |||
!! (SELF = self.new).AT-KEY($key) | |||
iBakeCake | Well, they'd have to go into Set.pm, Bag.pm, .... | ||
Oh, yeah, that;'s better | |||
lizmat | ok, will commit :-) | ||
iBakeCake | lizmat++ thanks | ||
dalek | kudo/nom: b1f77c8 | lizmat++ | src/core/QuantHash.pm: Immutable Set/Bag/Mix cannot be auto-vivified |
16:27 | |
lizmat goes back to optimizing Str.match | 16:29 | ||
a little heads up on that: I had to scrap my original approach as it in the end did not bring the optimizations I was going for | |||
now looking at being 1.5 to 5x faster, depending in which named parameters are (not) specified | 16:30 | ||
dalek | ast: c17a0bf | (Zoffix Znet)++ | S02-types/ (3 files): Adjust exceptions thrown by autovivification of immutable QuantHashes The tests were added today as part of testing new autovivification behaviour of QuantHashes[^1]. However, that work did not handle immutable QuantHashes well, which was later fixed[^2]. Adjust tests to accomodate that fix. [1] github.com/rakudo/rakudo/commit/79...e56d6665f5 [2] github.com/rakudo/rakudo/commit/b1...edb69067bc |
17:55 | |
nine | Oh boy, I'd not have thought that it would be _that_ easy to prove NativeCall leaking memory. I literally hit it by writing a single LOC | 17:56 | |
I guess since the unbounded growth is in the "still reachable" category, this is a case for the heap profiler | 18:03 | ||
Looks like TakeStringCallback(sub (Str $x) {}) for ^10000; is accumulating frames while TakeStringCallback(&swallow-str) for ^10000; is not. | 18:26 | ||
FROGGS | o/ | 18:32 | |
nine | my $swallower = sub (Str $x) {}; TakeStringCallback($swallower) for ^10000; doesn't accumulate frames either. | 18:35 | |
jnthn | nine: If you pass --full-cleanup to Moar, does valgrind still show it as leaked/still reachable? | 18:38 | |
nine | That is with --full-cleanup (which is in perl6-valgrind-m) | ||
jnthn | Hmm...that means the GC *didn't* nom it | 18:42 | |
Meaning that you might have more luck with massif | |||
(Since the heap profiler is about GC-able things) | 18:43 | ||
nine | moar-ha shows the frames as: <anon> (08-callbacks.t:72) 3,532,672 bytes | ||
jnthn | o.O | 18:45 | |
It maybe is more useful than I suspected, then ;) | |||
What does path say about such a frame? | |||
nine | And that line is exactly: TakeStringCallback(sub swallow-str(Str $x) {}) for ^10000; | ||
I haven't figured out yet how to refer to those frames in moar-ha | |||
They are kind of nameless :) | 18:46 | ||
jnthn | Hmm | ||
Could you try it as ^10000 .map(sub xxx { TakeStringCallback(...) }) | 18:47 | ||
In case it's that particular closure? | |||
nine | ^10000 .map(sub xxx { TakeStringCallback(sub swallow-str(Str $x) {}) }) doesn't seem to leak | 18:51 | |
jnthn | o.O | ||
nine | Probably because it doesn't even run :) Should pay more attention | ||
Root (0) --[ Inter-generational Roots ]--> Inter-generational Roots (5) --[ Index 4224 ]--> xxx (08-callbacks.t:73) (Frame) (202616) | 18:56 | ||
jnthn | Do all the examples look like that? | 18:59 | |
That one means that the frame got promoted to gen2 and then had something assigned to it that was in the nursery, so ended up in the inter-gen root set | 19:00 | ||
nine | Yes, allways the same | 19:01 | |
mst | jnthn: blog.faraday.io/saved-by-the-compil...and-rayon/ is really quite interesting if you didn't already see it 17 times | 19:04 | |
jnthn | nine: Very interesting. | ||
nine: If you do a normal --profile and look at the GC runs, do we ever do a full collect? | 19:05 | ||
mst: No, nobody pointed me at it yet | |||
timotimo | it could be we don't consider those things consuming memory so we don't go for a full one? | 19:06 | |
jnthn | Well, you just did but... :) | ||
nine | The profiled code did 6 garbage collections. There were 0 full collections involving the entire heap. | ||
The profiled code did 62 garbage collections. There were 0 full collections involving the entire heap. | 19:09 | ||
jnthn | mst: Yes, interesting indeed | 19:10 | |
nine: Hmmm | |||
That's...interesting. | |||
mst | jnthn: seemed like the sort of thing that might Give You Ideas | 19:11 | |
nine | Why would those frames even be promoted? They're useful only during that single very short call. | ||
jnthn | Yeah, something (TM) must be keeping them alive | 19:12 | |
It'd be interesting to catch a young one | |||
That didn't end up in gen2 yet | |||
Urgh, cold--...afk for a bit | 19:13 | ||
nine | jnthn: ah, I've been through that last week. Hope you'll be better soon | 19:15 | |
Root (0) --[ Thread Roots ]--> Thread Roots (4) --[ Native callback cache target ]--> BOOTCode (Object) (423322) --[ Unknown ]--> xxx (08-callbacks.t:75) (Frame) (17895) | 19:33 | ||
timotimo | so it's just a cache? | 19:38 | |
nine | I can't find any code that removes anything from the Native callback cache, which would be a rather simple explanation :) | 19:42 | |
timotimo | yeah, totally legit | 19:43 | |
nine | The cache seems to be just a hash. This raises the question of how we could know that we should remove something from this cache. | 19:44 | |
timotimo | we have one kind of weak hash in moar already, it's for the serialization contexts i think | 19:45 | |
nine | Good to know. Will have a look | 19:56 | |
timotimo | SCWeakHash might be the right word to look for | 19:57 | |
i have no idea how it's actually built to do its weakness | |||
we do want to have general weakhash objects in the future | |||
or, weak references in general | |||
nine | That's odd. I can't find any place in the code that actually assigns to instance->sc_weakhash. | 20:05 | |
timotimo | probably uses something roundabout | 20:06 | |
src/6model/sc.c has access | |||
it all goes through the HASH_ macros | 20:07 | ||
nine | Yep. I find a couple of places which access, I find where it's destroyed and I find where the mutex that protects it is initialized. But not initialization of the hash itself. | ||
dalek | p: 56a637c | (David Warring)++ | examples/rubyish/rubyish.nqp: [examples/rubyish] adapt to latest HLL::Grammar.O precedence declarations |
20:08 | |
lizmat | decommute& | 20:15 | |
timotimo | 429: MVM_HASH_DESTROY(hash_handle, MVMSerializationContextBody, instance->sc_weakhash); | ||
nine | timotimo: yes, that's where it's destroyed. But it must be allocated somewhere? | 20:17 | |
timotimo | i expect HASH_BIND will initialize the hash upon first writing to it? | 20:19 | |
VMHash uses uthash, too. it doesn't have an initialize function, either | |||
nine | You're right! 3rdparty/uthash.h:163 | 20:21 | |
Ok, so the weakness of sc_weakhash just comes from SCRef not marking the hash entries in its gc_mark. | 20:25 | ||
But that doesn't work as well for the Native callback cache. I'd guess that the cache hides some missing MVMROOT | 20:26 | ||
timotimo | OK, but it somehow also has to understand when the SCRef has died | ||
otherwise the pointers in the hash will point into freed memory | |||
nine | The SCRef removes itself from instance->sc_weakhash in its gc_free | 20:29 | |
timotimo | oh | 20:33 | |
ok, that's definitely not a sensible thing to give other things :D | |||
nine | We'd have to wrap the callback object in a kind of WeakHashEntry that could do this trick. | 20:38 | |
MasterDuke | would anybody mind testing out my most recent attempt at removing BOOTSTRAPATTRs? | 21:15 | |
github.com/MasterDuke17/rakudo/tre...nd_attempt | |||
i think it passes both moar and jvm spectests, but i'd appreciate some independent verification | 21:17 | ||
FROGGS | omg, it works: gist.github.com/FROGGS/bd727a2408e...c4b8765a8c | 22:15 | |
.tell jnthn I got it to work now: gist.github.com/FROGGS/bd727a2408e...c4b8765a8c | 22:16 | ||
yoleaux2 | FROGGS: I'll pass your message to jnthn. | ||
timotimo | oh my gosh YES! | 22:17 | |
FROGGS | :o) | 22:20 | |
I knew you liked it | |||
timotimo | can we also use function pointers returned from functions? | 22:26 | |
FROGGS | you can cast these using a signature, yes | ||
since a while | |||
say nativecast( :(int8 --> Str), $something )(42) | 22:27 | ||
$something would be a ptr | |||
next would be to allow Perl 6 subs in attribute slots and call them from C | 22:28 | ||
dalek | p: ec44da2 | (David Warring)++ | examples/rubyish/rubyish.nqp: [examples/rubyish] cut/pasto in comments |
||
timotimo | whoa | 22:29 | |
i did not realize that | 22:30 | ||
FROGGS | gnight | 22:35 | |
dalek | p: 7cdbcea | (David Warring)++ | examples/rubyish/rubyish.nqp: [examples/rubyish] simplify heredoc tokens |
22:50 |