… | |
… | |
99 | |
99 | |
100 | #define F_SHRINK 0x00000001UL |
100 | #define F_SHRINK 0x00000001UL |
101 | #define F_ALLOW_UNKNOWN 0x00000002UL |
101 | #define F_ALLOW_UNKNOWN 0x00000002UL |
102 | #define F_ALLOW_SHARING 0x00000004UL |
102 | #define F_ALLOW_SHARING 0x00000004UL |
103 | #define F_ALLOW_CYCLES 0x00000008UL |
103 | #define F_ALLOW_CYCLES 0x00000008UL |
|
|
104 | #define F_FORBID_OBJECTS 0x00000010UL |
104 | #define F_PACK_STRINGS 0x00000010UL |
105 | #define F_PACK_STRINGS 0x00000020UL |
105 | #define F_TEXT_KEYS 0x00000020UL |
106 | #define F_TEXT_KEYS 0x00000040UL |
106 | #define F_TEXT_STRINGS 0x00000040UL |
107 | #define F_TEXT_STRINGS 0x00000080UL |
107 | #define F_VALIDATE_UTF8 0x00000080UL |
108 | #define F_VALIDATE_UTF8 0x00000100UL |
108 | |
109 | |
109 | #define INIT_SIZE 32 // initial scalar size to be allocated |
110 | #define INIT_SIZE 32 // initial scalar size to be allocated |
110 | |
111 | |
111 | #define SB do { |
112 | #define SB do { |
112 | #define SE } while (0) |
113 | #define SE } while (0) |
… | |
… | |
477 | if (ecb_expect_false (SvOBJECT (sv))) |
478 | if (ecb_expect_false (SvOBJECT (sv))) |
478 | { |
479 | { |
479 | HV *stash = SvSTASH (sv); |
480 | HV *stash = SvSTASH (sv); |
480 | GV *method; |
481 | GV *method; |
481 | |
482 | |
|
|
483 | if (enc->cbor.flags & F_FORBID_OBJECTS) |
|
|
484 | croak ("encountered object '%s', but forbid_objects is enabled", |
|
|
485 | SvPV_nolen (sv_2mortal (newRV_inc (sv)))); |
482 | if ((method = gv_fetchmethod_autoload (stash, "TO_CBOR", 0))) |
486 | else if ((method = gv_fetchmethod_autoload (stash, "TO_CBOR", 0))) |
483 | { |
487 | { |
484 | dSP; |
488 | dSP; |
485 | |
489 | |
486 | ENTER; SAVETMPS; |
490 | ENTER; SAVETMPS; |
487 | PUSHMARK (SP); |
491 | PUSHMARK (SP); |
… | |
… | |
1081 | } |
1085 | } |
1082 | break; |
1086 | break; |
1083 | |
1087 | |
1084 | case CBOR_TAG_PERL_OBJECT: |
1088 | case CBOR_TAG_PERL_OBJECT: |
1085 | { |
1089 | { |
|
|
1090 | if (dec->cbor.flags & F_FORBID_OBJECTS) |
|
|
1091 | goto filter; |
|
|
1092 | |
1086 | sv = decode_sv (dec); |
1093 | sv = decode_sv (dec); |
1087 | |
1094 | |
1088 | if (!SvROK (sv) || SvTYPE (SvRV (sv)) != SVt_PVAV) |
1095 | if (!SvROK (sv) || SvTYPE (SvRV (sv)) != SVt_PVAV) |
1089 | ERR ("corrupted CBOR data (non-array perl object)"); |
1096 | ERR ("corrupted CBOR data (non-array perl object)"); |
1090 | |
1097 | |
… | |
… | |
1132 | FREETMPS; LEAVE; |
1139 | FREETMPS; LEAVE; |
1133 | } |
1140 | } |
1134 | break; |
1141 | break; |
1135 | |
1142 | |
1136 | default: |
1143 | default: |
|
|
1144 | filter: |
1137 | { |
1145 | { |
1138 | SV *tag_sv = newSVuv (tag); |
1146 | SV *tag_sv = newSVuv (tag); |
1139 | |
1147 | |
1140 | sv = decode_sv (dec); |
1148 | sv = decode_sv (dec); |
1141 | |
1149 | |
… | |
… | |
1502 | ALIAS: |
1510 | ALIAS: |
1503 | shrink = F_SHRINK |
1511 | shrink = F_SHRINK |
1504 | allow_unknown = F_ALLOW_UNKNOWN |
1512 | allow_unknown = F_ALLOW_UNKNOWN |
1505 | allow_sharing = F_ALLOW_SHARING |
1513 | allow_sharing = F_ALLOW_SHARING |
1506 | allow_cycles = F_ALLOW_CYCLES |
1514 | allow_cycles = F_ALLOW_CYCLES |
|
|
1515 | forbid_objects = F_FORBID_OBJECTS |
1507 | pack_strings = F_PACK_STRINGS |
1516 | pack_strings = F_PACK_STRINGS |
1508 | text_keys = F_TEXT_KEYS |
1517 | text_keys = F_TEXT_KEYS |
1509 | text_strings = F_TEXT_STRINGS |
1518 | text_strings = F_TEXT_STRINGS |
1510 | validate_utf8 = F_VALIDATE_UTF8 |
1519 | validate_utf8 = F_VALIDATE_UTF8 |
1511 | PPCODE: |
1520 | PPCODE: |
… | |
… | |
1522 | ALIAS: |
1531 | ALIAS: |
1523 | get_shrink = F_SHRINK |
1532 | get_shrink = F_SHRINK |
1524 | get_allow_unknown = F_ALLOW_UNKNOWN |
1533 | get_allow_unknown = F_ALLOW_UNKNOWN |
1525 | get_allow_sharing = F_ALLOW_SHARING |
1534 | get_allow_sharing = F_ALLOW_SHARING |
1526 | get_allow_cycles = F_ALLOW_CYCLES |
1535 | get_allow_cycles = F_ALLOW_CYCLES |
|
|
1536 | get_forbid_objects = F_FORBID_OBJECTS |
1527 | get_pack_strings = F_PACK_STRINGS |
1537 | get_pack_strings = F_PACK_STRINGS |
1528 | get_text_keys = F_TEXT_KEYS |
1538 | get_text_keys = F_TEXT_KEYS |
1529 | get_text_strings = F_TEXT_STRINGS |
1539 | get_text_strings = F_TEXT_STRINGS |
1530 | get_validate_utf8 = F_VALIDATE_UTF8 |
1540 | get_validate_utf8 = F_VALIDATE_UTF8 |
1531 | PPCODE: |
1541 | PPCODE: |