use Devel::Peek;
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 ($obj->get_serial, ") ",
$obj->get_name, " is a ",
$obj->get_rank, "\n");
}
Dump($obj1);
print "\n";
package Soldier;
use Inline C => Config =>
TYPEMAPS => './typemap',
BUILD_NOISY => 1;
use Inline C => <<'END';
typedef struct {
char* name;
char* rank;
long serial;
} Soldier;
Soldier * new(char* class, char* name, char* rank, long serial) {
Soldier* soldier;
New(42, soldier, 1, Soldier);
soldier->name = savepv(name);
soldier->rank = savepv(rank);
soldier->serial = serial;
return soldier;
}
char* get_name(Soldier * obj) {
return obj->name;
}
char* get_rank(Soldier * obj) {
return obj->rank;
}
long get_serial(Soldier * obj) {
return obj->serial;
}
void DESTROY(Soldier* obj) {
Safefree(obj->name);
Safefree(obj->rank);
Safefree(obj);
}
END
####
Soldier * SOLDIER
INPUT
SOLDIER
$var = INT2PTR($type, SvIV(SvRV($arg)))
OUTPUT
SOLDIER
$arg = newSViv(0);
SV * obj = newSVrv($arg, \"Soldier\");
sv_setiv(obj, (IV)$var);
SvREADONLY_on(obj);
$arg;
####
Soldier * SOLDIER
INPUT
SOLDIER
$var = INT2PTR($type, SvIV(SvRV($arg)))
OUTPUT
SOLDIER
sv_setref_pv($arg, \"Soldier\", (void*)$var);