This used to work
my $obj1 = Soldier->new('Benjamin', 'Private', 11111);
my $obj2 = Soldier->new('Sanders', 'Colonel', 22222);
my $obj3 = Soldier->new('Matt', 'Sergeant', 33333);
for my $obj ($obj1, $obj2, $obj3) {
print STDOUT ($obj->get_serial, ") ",
$obj->get_name, " is a ",
$obj->get_rank, "\n");
}
#---------------------------------------------------------
package Soldier;
use Inline C => <<'END';
typedef struct {
char* name;
char* rank;
long serial;
} Soldier;
SV* new(char* class, char* name, char* rank, long serial) {
Soldier* soldier = malloc(sizeof(Soldier));
SV* obj_ref = newSViv(0);
SV* obj = newSVrv(obj_ref, class);
soldier->name = strdup(name);
soldier->rank = strdup(rank);
soldier->serial = serial;
sv_setiv(obj, (IV)soldier);
SvREADONLY_on(obj);
return obj_ref;
}
char* get_name(SV* obj) {
return ((Soldier*)SvIV(SvRV(obj)))->name;
}
char* get_rank(SV* obj) {
return ((Soldier*)SvIV(SvRV(obj)))->rank;
}
long get_serial(SV* obj) {
return ((Soldier*)SvIV(SvRV(obj)))->serial;
}
void DESTROY(SV* obj) {
Soldier* soldier = (Soldier*)SvIV(SvRV(obj));
free(soldier->name);
free(soldier->rank);
free(soldier);
}
END
But now I get
perl -w -MInline=INFO,FORCE validate10v01.pl
<-----------------------Information Section----------------------------------->
Information about the processing of your Inline C code:
Your source code needs to be compiled. I'll use this build directory:
[...]/_Inline/build/Soldier_9c83
and I'll install the executable as:
[...]/_Inline/lib/auto/Soldier_9c83/Soldier_9c83.so
The following Inline C function(s) have been successfully bound to Perl:
void DESTROY(SV * obj)
char * get_name(SV * obj)
char * get_rank(SV * obj)
<-----------------------End of Information Section---------------------------->
Can't locate auto/Soldier/new.al in @INC (@INC contains: [...]/_Inline/lib
/usr/local/lib/perl5/5.6.1/i686-linux /usr/local/lib/perl5/5.6.1
/usr/local/lib/perl5/site_perl/5.6.1/i686-linux /usr/local/lib/perl5/site_perl/5.6.1
/usr/local/lib/perl5/site_perl .) at validate10v01.pl line 1
Looks like new() isn't getting parsed. Nor get_serial().