Codebase list libfunction-parameters-perl / 942ce00
factor Lukas Mai 8 years ago
1 changed file(s) with 42 addition(s) and 55 deletion(s). Raw diff Collapse all Expand all
804804
805805 #define mkconstpvs(S) mkconstpv(aTHX_ "" S "", sizeof S - 1)
806806
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
807817 static OP *mktypecheck(pTHX_ const SV *declarator, int nr, SV *name, PADOFFSET padoff, SV *type) {
808818 /* $type->check($value) or F:P::_croak "...: " . $type->get_message($value) */
809819 OP *chk, *err, *msg, *xcroak;
828838
829839 msg = newBINOP(OP_CONCAT, 0, err, msg);
830840
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);
836842
837843 {
838844 OP *args = NULL;
15081514
15091515 amin = args_min(aTHX_ param_spec, spec);
15101516 if (amin > 0) {
1511 OP *chk, *cond, *err, *xcroak;
1517 OP *chk, *cond, *err;
15121518
15131519 err = mkconstsv(aTHX_ newSVpvf("Too few arguments for %"SVf" (expected %d, got ", SVfARG(declarator), amin));
15141520 err = newBINOP(
15221528 mkconstpvs(")")
15231529 );
15241530
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);
15291532
15301533 cond = newBINOP(OP_LT, 0,
15311534 newAVREF(newGVOP(OP_GV, 0, PL_defgv)),
15371540
15381541 amax = args_max(param_spec);
15391542 if (amax >= 0) {
1540 OP *chk, *cond, *err, *xcroak;
1543 OP *chk, *cond, *err;
15411544
15421545 err = mkconstsv(aTHX_ newSVpvf("Too many arguments for %"SVf" (expected %d, got ", SVfARG(declarator), amax));
15431546 err = newBINOP(
15511554 mkconstpvs(")")
15521555 );
15531556
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);
15601558
15611559 cond = newBINOP(
15621560 OP_GT, 0,
15691567 }
15701568
15711569 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;
15731571 const UV fixed = count_positional_params(param_spec) + !!param_spec->invocant.name;
15741572
15751573 err = mkconstsv(aTHX_ newSVpvf("Odd number of paired arguments for %"SVf"", SVfARG(declarator)));
15761574
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);
15831576
15841577 cond = newBINOP(OP_GT, 0,
15851578 newAVREF(newGVOP(OP_GV, 0, PL_defgv)),
18081801 var = newUNOP(OP_DELETE, 0, var);
18091802
18101803 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);
18161805
18171806 cond = newUNOP(OP_EXISTS, 0, cond);
18181807
18741863 msg = mkconstsv(aTHX_ newSVpvf("In %"SVf": no such named parameter: ", SVfARG(declarator)));
18751864 msg = newBINOP(OP_CONCAT, 0, msg, keys);
18761865
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);
18821867
18831868 cond = newUNOP(OP_KEYS, 0, my_var_g(aTHX_ OP_PADHV, 0, param_spec->rest_hash));
18841869 xcroak = newCONDOP(0, cond, xcroak, NULL);
21692154 return ret;
21702155 }
21712156
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
21722179 #ifndef assert_
21732180 #ifdef DEBUGGING
21742181 #define assert_(X) assert(X),
22312238 CvANON_off(body);
22322239
22332240 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();