Cpanel-JSON-XS

 view release on metacpan or  search on metacpan

XS.xs  view on Meta::CPAN


                  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 )