Raku / old-issue-tracker

Tickets from RT
https://github.com/Raku/old-issue-tracker/issues
2 stars 1 forks source link

'HAS' Embedded C-Structs not working as documented #6572

Open p6rt opened 6 years ago

p6rt commented 6 years ago

Migrated from rt.perl.org#132222 (status was 'open')

Searchable as RT132222$

p6rt commented 6 years ago

From @dwarring

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 \ 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.

p6rt commented 6 years ago

From @skids

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 \ 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.

p6rt commented 6 years ago

The RT System itself - Status changed from 'new' to 'open'

p6rt commented 6 years ago

From @dwarring

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-followup@​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 \ 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.

dogbert17 commented 4 years ago

It seems to work a bit better now:

dogbert@dogbert-VirtualBox ~ $ perl6 -v
This is Rakudo version 2020.05.1-285-g8134470 built on MoarVM version 2020.05-85-g02c8cf7
implementing Raku 6.d.
dogbert@dogbert-VirtualBox ~ $ perl6 gist.pl6 
0
True
0