void must_not_delete_cpp_object(SV* perl_obj, bool must_not_delete) { HV* hidden_hash; IV can_delete; SV** can_delete_sv; hidden_hash = get_hidden_hash(perl_obj); can_delete_sv = hv_fetch(hidden_hash, "_can_delete", 11, 0); can_delete = must_not_delete ? 0 : 1; sv_setiv(*can_delete_sv, can_delete); hv_store(hidden_hash, "_can_delete", 11, *can_delete_sv, 0); } #### Setting can_delete to 0 in 403291976 at test.pl line 136. Can't coerce HASH to integer in subroutine entry at test.pl line 136. #### HV* get_hidden_hash(SV* perl_obj) { SV* underlying_hash; MAGIC* mg; HV* hidden_hash; // get the underlying hash that the perl_obj is a reference to // (we can leave it an SV* because we're just using it to find magic) underlying_hash = SvRV(perl_obj); // get the hidden hash linked to the perl_obj mg = mg_find(underlying_hash, PERL_MAGIC_ext); hidden_hash = (HV*)mg->mg_obj; return hidden_hash; }