Devel-MAT
view release on metacpan or search on metacpan
lib/Devel/MAT.xs view on Meta::CPAN
Newx(hv->values_at, n, struct pmat_hval);
for(i = 0; (ent = hv_iternext(values_at)); i++) {
I32 klen;
const char *key = hv_iterkey(ent, &klen);
SV *val = hv_iterval(values_at, ent);
assert(SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV);
AV *valav = (AV *)SvRV(val);
SV *hek_at = *av_fetch_simple(valav, 0, 0);
SV *value_at = *av_fetch_simple(valav, 1, 0);
hv->values_at[i].key = save_string(key, klen);
hv->values_at[i].klen = klen;
hv->values_at[i].hek = SvOK(hek_at) ? SvUV(hek_at) : 0;
hv->values_at[i].value = SvUV(value_at);
}
// TODO: sort the values so we can binsearch for them later
}
void DESTROY(self)
HV *self
CODE:
{
struct pmat_sv_hash *hv = (struct pmat_sv_hash *)get_pmat_sv(self);
long i;
for(i = 0; i < hv->n_values; i++)
drop_string(hv->values_at[i].key, hv->values_at[i].klen);
Safefree(hv->values_at);
free_pmat_sv((struct pmat_sv *)hv);
}
long
backrefs_at(self)
HV *self
ALIAS:
backrefs_at = 0
n_values = 1
CODE:
{
struct pmat_sv_hash *hv = (struct pmat_sv_hash *)get_pmat_sv(self);
if(hv)
switch(ix) {
case 0: RETVAL = hv->backrefs_at; break;
case 1: RETVAL = hv->n_values; break;
}
}
OUTPUT:
RETVAL
void
keys(self)
HV *self
ALIAS:
keys = 0
values_at = 1
PPCODE:
{
struct pmat_sv_hash *hv = (struct pmat_sv_hash *)get_pmat_sv(self);
long i;
EXTEND(SP, hv->n_values);
for(i = 0; i < hv->n_values; i++)
switch(ix) {
case 0: // keys
mPUSHp(hv->values_at[i].key, hv->values_at[i].klen);
break;
case 1: // values_at
mPUSHu(hv->values_at[i].value);
break;
}
XSRETURN(hv->n_values);
}
SV *
value_at(self, key)
HV *self
SV *key
ALIAS:
hek_at = 0
value_at = 1
CODE:
{
struct pmat_sv_hash *hv = (struct pmat_sv_hash *)get_pmat_sv(self);
long i;
long klen = SvCUR(key);
RETVAL = &PL_sv_undef;
// TODO: store values sorted so we can binsearch
for(i = 0; i < hv->n_values; i++) {
if(hv->values_at[i].klen != klen)
continue;
if(memcmp(hv->values_at[i].key, SvPV_nolen(key), klen) != 0)
continue;
switch(ix) {
case 0:
RETVAL = newSVuv(hv->values_at[i].hek);
break;
case 1:
RETVAL = newSVuv(hv->values_at[i].value);
break;
}
break;
}
}
OUTPUT:
RETVAL
MODULE = Devel::MAT PACKAGE = Devel::MAT::SV::CODE
void
_set_code_fields(self, line, flags, oproot, depth, name_hek, stash_at, outside_at, padlist_at, constval_at, file, name)
HV *self
( run in 0.953 second using v1.01-cache-2.11-cpan-71847e10f99 )