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