ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/JSON-XS/XS.xs
(Generate patch)

Comparing JSON-XS/XS.xs (file contents):
Revision 1.77 by root, Tue Mar 25 06:37:38 2008 UTC vs.
Revision 1.84 by root, Thu Mar 27 06:37:35 2008 UTC

31#define F_ALLOW_NONREF 0x00000100UL 31#define F_ALLOW_NONREF 0x00000100UL
32#define F_SHRINK 0x00000200UL 32#define F_SHRINK 0x00000200UL
33#define F_ALLOW_BLESSED 0x00000400UL 33#define F_ALLOW_BLESSED 0x00000400UL
34#define F_CONV_BLESSED 0x00000800UL 34#define F_CONV_BLESSED 0x00000800UL
35#define F_RELAXED 0x00001000UL 35#define F_RELAXED 0x00001000UL
36#define F_ALLOW_UNKNOWN 0x00002000UL
36 37
37#define F_MAXDEPTH 0xf8000000UL 38#define F_MAXDEPTH 0xf8000000UL
38#define S_MAXDEPTH 27 39#define S_MAXDEPTH 27
39#define F_MAXSIZE 0x01f00000UL 40#define F_MAXSIZE 0x01f00000UL
40#define S_MAXSIZE 20 41#define S_MAXSIZE 20
101 int incr_mode; 102 int incr_mode;
102} JSON; 103} JSON;
103 104
104///////////////////////////////////////////////////////////////////////////// 105/////////////////////////////////////////////////////////////////////////////
105// utility functions 106// utility functions
107
108INLINE SV *
109get_bool (const char *name)
110{
111 SV *sv = get_sv (name, 1);
112
113 SvREADONLY_on (sv);
114 SvREADONLY_on (SvRV (sv));
115
116 return sv;
117}
106 118
107INLINE void 119INLINE void
108shrink (SV *sv) 120shrink (SV *sv)
109{ 121{
110 sv_utf8_downgrade (sv, 1); 122 sv_utf8_downgrade (sv, 1);
438 450
439static void 451static void
440encode_hv (enc_t *enc, HV *hv) 452encode_hv (enc_t *enc, HV *hv)
441{ 453{
442 HE *he; 454 HE *he;
443 int count;
444 455
445 if (enc->indent >= enc->maxdepth) 456 if (enc->indent >= enc->maxdepth)
446 croak ("data structure too deep (hit recursion limit)"); 457 croak ("data structure too deep (hit recursion limit)");
447 458
448 encode_ch (enc, '{'); 459 encode_ch (enc, '{');
632 643
633 if (len == 1 && *pv == '1') 644 if (len == 1 && *pv == '1')
634 encode_str (enc, "true", 4, 0); 645 encode_str (enc, "true", 4, 0);
635 else if (len == 1 && *pv == '0') 646 else if (len == 1 && *pv == '0')
636 encode_str (enc, "false", 5, 0); 647 encode_str (enc, "false", 5, 0);
648 else if (enc->json.flags & F_ALLOW_UNKNOWN)
649 encode_str (enc, "null", 4, 0);
637 else 650 else
638 croak ("cannot encode reference to scalar '%s' unless the scalar is 0 or 1", 651 croak ("cannot encode reference to scalar '%s' unless the scalar is 0 or 1",
639 SvPV_nolen (sv_2mortal (newRV_inc (sv)))); 652 SvPV_nolen (sv_2mortal (newRV_inc (sv))));
640 } 653 }
654 else if (enc->json.flags & F_ALLOW_UNKNOWN)
655 encode_str (enc, "null", 4, 0);
641 else 656 else
642 croak ("encountered %s, but JSON can only represent references to arrays or hashes", 657 croak ("encountered %s, but JSON can only represent references to arrays or hashes",
643 SvPV_nolen (sv_2mortal (newRV_inc (sv)))); 658 SvPV_nolen (sv_2mortal (newRV_inc (sv))));
644} 659}
645 660
707 : snprintf (enc->cur, IVUV_MAXCHARS, "%"IVdf, (IV)SvIVX (sv)); 722 : snprintf (enc->cur, IVUV_MAXCHARS, "%"IVdf, (IV)SvIVX (sv));
708 } 723 }
709 } 724 }
710 else if (SvROK (sv)) 725 else if (SvROK (sv))
711 encode_rv (enc, SvRV (sv)); 726 encode_rv (enc, SvRV (sv));
712 else if (!SvOK (sv)) 727 else if (!SvOK (sv) || enc->json.flags & F_ALLOW_UNKNOWN)
713 encode_str (enc, "null", 4, 0); 728 encode_str (enc, "null", 4, 0);
714 else 729 else
715 croak ("encountered perl type (%s,0x%x) that JSON cannot handle, you might want to report this", 730 croak ("encountered perl type (%s,0x%x) that JSON cannot handle, you might want to report this",
716 SvPV_nolen (sv), SvFLAGS (sv)); 731 SvPV_nolen (sv), SvFLAGS (sv));
717} 732}
1344 case 't': 1359 case 't':
1345 if (dec->end - dec->cur >= 4 && !memcmp (dec->cur, "true", 4)) 1360 if (dec->end - dec->cur >= 4 && !memcmp (dec->cur, "true", 4))
1346 { 1361 {
1347 dec->cur += 4; 1362 dec->cur += 4;
1348#if JSON_SLOW 1363#if JSON_SLOW
1349 json_true = get_sv ("JSON::XS::true", 1); SvREADONLY_on (json_true); 1364 json_true = get_bool ("JSON::XS::true");
1350#endif 1365#endif
1351 return SvREFCNT_inc (json_true); 1366 return newSVsv (json_true);
1352 } 1367 }
1353 else 1368 else
1354 ERR ("'true' expected"); 1369 ERR ("'true' expected");
1355 1370
1356 break; 1371 break;
1358 case 'f': 1373 case 'f':
1359 if (dec->end - dec->cur >= 5 && !memcmp (dec->cur, "false", 5)) 1374 if (dec->end - dec->cur >= 5 && !memcmp (dec->cur, "false", 5))
1360 { 1375 {
1361 dec->cur += 5; 1376 dec->cur += 5;
1362#if JSON_SLOW 1377#if JSON_SLOW
1363 json_false = get_sv ("JSON::XS::false", 1); SvREADONLY_on (json_false); 1378 json_false = get_bool ("JSON::XS::false");
1364#endif 1379#endif
1365 return SvREFCNT_inc (json_false); 1380 return newSVsv (json_false);
1366 } 1381 }
1367 else 1382 else
1368 ERR ("'false' expected"); 1383 ERR ("'false' expected");
1369 1384
1370 break; 1385 break;
1608 : -1; 1623 : -1;
1609 1624
1610 json_stash = gv_stashpv ("JSON::XS" , 1); 1625 json_stash = gv_stashpv ("JSON::XS" , 1);
1611 json_boolean_stash = gv_stashpv ("JSON::XS::Boolean", 1); 1626 json_boolean_stash = gv_stashpv ("JSON::XS::Boolean", 1);
1612 1627
1613 json_true = get_sv ("JSON::XS::true" , 1); SvREADONLY_on (json_true ); 1628 json_true = get_bool ("JSON::XS::true");
1614 json_false = get_sv ("JSON::XS::false", 1); SvREADONLY_on (json_false); 1629 json_false = get_bool ("JSON::XS::false");
1615} 1630}
1616 1631
1617PROTOTYPES: DISABLE 1632PROTOTYPES: DISABLE
1618 1633
1619void CLONE (...) 1634void CLONE (...)
1647 allow_nonref = F_ALLOW_NONREF 1662 allow_nonref = F_ALLOW_NONREF
1648 shrink = F_SHRINK 1663 shrink = F_SHRINK
1649 allow_blessed = F_ALLOW_BLESSED 1664 allow_blessed = F_ALLOW_BLESSED
1650 convert_blessed = F_CONV_BLESSED 1665 convert_blessed = F_CONV_BLESSED
1651 relaxed = F_RELAXED 1666 relaxed = F_RELAXED
1667 allow_unknown = F_ALLOW_UNKNOWN
1652 PPCODE: 1668 PPCODE:
1653{ 1669{
1654 if (enable) 1670 if (enable)
1655 self->flags |= ix; 1671 self->flags |= ix;
1656 else 1672 else
1671 get_allow_nonref = F_ALLOW_NONREF 1687 get_allow_nonref = F_ALLOW_NONREF
1672 get_shrink = F_SHRINK 1688 get_shrink = F_SHRINK
1673 get_allow_blessed = F_ALLOW_BLESSED 1689 get_allow_blessed = F_ALLOW_BLESSED
1674 get_convert_blessed = F_CONV_BLESSED 1690 get_convert_blessed = F_CONV_BLESSED
1675 get_relaxed = F_RELAXED 1691 get_relaxed = F_RELAXED
1692 get_allow_unknown = F_ALLOW_UNKNOWN
1676 PPCODE: 1693 PPCODE:
1677 XPUSHs (boolSV (self->flags & ix)); 1694 XPUSHs (boolSV (self->flags & ix));
1678 1695
1679void max_depth (JSON *self, UV max_depth = 0x80000000UL) 1696void max_depth (JSON *self, UV max_depth = 0x80000000UL)
1680 PPCODE: 1697 PPCODE:
1799 if (GIMME_V != G_VOID) 1816 if (GIMME_V != G_VOID)
1800 do 1817 do
1801 { 1818 {
1802 STRLEN offset; 1819 STRLEN offset;
1803 1820
1804 incr_parse (self);
1805
1806 if (!INCR_DONE (self)) 1821 if (!INCR_DONE (self))
1822 {
1823 incr_parse (self);
1824 if (!INCR_DONE (self))
1807 break; 1825 break;
1826 }
1808 1827
1809 XPUSHs (decode_json (self->incr_text, self, &offset)); 1828 XPUSHs (decode_json (self->incr_text, self, &offset));
1810 1829
1811 sv_chop (self->incr_text, SvPV_nolen (self->incr_text) + offset); 1830 sv_chop (self->incr_text, SvPV_nolen (self->incr_text) + offset);
1812 self->incr_pos -= offset; 1831 self->incr_pos -= offset;
1819SV *incr_text (JSON *self) 1838SV *incr_text (JSON *self)
1820 ATTRS: lvalue 1839 ATTRS: lvalue
1821 CODE: 1840 CODE:
1822{ 1841{
1823 if (self->incr_pos) 1842 if (self->incr_pos)
1824 croak ("incr_text can only be called after a successful incr_parse call in scalar context %d", self->incr_pos);//D 1843 croak ("incr_text can not be called when the incremental parser already started parsing");
1825 1844
1826 RETVAL = self->incr_text ? SvREFCNT_inc (self->incr_text) : &PL_sv_undef; 1845 RETVAL = self->incr_text ? SvREFCNT_inc (self->incr_text) : &PL_sv_undef;
1827} 1846}
1828 OUTPUT: 1847 OUTPUT:
1829 RETVAL 1848 RETVAL
1849
1850void incr_skip (JSON *self)
1851 CODE:
1852{
1853 if (self->incr_pos)
1854 {
1855 sv_chop (self->incr_text, SvPV_nolen (self->incr_text) + self->incr_pos);
1856 self->incr_pos = 0;
1857 self->incr_nest = 0;
1858 self->incr_mode = 0;
1859 }
1860}
1830 1861
1831void DESTROY (JSON *self) 1862void DESTROY (JSON *self)
1832 CODE: 1863 CODE:
1833 SvREFCNT_dec (self->cb_sk_object); 1864 SvREFCNT_dec (self->cb_sk_object);
1834 SvREFCNT_dec (self->cb_object); 1865 SvREFCNT_dec (self->cb_object);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines