Cpanel-JSON-XS
view release on metacpan or search on metacpan
if (typesv)
{
value_typesv = newSV (0);
(void)hv_store (typehv, key, len, value_typesv, 0);
}
value = decode_sv (aTHX_ dec, value_typesv);
if (!value)
goto fail;
if (UNLIKELY (key_exists && dupkeys_as_arrayref))
{
av_push ((AV*)SvRV (old_value), value);
hv_store_str (aTHX_ hv, key, len, old_value);
if (dupkeys_first)
{
dupkeys_first = 0;
dec->json.flags &= ~F_DUPKEYS_FIRST;
}
}
else
{
hv_store_str (aTHX_ hv, key, len, value);
}
break;
}
++p;
if (p > dec->end) {
dec->cur = p;
EXPECT_CH (':');
}
}
}
decode_ws (dec);
if (*dec->cur == '}')
{
++dec->cur;
break;
}
if (*dec->cur != ',')
ERR (", or } expected while parsing object/hash");
++dec->cur;
decode_ws (dec);
if (*dec->cur == '}' && dec->json.flags & F_RELAXED)
{
++dec->cur;
break;
}
}
DEC_DEC_DEPTH;
sv = newRV_noinc ((SV *)hv);
/* check filter callbacks */
if (dec->json.flags & F_HOOK)
{
if (dec->json.cb_sk_object && HvKEYS (hv) == 1)
{
HE *cb = NULL, *he;
hv_iterinit (hv);
he = hv_iternext (hv);
hv_iterinit (hv);
/* the next line creates a mortal sv each time it's called. */
/* might want to optimise this for common cases. */
if (LIKELY((UV)he))
cb = hv_fetch_ent (dec->json.cb_sk_object, hv_iterkeysv (he), 0, 0);
if (cb)
{
dSP;
I32 count;
ENTER; SAVETMPS;
PUSHMARK (SP);
XPUSHs (HeVAL (he));
sv_2mortal (sv);
PUTBACK; count = call_sv (HeVAL (cb), G_ARRAY); SPAGAIN;
if (!json_validate (&dec->json))
croak (NULL);
if (count == 1)
{
sv = newSVsv (POPs);
PUTBACK; FREETMPS; LEAVE;
return sv;
}
SvREFCNT_inc (sv);
SP -= count;
PUTBACK; FREETMPS; LEAVE;
}
}
if (dec->json.cb_object)
{
dSP;
I32 count;
ENTER; SAVETMPS;
PUSHMARK (SP);
XPUSHs (sv_2mortal (sv));
PUTBACK; count = call_sv (dec->json.cb_object, G_ARRAY); SPAGAIN;
if (!json_validate (&dec->json))
croak (NULL);
if (count == 1)
{
sv = newSVsv (POPs);
( run in 2.448 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )