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 <
perl6-bugs-follo...@perl.org> 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.
>
>

Reply via email to