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

Reply via email to