Skip to content
NativeCall::TypeDiag a module to help you analyse your CStruct defined type.
Other
  1. Other 100.0%
Branch: master
Clone or download

Latest commit

Fetching latest commit…
Cannot retrieve the latest commit at this time.

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples
lib/NativeCall
META6.json
README.md

README.md

Name NativeCall::TypeDiag

Synopsis

use v6;
use Gumbo::Binding;
use NativeCall::TypeDiag;
my @headers = <gumbo.h>;
my @libs = <-lgumbo>;

my %typ;
# Construct the type from the exported stuff
for Gumbo::Binding::EXPORT::DEFAULT::.keys -> $export {
  if ::($export).REPR eq 'CStruct' {
    #convert foo_bar_s to FooBar
    my $cname = $export.subst(/_s$/, '');
    my @t = $cname.split('_').map: {.tc};
    %typ{@t.join('')} = ::($export);
  }
}
diag-cstructs(:cheaders(@headers), :types(%typ), :clibs(@libs));

Description

A module that provide functions to look at your native types. Comparing with the their C equivalent.

diag-struct ($ctypename, $nctype, :@cheaders, :@clibs = ())

Analyse the size of the fields of a CStruct and compare them to their C counterpart. It also show potential mistakes

return true if there is no error.

@cheaders is what you need to include to compile a C file using the lib. @clibs is extra options to the compiler.

diag-cstructs(:@cheaders, :@clibs = (), :%types)

Analyse a given list of structures

%types pairs must look like this : "C name of the struct" => ::("name of NC type")

return true if there is no error.

diag-functions(:@functions)

REMOVED. It's now part of NativeCall

@nctd-extracompileroptions

An array that is passed as option to the compiler cc

Example

From one example in the examples folder.

use v6;

use NativeCall;
use NativeCall::TypeDiag;

class wrong_rgba_color_s is repr('CStruct'){
	has	int32 $.red;
	has	int32 $.blue;
	has 	int32 $.green;
}

class rgba_color_s is repr('CStruct'){
	has	int32 $.red;
	has	int32 $.blue;
	has 	int32 $.green;
	has 	int32 $.alpha;
}


#struct s_toyunda_sub {
#        usigned int     start;
#        usigned int     stop;
#        char*   text;
#        rgba_color_t    color1;
#        rgba_color_t    color2;
#        rgba_color_t    tmpcolor;
#        float   positionx;
#        float   positiony;
#        float   position2x;
#        float   position2y;
#        float   fadingpositionx;
#        float   fadingpositiony;
#        int     size;
#        int     size2;
#        int fadingsize;
#        char*   image;
#};

class toyunda_subtitle_s is repr('CStruct') {
	has	int32 	$.start;
	has	int32	$.stop;

	has	Str	$.text;
	HAS	rgba_color_s	$.color1;
	HAS	rgba_color_s	$.color2;
	has	rgba_color_s	$.tmpcolor;

	has	num32		$.positionx;
	has	num32		$.positiony;
	has	num32		$.position2x;
	has	num32		$.position2y;
	has	num32		$.fadingpositionx;
	has	num32		$.fadingpositiony;

	has	int32		$.size;
	has	int32		$.size2;
	has	int32		$.fadingsize;

	has	str		$.image;
}

my @h = <toyundatype.h>;
my @l;
@nctd-extracompileroptions = "-I", "./";
diag-struct("rgba_color_t", wrong_rgba_color_s, :cheaders(@h));
say "----";
diag-struct("toyunda_sub_t", toyunda_subtitle_s, :cheaders(@h));
say "\n Some function \n";

sub foo1(Str $a, Int $b) is native('whatever') { * };

sub foo2(Num $a, Int $b) is native('whatever') { * };

sub foo3(Str $a, int32 $b) is native('whatever') returns Int { * };

diag-functions(:functions([&foo1, &foo2, &foo3]));

Its output

Compiling a test file, this assume field names are the same
-Perl6 name : wrong_rgba_color_s, C Name : rgba_color_t
__has int32  $red : c-size=4 | nc-size=4 -- : 
__has int32  $blue : c-size=4 | nc-size=4 -- : 
__has int32  $green : c-size=4 | nc-size=4 -- : 
-Size given by sizeof and nativesizeof : C:16/NC:12
-Calculated total sizes : C:12/NC:12
Your representation is smaller than the cstruct, but total size of fields match. Did you forget a field?
----
Compiling a test file, this assume field names are the same
-Perl6 name : toyunda_subtitle_s, C Name : toyunda_sub_t
__has int32  $start : c-size=4 | nc-size=4 -- : 
__has int32  $stop : c-size=4 | nc-size=4 -- : 
__has Str  $text : c-size=4 | nc-size=4 -- : 
__HAS rgba_color_s  $color1 : c-size=16 | nc-size=16 -- : 
__HAS rgba_color_s  $color2 : c-size=16 | nc-size=16 -- : 
__has rgba_color_s  $tmpcolor : c-size=16 | nc-size=4 -- DONT MATCH: C size match nativesizeof(rgba_color_s). put HAS instead of has 
__has num32  $positionx : c-size=4 | nc-size=4 -- : 
__has num32  $positiony : c-size=4 | nc-size=4 -- : 
__has num32  $position2x : c-size=4 | nc-size=4 -- : 
__has num32  $position2y : c-size=4 | nc-size=4 -- : 
__has num32  $fadingpositionx : c-size=4 | nc-size=4 -- : 
__has num32  $fadingpositiony : c-size=4 | nc-size=4 -- : 
__has int32  $size : c-size=4 | nc-size=4 -- : 
__has int32  $size2 : c-size=4 | nc-size=4 -- : 
__has int32  $fadingsize : c-size=4 | nc-size=4 -- : 
__has str  $image : c-size=4 | nc-size=4 -- : You should replace your 'str' type with 'Str'
-Size given by sizeof and nativesizeof : C:100/NC:88
-Calculated total sizes : C:100/NC:88

 Some function 

foo1 - Not a valid parameter type for parameter [2] $b : Int
-->For Numerical type, use the appropriate int32/int64/num64...
foo2 - Not a valid parameter type for parameter [1] $a : Num
-->For Numerical type, use the appropriate int32/int64/num64...
foo2 - Not a valid parameter type for parameter [2] $b : Int
-->For Numerical type, use the appropriate int32/int64/num64...
Int foo3 - You should not return a non NC type (like Int inplace of int32), truncating errors can appear with different architectures

You can’t perform that action at this time.