be C89 again (also avoid other compiler warnings)
Lukas Mai
11 years ago
267 | 267 | |
268 | 268 | static void my_sv_cat_c(pTHX_ SV *sv, U32 c) { |
269 | 269 | char ds[UTF8_MAXBYTES + 1], *d; |
270 | d = uvchr_to_utf8(ds, c); | |
270 | d = (char *)uvchr_to_utf8((U8 *)ds, c); | |
271 | 271 | if (d - ds > 1) { |
272 | 272 | sv_utf8_upgrade(sv); |
273 | 273 | } |
944 | 944 | *init_sentinel = NULL; |
945 | 945 | param_spec->named_optional.used++; |
946 | 946 | } else { |
947 | Param *p; | |
948 | ||
947 | 949 | if (param_spec->positional_optional.used) { |
948 | 950 | croak("In %"SVf": can't combine optional positional (%"SVf") and required named (%"SVf") parameters", SVfARG(declarator), SVfARG(param_spec->positional_optional.data[0].param.name), SVfARG(name)); |
949 | 951 | } |
950 | 952 | |
951 | Param *p = pv_extend(¶m_spec->named_required); | |
953 | p = pv_extend(¶m_spec->named_required); | |
952 | 954 | p->name = name; |
953 | 955 | p->padoff = padoff; |
954 | 956 | param_spec->named_required.used++; |
1109 | 1111 | /* check number of arguments */ |
1110 | 1112 | if (spec->flags & FLAG_CHECK_NARGS) { |
1111 | 1113 | int amin, amax; |
1112 | size_t named; | |
1113 | 1114 | |
1114 | 1115 | amin = args_min(aTHX_ param_spec, spec); |
1115 | 1116 | if (amin > 0) { |
1116 | OP *chk, *cond, *err, *croak; | |
1117 | OP *chk, *cond, *err, *xcroak; | |
1117 | 1118 | |
1118 | 1119 | err = mkconstsv(aTHX_ newSVpvf("Not enough arguments for %"SVf" (expected %d, got ", SVfARG(declarator), amin)); |
1119 | 1120 | err = newBINOP( |
1127 | 1128 | mkconstpvs(")") |
1128 | 1129 | ); |
1129 | 1130 | |
1130 | croak = newCVREF(OPf_WANT_SCALAR, | |
1131 | newGVOP(OP_GV, 0, gv_fetchpvs("Carp::croak", 0, SVt_PVCV))); | |
1131 | xcroak = newCVREF(OPf_WANT_SCALAR, | |
1132 | newGVOP(OP_GV, 0, gv_fetchpvs("Carp::croak", 0, SVt_PVCV))); | |
1132 | 1133 | err = newUNOP(OP_ENTERSUB, OPf_STACKED, |
1133 | op_append_elem(OP_LIST, err, croak)); | |
1134 | op_append_elem(OP_LIST, err, xcroak)); | |
1134 | 1135 | |
1135 | 1136 | cond = newBINOP(OP_LT, 0, |
1136 | 1137 | newAVREF(newGVOP(OP_GV, 0, PL_defgv)), |
1142 | 1143 | |
1143 | 1144 | amax = args_max(param_spec); |
1144 | 1145 | if (amax >= 0) { |
1145 | OP *chk, *cond, *err, *croak; | |
1146 | OP *chk, *cond, *err, *xcroak; | |
1146 | 1147 | |
1147 | 1148 | err = mkconstsv(aTHX_ newSVpvf("Too many arguments for %"SVf" (expected %d, got ", SVfARG(declarator), amax)); |
1148 | 1149 | err = newBINOP( |
1156 | 1157 | mkconstpvs(")") |
1157 | 1158 | ); |
1158 | 1159 | |
1159 | croak = newCVREF( | |
1160 | xcroak = newCVREF( | |
1160 | 1161 | OPf_WANT_SCALAR, |
1161 | 1162 | newGVOP(OP_GV, 0, gv_fetchpvs("Carp::croak", 0, SVt_PVCV)) |
1162 | 1163 | ); |
1163 | 1164 | err = newUNOP(OP_ENTERSUB, OPf_STACKED, |
1164 | op_append_elem(OP_LIST, err, croak)); | |
1165 | op_append_elem(OP_LIST, err, xcroak)); | |
1165 | 1166 | |
1166 | 1167 | cond = newBINOP( |
1167 | 1168 | OP_GT, 0, |
1174 | 1175 | } |
1175 | 1176 | |
1176 | 1177 | if (param_spec && (count_named_params(param_spec) || (param_spec->slurpy.name && SvPV_nolen(param_spec->slurpy.name)[0] == '%'))) { |
1177 | OP *chk, *cond, *err, *croak; | |
1178 | OP *chk, *cond, *err, *xcroak; | |
1178 | 1179 | const UV fixed = count_positional_params(param_spec) + !!param_spec->invocant.name; |
1179 | 1180 | |
1180 | 1181 | err = mkconstsv(aTHX_ newSVpvf("Odd number of paired arguments for %"SVf"", SVfARG(declarator))); |
1181 | 1182 | |
1182 | croak = newCVREF( | |
1183 | xcroak = newCVREF( | |
1183 | 1184 | OPf_WANT_SCALAR, |
1184 | 1185 | newGVOP(OP_GV, 0, gv_fetchpvs("Carp::croak", 0, SVt_PVCV)) |
1185 | 1186 | ); |
1186 | 1187 | err = newUNOP(OP_ENTERSUB, OPf_STACKED, |
1187 | op_append_elem(OP_LIST, err, croak)); | |
1188 | op_append_elem(OP_LIST, err, xcroak)); | |
1188 | 1189 | |
1189 | 1190 | cond = newBINOP(OP_GT, 0, |
1190 | 1191 | newAVREF(newGVOP(OP_GV, 0, PL_defgv)), |
1382 | 1383 | cond = mkhvelem(aTHX_ param_spec->rest_hash, mkconstpv(aTHX_ p + 1, n - 1)); |
1383 | 1384 | |
1384 | 1385 | if (spec->flags & FLAG_CHECK_NARGS) { |
1385 | OP *croak, *msg; | |
1386 | OP *xcroak, *msg; | |
1386 | 1387 | |
1387 | 1388 | var = mkhvelem(aTHX_ param_spec->rest_hash, mkconstpv(aTHX_ p + 1, n - 1)); |
1388 | 1389 | var = newUNOP(OP_DELETE, 0, var); |
1389 | 1390 | |
1390 | 1391 | msg = mkconstsv(aTHX_ newSVpvf("In %"SVf": missing named parameter: %.*s", SVfARG(declarator), (int)(n - 1), p + 1)); |
1391 | croak = newCVREF( | |
1392 | xcroak = newCVREF( | |
1392 | 1393 | OPf_WANT_SCALAR, |
1393 | 1394 | newGVOP(OP_GV, 0, gv_fetchpvs("Carp::croak", 0, SVt_PVCV)) |
1394 | 1395 | ); |
1395 | croak = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, msg, croak)); | |
1396 | xcroak = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, msg, xcroak)); | |
1396 | 1397 | |
1397 | 1398 | cond = newUNOP(OP_EXISTS, 0, cond); |
1398 | 1399 | |
1399 | cond = newCONDOP(0, cond, var, croak); | |
1400 | cond = newCONDOP(0, cond, var, xcroak); | |
1400 | 1401 | } |
1401 | 1402 | |
1402 | 1403 | var = my_var( |
1437 | 1438 | if (!param_spec->slurpy.name) { |
1438 | 1439 | if (spec->flags & FLAG_CHECK_NARGS) { |
1439 | 1440 | /* croak if %{rest} */ |
1440 | OP *croak, *cond, *keys, *msg; | |
1441 | OP *xcroak, *cond, *keys, *msg; | |
1441 | 1442 | |
1442 | 1443 | keys = newUNOP(OP_KEYS, 0, my_var_g(aTHX_ OP_PADHV, 0, param_spec->rest_hash)); |
1443 | 1444 | keys = newLISTOP(OP_SORT, 0, newOP(OP_PUSHMARK, 0), keys); |
1459 | 1460 | msg = mkconstsv(aTHX_ newSVpvf("In %"SVf": no such named parameter: ", SVfARG(declarator))); |
1460 | 1461 | msg = newBINOP(OP_CONCAT, 0, msg, keys); |
1461 | 1462 | |
1462 | croak = newCVREF( | |
1463 | xcroak = newCVREF( | |
1463 | 1464 | OPf_WANT_SCALAR, |
1464 | 1465 | newGVOP(OP_GV, 0, gv_fetchpvs("Carp::croak", 0, SVt_PVCV)) |
1465 | 1466 | ); |
1466 | croak = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, msg, croak)); | |
1467 | xcroak = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, msg, xcroak)); | |
1467 | 1468 | |
1468 | 1469 | cond = newUNOP(OP_KEYS, 0, my_var_g(aTHX_ OP_PADHV, 0, param_spec->rest_hash)); |
1469 | croak = newCONDOP(0, cond, croak, NULL); | |
1470 | ||
1471 | *prelude_sentinel = op_append_list(OP_LINESEQ, *prelude_sentinel, newSTATEOP(0, NULL, croak)); | |
1470 | xcroak = newCONDOP(0, cond, xcroak, NULL); | |
1471 | ||
1472 | *prelude_sentinel = op_append_list(OP_LINESEQ, *prelude_sentinel, newSTATEOP(0, NULL, xcroak)); | |
1472 | 1473 | } else { |
1473 | 1474 | OP *clear; |
1474 | 1475 |