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
|