factor
Lukas Mai
8 years ago
804 | 804 | |
805 | 805 | #define mkconstpvs(S) mkconstpv(aTHX_ "" S "", sizeof S - 1) |
806 | 806 | |
807 | static OP *mkcroak(OP *msg) { | |
808 | OP *xcroak; | |
809 | xcroak = newCVREF( | |
810 | OPf_WANT_SCALAR, | |
811 | newGVOP(OP_GV, 0, gv_fetchpvs(MY_PKG "::_croak", 0, SVt_PVCV)) | |
812 | ); | |
813 | xcroak = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, msg, xcroak)); | |
814 | return xcroak; | |
815 | } | |
816 | ||
807 | 817 | static OP *mktypecheck(pTHX_ const SV *declarator, int nr, SV *name, PADOFFSET padoff, SV *type) { |
808 | 818 | /* $type->check($value) or F:P::_croak "...: " . $type->get_message($value) */ |
809 | 819 | OP *chk, *err, *msg, *xcroak; |
828 | 838 | |
829 | 839 | msg = newBINOP(OP_CONCAT, 0, err, msg); |
830 | 840 | |
831 | xcroak = newCVREF( | |
832 | OPf_WANT_SCALAR, | |
833 | newGVOP(OP_GV, 0, gv_fetchpvs(MY_PKG "::_croak", 0, SVt_PVCV)) | |
834 | ); | |
835 | xcroak = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, msg, xcroak)); | |
841 | xcroak = mkcroak(msg); | |
836 | 842 | |
837 | 843 | { |
838 | 844 | OP *args = NULL; |
1508 | 1514 | |
1509 | 1515 | amin = args_min(aTHX_ param_spec, spec); |
1510 | 1516 | if (amin > 0) { |
1511 | OP *chk, *cond, *err, *xcroak; | |
1517 | OP *chk, *cond, *err; | |
1512 | 1518 | |
1513 | 1519 | err = mkconstsv(aTHX_ newSVpvf("Too few arguments for %"SVf" (expected %d, got ", SVfARG(declarator), amin)); |
1514 | 1520 | err = newBINOP( |
1522 | 1528 | mkconstpvs(")") |
1523 | 1529 | ); |
1524 | 1530 | |
1525 | xcroak = newCVREF(OPf_WANT_SCALAR, | |
1526 | newGVOP(OP_GV, 0, gv_fetchpvs(MY_PKG "::_croak", 0, SVt_PVCV))); | |
1527 | err = newUNOP(OP_ENTERSUB, OPf_STACKED, | |
1528 | op_append_elem(OP_LIST, err, xcroak)); | |
1531 | err = mkcroak(err); | |
1529 | 1532 | |
1530 | 1533 | cond = newBINOP(OP_LT, 0, |
1531 | 1534 | newAVREF(newGVOP(OP_GV, 0, PL_defgv)), |
1537 | 1540 | |
1538 | 1541 | amax = args_max(param_spec); |
1539 | 1542 | if (amax >= 0) { |
1540 | OP *chk, *cond, *err, *xcroak; | |
1543 | OP *chk, *cond, *err; | |
1541 | 1544 | |
1542 | 1545 | err = mkconstsv(aTHX_ newSVpvf("Too many arguments for %"SVf" (expected %d, got ", SVfARG(declarator), amax)); |
1543 | 1546 | err = newBINOP( |
1551 | 1554 | mkconstpvs(")") |
1552 | 1555 | ); |
1553 | 1556 | |
1554 | xcroak = newCVREF( | |
1555 | OPf_WANT_SCALAR, | |
1556 | newGVOP(OP_GV, 0, gv_fetchpvs(MY_PKG "::_croak", 0, SVt_PVCV)) | |
1557 | ); | |
1558 | err = newUNOP(OP_ENTERSUB, OPf_STACKED, | |
1559 | op_append_elem(OP_LIST, err, xcroak)); | |
1557 | err = mkcroak(err); | |
1560 | 1558 | |
1561 | 1559 | cond = newBINOP( |
1562 | 1560 | OP_GT, 0, |
1569 | 1567 | } |
1570 | 1568 | |
1571 | 1569 | if (param_spec && (count_named_params(param_spec) || (param_spec->slurpy.name && SvPV_nolen(param_spec->slurpy.name)[0] == '%'))) { |
1572 | OP *chk, *cond, *err, *xcroak; | |
1570 | OP *chk, *cond, *err; | |
1573 | 1571 | const UV fixed = count_positional_params(param_spec) + !!param_spec->invocant.name; |
1574 | 1572 | |
1575 | 1573 | err = mkconstsv(aTHX_ newSVpvf("Odd number of paired arguments for %"SVf"", SVfARG(declarator))); |
1576 | 1574 | |
1577 | xcroak = newCVREF( | |
1578 | OPf_WANT_SCALAR, | |
1579 | newGVOP(OP_GV, 0, gv_fetchpvs(MY_PKG "::_croak", 0, SVt_PVCV)) | |
1580 | ); | |
1581 | err = newUNOP(OP_ENTERSUB, OPf_STACKED, | |
1582 | op_append_elem(OP_LIST, err, xcroak)); | |
1575 | err = mkcroak(err); | |
1583 | 1576 | |
1584 | 1577 | cond = newBINOP(OP_GT, 0, |
1585 | 1578 | newAVREF(newGVOP(OP_GV, 0, PL_defgv)), |
1808 | 1801 | var = newUNOP(OP_DELETE, 0, var); |
1809 | 1802 | |
1810 | 1803 | msg = mkconstsv(aTHX_ newSVpvf("In %"SVf": missing named parameter: %.*s", SVfARG(declarator), (int)(n - 1), p + 1)); |
1811 | xcroak = newCVREF( | |
1812 | OPf_WANT_SCALAR, | |
1813 | newGVOP(OP_GV, 0, gv_fetchpvs(MY_PKG "::_croak", 0, SVt_PVCV)) | |
1814 | ); | |
1815 | xcroak = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, msg, xcroak)); | |
1804 | xcroak = mkcroak(msg); | |
1816 | 1805 | |
1817 | 1806 | cond = newUNOP(OP_EXISTS, 0, cond); |
1818 | 1807 | |
1874 | 1863 | msg = mkconstsv(aTHX_ newSVpvf("In %"SVf": no such named parameter: ", SVfARG(declarator))); |
1875 | 1864 | msg = newBINOP(OP_CONCAT, 0, msg, keys); |
1876 | 1865 | |
1877 | xcroak = newCVREF( | |
1878 | OPf_WANT_SCALAR, | |
1879 | newGVOP(OP_GV, 0, gv_fetchpvs(MY_PKG "::_croak", 0, SVt_PVCV)) | |
1880 | ); | |
1881 | xcroak = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, msg, xcroak)); | |
1866 | xcroak = mkcroak(msg); | |
1882 | 1867 | |
1883 | 1868 | cond = newUNOP(OP_KEYS, 0, my_var_g(aTHX_ OP_PADHV, 0, param_spec->rest_hash)); |
1884 | 1869 | xcroak = newCONDOP(0, cond, xcroak, NULL); |
2169 | 2154 | return ret; |
2170 | 2155 | } |
2171 | 2156 | |
2157 | static void my_boot(void) { | |
2158 | HV *const stash = gv_stashpvs(MY_PKG, GV_ADD); | |
2159 | ||
2160 | newCONSTSUB(stash, "FLAG_NAME_OK", newSViv(FLAG_NAME_OK)); | |
2161 | newCONSTSUB(stash, "FLAG_ANON_OK", newSViv(FLAG_ANON_OK)); | |
2162 | newCONSTSUB(stash, "FLAG_DEFAULT_ARGS", newSViv(FLAG_DEFAULT_ARGS)); | |
2163 | newCONSTSUB(stash, "FLAG_CHECK_NARGS", newSViv(FLAG_CHECK_NARGS)); | |
2164 | newCONSTSUB(stash, "FLAG_INVOCANT", newSViv(FLAG_INVOCANT)); | |
2165 | newCONSTSUB(stash, "FLAG_NAMED_PARAMS", newSViv(FLAG_NAMED_PARAMS)); | |
2166 | newCONSTSUB(stash, "FLAG_TYPES_OK", newSViv(FLAG_TYPES_OK)); | |
2167 | newCONSTSUB(stash, "FLAG_CHECK_TARGS", newSViv(FLAG_CHECK_TARGS)); | |
2168 | newCONSTSUB(stash, "FLAG_RUNTIME", newSViv(FLAG_RUNTIME)); | |
2169 | newCONSTSUB(stash, "HINTK_KEYWORDS", newSVpvs(HINTK_KEYWORDS)); | |
2170 | newCONSTSUB(stash, "HINTK_FLAGS_", newSVpvs(HINTK_FLAGS_)); | |
2171 | newCONSTSUB(stash, "HINTK_SHIFT_", newSVpvs(HINTK_SHIFT_)); | |
2172 | newCONSTSUB(stash, "HINTK_ATTRS_", newSVpvs(HINTK_ATTRS_)); | |
2173 | newCONSTSUB(stash, "HINTK_REIFY_", newSVpvs(HINTK_REIFY_)); | |
2174 | ||
2175 | next_keyword_plugin = PL_keyword_plugin; | |
2176 | PL_keyword_plugin = my_keyword_plugin; | |
2177 | } | |
2178 | ||
2172 | 2179 | #ifndef assert_ |
2173 | 2180 | #ifdef DEBUGGING |
2174 | 2181 | #define assert_(X) assert(X), |
2231 | 2238 | CvANON_off(body); |
2232 | 2239 | |
2233 | 2240 | BOOT: |
2234 | WARNINGS_ENABLE { | |
2235 | HV *const stash = gv_stashpvs(MY_PKG, GV_ADD); | |
2236 | /**/ | |
2237 | newCONSTSUB(stash, "FLAG_NAME_OK", newSViv(FLAG_NAME_OK)); | |
2238 | newCONSTSUB(stash, "FLAG_ANON_OK", newSViv(FLAG_ANON_OK)); | |
2239 | newCONSTSUB(stash, "FLAG_DEFAULT_ARGS", newSViv(FLAG_DEFAULT_ARGS)); | |
2240 | newCONSTSUB(stash, "FLAG_CHECK_NARGS", newSViv(FLAG_CHECK_NARGS)); | |
2241 | newCONSTSUB(stash, "FLAG_INVOCANT", newSViv(FLAG_INVOCANT)); | |
2242 | newCONSTSUB(stash, "FLAG_NAMED_PARAMS", newSViv(FLAG_NAMED_PARAMS)); | |
2243 | newCONSTSUB(stash, "FLAG_TYPES_OK", newSViv(FLAG_TYPES_OK)); | |
2244 | newCONSTSUB(stash, "FLAG_CHECK_TARGS", newSViv(FLAG_CHECK_TARGS)); | |
2245 | newCONSTSUB(stash, "FLAG_RUNTIME", newSViv(FLAG_RUNTIME)); | |
2246 | newCONSTSUB(stash, "HINTK_KEYWORDS", newSVpvs(HINTK_KEYWORDS)); | |
2247 | newCONSTSUB(stash, "HINTK_FLAGS_", newSVpvs(HINTK_FLAGS_)); | |
2248 | newCONSTSUB(stash, "HINTK_SHIFT_", newSVpvs(HINTK_SHIFT_)); | |
2249 | newCONSTSUB(stash, "HINTK_ATTRS_", newSVpvs(HINTK_ATTRS_)); | |
2250 | newCONSTSUB(stash, "HINTK_REIFY_", newSVpvs(HINTK_REIFY_)); | |
2251 | /**/ | |
2252 | next_keyword_plugin = PL_keyword_plugin; | |
2253 | PL_keyword_plugin = my_keyword_plugin; | |
2254 | } WARNINGS_RESET | |
2241 | my_boot(); |