I am trying to write a C function through Inline :: C, which will create and return an array reference for Perl ... below is my script and output. Am I allocating an array and populating it correctly? In particular, I create a temporary SV* array and pass it to av_make and return the link created using newRV_noinc . The link metrics seem great when I look at the ref returned array with Devel :: Peek :: Dump, which looks identical to the same data structure created directly in perl.
I still do not understand what mortality / sv_2mortal , or if I need it here. Apparently, Inline :: C automatically calls sv_2mortal for functions that return SV* , which may or may not be relevant.
#!/usr/bin/env perl use strict; use warnings FATAL => "all"; use 5.010_000; use Data::Dumper; use autodie; use Inline ('C'); use Devel::Peek; my $from_perl = [0 .. 9]; my $from_c = inline_array_maker(10); #same as above but in C say Dumper $from_perl; Dump($from_perl); say Dumper $from_c; Dump($from_c); __END__ __C__ SV* (int len){ int i; SV ** tmp_buffer; AV * arr; tmp_buffer = malloc(sizeof(SV*) * len); printf("allocating tmp_buffer of size %d\n", len); for (i = 0; i < len; i++) { tmp_buffer[i] = newSViv(i); }
I get the following output.
allocating tmp_buffer of size 10 av_make freeing tmp_buffer $VAR1 = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; SV = IV(0x20c7520) at 0x20c7530 REFCNT = 1 FLAGS = (PADMY,ROK) RV = 0x21c0fa8 SV = PVAV(0x25c7ec8) at 0x21c0fa8 REFCNT = 1 FLAGS = () ARRAY = 0x25a0e80 FILL = 9 MAX = 9 ARYLEN = 0x0 FLAGS = (REAL) Elt No. 0 SV = IV(0x20b2dd8) at 0x20b2de8 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 0 Elt No. 1 SV = IV(0x20b2fb8) at 0x20b2fc8 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 1 Elt No. 2 SV = IV(0x20c69f8) at 0x20c6a08 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 2 Elt No. 3 SV = IV(0x20c6a10) at 0x20c6a20 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 3 $VAR1 = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; SV = IV(0x20d25c8) at 0x20d25d8 REFCNT = 1 FLAGS = (PADMY,ROK) RV = 0x25ac6b8 SV = PVAV(0x25c7ea0) at 0x25ac6b8 REFCNT = 1 FLAGS = () ARRAY = 0x25b9140 FILL = 9 MAX = 9 ARYLEN = 0x0 FLAGS = (REAL) Elt No. 0 SV = IV(0x25aca80) at 0x25aca90 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 0 Elt No. 1 SV = IV(0x25ac750) at 0x25ac760 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 1 Elt No. 2 SV = IV(0x25ac5e8) at 0x25ac5f8 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 2 Elt No. 3 SV = IV(0x25ac930) at 0x25ac940 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 3