Thanks for that. As a worka-around Rakudo seems to do a better job, if I
give it a helping hand viz a TWEAK method:
use NativeCall;
class Point is repr('CStruct') {
has uint8 $.x;
has uint8 $.y;
}
class MyStruct2 is repr('CStruct') {
HAS Point $.point; # <-- embedded
has int8 $.flags;
method TWEAK {
$!point := Point.new;
}
}
say .name, ': ', .inlined for MyStruct2.^attributes;
my $s = nativecast(MyStruct2, buf8.new: 42,69,11);
say $s.flags;
say $s.point.defined;
say $s.point.x;
say $s.point.y;
Produces:
$!point: 1
$!flags: 0
11
True
42
69
On Fri, Oct 6, 2017 at 5:12 AM, Brian S. Julin via RT <
[email protected]> wrote:
> On Wed, 04 Oct 2017 23:19:19 -0700, david.warring wrote:
> > From
> > https://docs.perl6.org/language/nativecall#Embedding_
> CStructs_and_CUnions
> >
> > class Point is repr('CStruct') {
> > has uint16 $.x;
> > has uint16 $.y;
> > }
> >
> > class MyStruct2 is repr('CStruct') {
> > HAS Point $.point; # <-- embedded
> > has int32 $.flags;
> > }
> >
> > my $s = MyStruct2.new;
> > say $s.flags;
> > say $s.point.defined;
> > say $s.point.x;
> >
> > Produces:
> >
> > 0
> > False
> > Cannot look up attributes in a Point type object
> > in block <unit> at /tmp/tst.pl line 15
> >
> > Ie, the embedded struct is not automatically created and defined, when a
> > new containing struct is created.
> >
> > Rakudo version 2017.09-199-gc91c40115 built on MoarVM version
> > 2017.09.1-62-g89ca8eb0
> > implementing Perl 6.c.
>
>
> This is more an NYI than a bug... the code for that is more or less
> a first-pass draft. There are workarounds (see my xcb module), but they
> require surrendering your sanity to dark forces.
>
>