Estoy tratando de crear enlaces perl6 para cgraph, y una de las estructuras tiene campos de bits establecidos para algunos de sus atributos con valores de menos de 8. ¿Cómo debo representarlo en mi módulo?

He intentado definir un tipo personalizado utilizando el rasgo is nativesize(x), pero los cstructs solo tienen tipos de soporte que son un múltiplo de 8 bits de ancho.

C Código de ejemplo:

struct Agtag_s {
    unsigned objtype:2;
}

Lo que intenté:

my native objtype is repr('P6int') is Int is nativesize(2) is export { }
class Agtag is repr('CStruct') is export {
    has objtype $.object-type;
}

Tratar de usar mi módulo con ese código falla con el siguiente mensaje de error: CStruct only supports native types that are a multiple of 8 bits wide (was passed: 2)

8
tmtvl 26 jun. 2019 a las 18:06

1 respuesta

La mejor respuesta

Aquí hay un ejemplo. Supongo que una función use_struct() se define en una biblioteca libslib:

#include <stdio.h>

struct Agtag_s {
    unsigned objtype:2;
    unsigned footype:4;
    unsigned bartype:6;
};

void use_struct (struct Agtag_s *s) {
    printf("sizeof(struct Agtag_s): %ld\n", sizeof( struct Agtag_s ));
    printf("objtype = %d\n", s->objtype);
    printf("footype = %d\n", s->footype);
    printf("bartype = %d\n", s->bartype);
    s->objtype = 3;
    s->footype = 13;
    s->bartype = 55;
}

Luego en Perl 6:

use v6;
use NativeCall;

class Agtag is repr('CStruct') is export {
    has int32 $.bitfield is rw;
}

sub use_struct(Agtag $s is rw) is native("./libslib.so") { * };

my $s = Agtag.new();
my $objtype = 1;
my $footype = 7;
my $bartype = 31;
$s.bitfield = $objtype +| ($footype +< 2 ) +| ($bartype +< 6);
say "Calling library function..";
say "--------------------------";
use_struct( $s );
say "After call..";
say "------------";
say "objtype = ", $s.bitfield +& 3;
say "footype = ", ($s.bitfield +> 2) +& 15;
say "bartype = ", ($s.bitfield +> 6) +& 63;

Salida :

Calling library function..
--------------------------
sizeof(struct Agtag_s): 4
objtype = 1
footype = 7
bartype = 31
After call..
------------
objtype = 3
footype = 13
bartype = 55
6
Håkon Hægland 26 jun. 2019 a las 16:13