README

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 (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

The Camelia image is copyright 2009 by Larry Wall. "Raku" is trademark of the Yet Another Society. All rights reserved.