bool Perl_sv_derived_from(pTHX_ SV *sv, const char *name) { char *type; HV *stash; stash = Nullhv; type = Nullch; if (SvGMAGICAL(sv)) mg_get(sv) ; if (SvROK(sv)) { sv = SvRV(sv); type = sv_reftype(sv,0); if (SvOBJECT(sv)) stash = SvSTASH(sv); } else { stash = gv_stashsv(sv, FALSE); } return (type && strEQ(type,name)) || (stash && isa_lookup(stash, name, strlen(name), 0) == &PL_sv_yes) ? TRUE : FALSE ; }
std::string av_type(AV* av) { SV* first = *(av_fetch(av, 0, 0)); if (SvROK(first) && sv_isobject(first)) { return std::string(sv_reftype(SvRV(first), 1)); } else { return std::string("String"); } }
// rv getters char *swiftperl_reftype(void *vp) { SvGETMAGIC((SV *)vp); if (SvROK((SV *)vp)) { return (char *)sv_reftype(SvRV((SV *)vp), 0); } else { return ""; } }
mesos::perl::CommandArg sv_to_CommandArg(SV* msg) { if (SvTYPE(msg) == SVt_PV) { return mesos::perl::CommandArg(sv_to_string(msg)); } else if (!SvROK(msg)) { Perl_croak(aTHX_ "Must pass string or ref as command arg"); } else if (sv_isobject(msg)) { const char* type = sv_reftype(SvRV(msg), 1); return mesos::perl::CommandArg(sv_to_msg(msg), std::string(type)); } else if (SvTYPE(SvRV(msg)) == SVt_PVAV) { AV* args_av = (AV*) SvRV(msg); int length = AvFILL(args_av) + 1; std::vector<std::string> data_vec; for (int i = 0; i < length; i++) { SV* el = *(av_fetch(args_av, i, 0)); std::string data = sv_isobject(el) ? sv_to_msg(el) : sv_to_string(el); data_vec.push_back(data); } return mesos::perl::CommandArg(data_vec, av_type(args_av)); } // control shouldnt reach here, but compilers complain so just return empty command arg return mesos::perl::CommandArg(); }
const char *p5_sv_reftype(PerlInterpreter *my_perl, SV *sv) { PERL_SET_CONTEXT(my_perl); return sv_reftype(SvRV(sv), 1); }
const char *p5_sv_reftype(PerlInterpreter *my_perl, SV *sv) { return sv_reftype(SvRV(sv), 1); }
static void tn_encode(SV *data, struct tn_buffer *buf) { size_t init_length = tn_buffer_length(buf) + 1; /* Null */ if(!SvOK(data)) { tn_buffer_puts(buf, "0:~", 3); return; } /* Boolean */ else if(sv_isobject(data) && sv_derived_from(data, "boolean")) { tn_buffer_putc(buf, tn_type_bool); if(SvTRUE(data)) { tn_buffer_puts(buf, "4:true", 6); } else { tn_buffer_puts(buf, "5:false", 7); } return; } /* Integer */ else if(SvIOK(data)) { /* The evaluatioin order of arguments isn't defined, so * stringify before calling tn_buffer_puts(). */ SvPV_nolen(data); tn_buffer_putc(buf, tn_type_integer); tn_buffer_puts(buf, SvPVX(data), SvCUR(data)); } /* Floating point */ else if(SvNOK(data)) { /* The evaluatioin order of arguments isn't defined, so * stringify before calling tn_buffer_puts(). */ SvPV_nolen(data); tn_buffer_putc(buf, tn_type_float); tn_buffer_puts(buf, SvPVX(data), SvCUR(data)); } /* String */ else if(SvPOK(data)) { tn_buffer_putc(buf, tn_type_bytestring); tn_buffer_puts(buf, SvPVX(data), SvCUR(data)); } /* Reference (Hash/Array) */ else if(SvROK(data)) { data = SvRV(data); switch(SvTYPE(data)) { case SVt_PVAV: tn_buffer_putc(buf, tn_type_array); tn_encode_array(data, buf); break; case SVt_PVHV: tn_buffer_putc(buf, tn_type_hash); tn_encode_hash(data, buf); break; default: croak("encountered %s (%s), but TNetstrings can only represent references to arrays or hashes", SvPV_nolen(data), sv_reftype(data, 0)); } } else { croak("support for type (%s, %s) not implemented, please file a bug", sv_reftype(data, 0), SvPV_nolen(data)); } tn_buffer_putc(buf, ':'); tn_buffer_puti(buf, tn_buffer_length(buf) - init_length - 1); }