1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
package CType::BitField;
use 5.6.0;
use strict;
use warnings;
use CType;
our @ISA = qw/CType/;
sub new
{
my $this = shift;
my $class = ref($this) || $this;
my $type = shift;
my $width = shift;
my $self = {type => $type,
width => $width->compute,
};
bless $self, $class;
return $self;
}
sub width
{
my $self = shift;
return $self->{width};
}
sub alignment
{
my $self = shift;
return $self->{type}->alignment;
}
sub alignment_exprs
{
my $self = shift;
return $self->{type}->alignment_exprs;
}
sub layout
{
}
sub dump_c
{
my $self = shift;
my $skip_cpp = shift;
my $name = shift;
my $str = "";
$str .= $self->dump_location($skip_cpp);
if ($self->{type}->capture_declarator)
{
$str .= $self->{type}->dump_c($skip_cpp, $name);
}
else
{
$str .= $self->{type}->dump_c($skip_cpp) . ' ' . $name;
}
$str .= ' : ';
$str .= $self->{width};
return $str;
}
sub capture_declarator
{
return 1;
}
sub describe
{
my $self = shift;
my $width = $self->{width} . "-bit";
my $type = $self->{type}->describe;
return "$width bitfield of $type";
}
sub get_refs
{
my $self = shift;
return $self->{type}->get_refs;
}
sub _check_interface
{
my $self = shift;
my $other = shift;
return 'both' unless $other->isa('CType::BitField');
my @ret;
unless ($self->width == $other->width)
{
push @ret, 'abi';
}
push @ret, $self->{type}->check_interface($other->{type});
return @ret;
}
1;
|