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.51 by root, Mon Jul 2 00:48:18 2007 UTC vs.
Revision 1.52 by root, Mon Jul 2 02:57:11 2007 UTC

62static HV *json_stash, *json_boolean_stash; // JSON::XS:: 62static HV *json_stash, *json_boolean_stash; // JSON::XS::
63static SV *json_true, *json_false; 63static SV *json_true, *json_false;
64 64
65typedef struct { 65typedef struct {
66 U32 flags; 66 U32 flags;
67 SV *cb_object, *cb_sk_object; 67 SV *cb_object;
68 HV *cb_sk_object;
68} JSON; 69} JSON;
69 70
70///////////////////////////////////////////////////////////////////////////// 71/////////////////////////////////////////////////////////////////////////////
71// utility functions 72// utility functions
72 73
1098 sv = newRV_noinc ((SV *)hv); 1099 sv = newRV_noinc ((SV *)hv);
1099 1100
1100 // check filter callbacks 1101 // check filter callbacks
1101 if (dec->json.flags & F_HOOK) 1102 if (dec->json.flags & F_HOOK)
1102 { 1103 {
1103 ENTER; SAVETMPS;
1104
1105 if (dec->json.cb_sk_object && HvKEYS (hv) == 1) 1104 if (dec->json.cb_sk_object && HvKEYS (hv) == 1)
1106 { 1105 {
1106 HE *cb, *he;
1107
1108 hv_iterinit (hv);
1109 he = hv_iternext (hv);
1110 hv_iterinit (hv);
1111
1112 // the next line creates a mortal sv each time its called.
1113 // might want to optimise this for common cases.
1114 cb = hv_fetch_ent (dec->json.cb_sk_object, hv_iterkeysv (he), 0, 0);
1115
1116 if (cb)
1117 {
1107 int count; 1118 int count;
1119 ENTER; SAVETMPS;
1108 1120
1109 dSP; PUSHMARK (SP); 1121 dSP; PUSHMARK (SP);
1110 XPUSHs (sv_2mortal (sv)); 1122 XPUSHs (HeVAL (he));
1111 1123
1112 PUTBACK; count = call_sv (dec->json.cb_sk_object, G_ARRAY); SPAGAIN; 1124 PUTBACK; count = call_sv (HeVAL (cb), G_ARRAY); SPAGAIN;
1113 1125
1114 if (count == 1) 1126 if (count == 1)
1115 { 1127 {
1116 sv = newSVsv (POPs); 1128 sv = newSVsv (POPs);
1117 goto filter_ok; 1129 FREETMPS; LEAVE;
1130 return sv;
1118 } 1131 }
1119 1132
1120 SvREFCNT_inc (sv); 1133 FREETMPS; LEAVE;
1134 }
1121 } 1135 }
1122 1136
1123 if (dec->json.cb_object) 1137 if (dec->json.cb_object)
1124 { 1138 {
1125 int count; 1139 int count;
1140 ENTER; SAVETMPS;
1126 1141
1127 dSP; ENTER; SAVETMPS; PUSHMARK (SP); 1142 dSP; ENTER; SAVETMPS; PUSHMARK (SP);
1128 XPUSHs (sv_2mortal (sv)); 1143 XPUSHs (sv_2mortal (sv));
1129 1144
1130 PUTBACK; count = call_sv (dec->json.cb_object, G_ARRAY); SPAGAIN; 1145 PUTBACK; count = call_sv (dec->json.cb_object, G_ARRAY); SPAGAIN;
1131 1146
1132 if (count == 1) 1147 if (count == 1)
1133 { 1148 {
1134 sv = newSVsv (POPs); 1149 sv = newSVsv (POPs);
1135 goto filter_ok; 1150 FREETMPS; LEAVE;
1151 return sv;
1136 } 1152 }
1137 1153
1138 SvREFCNT_inc (sv); 1154 SvREFCNT_inc (sv);
1155 FREETMPS; LEAVE;
1139 } 1156 }
1140
1141filter_ok:
1142 FREETMPS; LEAVE;
1143 } 1157 }
1144 1158
1145 return sv; 1159 return sv;
1146 1160
1147fail: 1161fail:
1383 1397
1384 XPUSHs (ST (0)); 1398 XPUSHs (ST (0));
1385} 1399}
1386 1400
1387void filter_json_object (JSON *self, SV *cb = &PL_sv_undef) 1401void filter_json_object (JSON *self, SV *cb = &PL_sv_undef)
1388 ALIAS:
1389 filter_json_single_key_object = 1
1390 PPCODE: 1402 PPCODE:
1391{ 1403{
1392 SV **svp; 1404 SvREFCNT_dec (self->cb_object);
1405 self->cb_object = SvOK (cb) ? newSVsv (cb) : 0;
1393 1406
1407 XPUSHs (ST (0));
1408}
1409
1410void filter_json_single_key_object (JSON *self, SV *key, SV *cb = &PL_sv_undef)
1411 PPCODE:
1412{
1413 if (!self->cb_sk_object)
1414 self->cb_sk_object = newHV ();
1415
1394 if (!SvOK (cb)) 1416 if (SvOK (cb))
1395 cb = 0; 1417 hv_store_ent (self->cb_sk_object, key, newSVsv (cb), 0);
1396 else 1418 else
1397 cb = newSVsv (cb);
1398
1399 switch (ix)
1400 { 1419 {
1401 case 0: svp = &self->cb_object ; break; 1420 hv_delete_ent (self->cb_sk_object, key, G_DISCARD, 0);
1402 case 1: svp = &self->cb_sk_object; break; 1421
1422 if (!HvKEYS (self->cb_sk_object))
1423 {
1424 SvREFCNT_dec (self->cb_sk_object);
1425 self->cb_sk_object = 0;
1426 }
1403 } 1427 }
1404
1405 if (*svp)
1406 SvREFCNT_dec (*svp);
1407
1408 *svp = cb;
1409 1428
1410 XPUSHs (ST (0)); 1429 XPUSHs (ST (0));
1411} 1430}
1412 1431
1413void encode (JSON *self, SV *scalar) 1432void encode (JSON *self, SV *scalar)
1425 EXTEND (SP, 2); 1444 EXTEND (SP, 2);
1426 PUSHs (decode_json (jsonstr, self, &offset)); 1445 PUSHs (decode_json (jsonstr, self, &offset));
1427 PUSHs (sv_2mortal (newSVuv (offset))); 1446 PUSHs (sv_2mortal (newSVuv (offset)));
1428} 1447}
1429 1448
1449void DESTROY (JSON *self)
1450 CODE:
1451 SvREFCNT_dec (self->cb_sk_object);
1452 SvREFCNT_dec (self->cb_object);
1453
1430PROTOTYPES: ENABLE 1454PROTOTYPES: ENABLE
1431 1455
1432void to_json (SV *scalar) 1456void to_json (SV *scalar)
1433 PPCODE: 1457 PPCODE:
1434{ 1458{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines