SV * overload_add_eq(SV * obj, SV * addon, SV * third) {
Card* c = (Card *)SvIV(SvRV(obj));
SvREFCNT_inc(obj);
c->value += SvIV(addon);
return obj;
}
####
void overload_add_eq(SV * obj, SV * addon, SV * third) {
Card* c = (Card *)SvIV(SvRV(obj));
c->value += SvIV(addon);
}
####
use warnings;
package My_struct;
use Inline (C => Config =>
BUILD_NOISY => 1,
);
use Inline C => <<'EOC';
typedef struct {
char * suit;
int value;
} Card;
SV * create_struct(SV * s, SV * v) {
Card * cptr;
New(123, cptr, sizeof(Card), Card);
if(cptr == NULL) croak("Failed to allocate memory in create_struct function");
cptr->suit = SvPV_nolen(s);
cptr->value = SvIV(v);
return sv_setref_pv(newSViv(0), "My_struct", cptr);
}
void deref_ref(SV * obj) {
Inline_Stack_Vars;
Inline_Stack_Reset;
Inline_Stack_Push(newSVpv(((Card *)SvIV(SvRV(obj)))->suit, 0));
Inline_Stack_Push(newSViv(((Card *)SvIV(SvRV(obj)))->value));
Inline_Stack_Done;
Inline_Stack_Return(2);
}
void DESTROY(SV * obj) {
printf("Destroying ...");
Card* c = (Card *)SvIV(SvRV(obj));
Safefree(c);
printf("...destroyed\n");
}
void overload_add_eq(SV * obj, SV * addon, SV * third) {
Card* c = (Card *)SvIV(SvRV(obj));
// SvREFCNT_inc(obj);
c->value += SvIV(addon);
// return obj;
}
EOC
use overload '+=' => \&overload_add_eq;
$suit = ('Hearts', 'Spades', 'Clubs', 'Diamonds')[rand(4)];
$value = int(rand(13)) + 1;
$obj = create_struct($suit, $value);
$addon = 5;
@members = deref_ref($obj);
print "@members\n";
#$obj += $addon; # Crashes
overload_add_eq($obj, $addon, 0);
@members = deref_ref($obj);
print "@members\n";