Esempio n. 1
0
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 ;
}
Esempio n. 2
0
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");
    }
}
Esempio n. 3
0
// rv getters
char *swiftperl_reftype(void *vp) {
    SvGETMAGIC((SV *)vp);
    if (SvROK((SV *)vp)) {
        return (char *)sv_reftype(SvRV((SV *)vp), 0);
    } else {
        return "";
    }
}
Esempio n. 4
0
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();
}
Esempio n. 5
0
const char *p5_sv_reftype(PerlInterpreter *my_perl, SV *sv) {
    PERL_SET_CONTEXT(my_perl);
    return sv_reftype(SvRV(sv), 1);
}
Esempio n. 6
0
const char *p5_sv_reftype(PerlInterpreter *my_perl, SV *sv) {
    return sv_reftype(SvRV(sv), 1);
}
Esempio n. 7
0
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);
}