| 938 | |
| 939 | |
| 940 | static void parlist (LexState *ls) { |
| 941 | /* parlist -> [ param { ',' param } ] */ |
| 942 | FuncState *fs = ls->fs; |
| 943 | Proto *f = fs->f; |
| 944 | int nparams = 0; |
| 945 | int isvararg = 0; |
| 946 | if (ls->t.token != ')') { /* is 'parlist' not empty? */ |
| 947 | do { |
| 948 | switch (ls->t.token) { |
| 949 | case TK_NAME: { /* param -> NAME */ |
| 950 | new_localvar(ls, str_checkname(ls)); |
| 951 | nparams++; |
| 952 | break; |
| 953 | } |
| 954 | case TK_DOTS: { /* param -> '...' */ |
| 955 | luaX_next(ls); |
| 956 | isvararg = 1; |
| 957 | break; |
| 958 | } |
| 959 | default: luaX_syntaxerror(ls, "<name> or '...' expected"); |
| 960 | } |
| 961 | } while (!isvararg && testnext(ls, ',')); |
| 962 | } |
| 963 | adjustlocalvars(ls, nparams); |
| 964 | f->numparams = cast_byte(fs->nactvar); |
| 965 | if (isvararg) |
| 966 | setvararg(fs, f->numparams); /* declared vararg */ |
| 967 | luaK_reserveregs(fs, fs->nactvar); /* reserve registers for parameters */ |
| 968 | } |
| 969 | |
| 970 | |
| 971 | static void body (LexState *ls, expdesc *e, int ismethod, int line) { |
no test coverage detected