diff options
-rw-r--r-- | src/lj_cparse.c | 4 | ||||
-rw-r--r-- | src/lj_cparse.h | 1 |
2 files changed, 4 insertions, 1 deletions
diff --git a/src/lj_cparse.c b/src/lj_cparse.c index 09b1ca06..4f562dff 100644 --- a/src/lj_cparse.c +++ b/src/lj_cparse.c | |||
@@ -187,7 +187,7 @@ static CPToken cp_integer(CPState *cp) | |||
187 | break; | 187 | break; |
188 | cp_get(cp); | 188 | cp_get(cp); |
189 | } | 189 | } |
190 | if (lj_char_isident(cp->c)) | 190 | if (lj_char_isident(cp->c) && !(cp->mode & CPARSE_MODE_SKIP)) |
191 | cp_errmsg(cp, cp->c, LJ_ERR_XNUMBER); | 191 | cp_errmsg(cp, cp->c, LJ_ERR_XNUMBER); |
192 | return CTOK_INTEGER; | 192 | return CTOK_INTEGER; |
193 | } | 193 | } |
@@ -1593,12 +1593,14 @@ static void cp_decl_func(CPState *cp, CPDecl *fdecl) | |||
1593 | cp_check(cp, ')'); | 1593 | cp_check(cp, ')'); |
1594 | if (cp_opt(cp, '{')) { /* Skip function definition. */ | 1594 | if (cp_opt(cp, '{')) { /* Skip function definition. */ |
1595 | int level = 1; | 1595 | int level = 1; |
1596 | cp->mode |= CPARSE_MODE_SKIP; | ||
1596 | for (;;) { | 1597 | for (;;) { |
1597 | if (cp->tok == '{') level++; | 1598 | if (cp->tok == '{') level++; |
1598 | else if (cp->tok == '}' && --level == 0) break; | 1599 | else if (cp->tok == '}' && --level == 0) break; |
1599 | else if (cp->tok == CTOK_EOF) cp_err_token(cp, '}'); | 1600 | else if (cp->tok == CTOK_EOF) cp_err_token(cp, '}'); |
1600 | cp_next(cp); | 1601 | cp_next(cp); |
1601 | } | 1602 | } |
1603 | cp->mode &= ~CPARSE_MODE_SKIP; | ||
1602 | cp->tok = ';'; /* Ok for cp_decl_multi(), error in cp_decl_single(). */ | 1604 | cp->tok = ';'; /* Ok for cp_decl_multi(), error in cp_decl_single(). */ |
1603 | } | 1605 | } |
1604 | info |= (fdecl->fattr & ~CTMASK_CID); | 1606 | info |= (fdecl->fattr & ~CTMASK_CID); |
diff --git a/src/lj_cparse.h b/src/lj_cparse.h index 535bc461..c9477003 100644 --- a/src/lj_cparse.h +++ b/src/lj_cparse.h | |||
@@ -23,6 +23,7 @@ | |||
23 | #define CPARSE_MODE_DIRECT 4 /* Accept direct declarators. */ | 23 | #define CPARSE_MODE_DIRECT 4 /* Accept direct declarators. */ |
24 | #define CPARSE_MODE_FIELD 8 /* Accept field width in bits, too. */ | 24 | #define CPARSE_MODE_FIELD 8 /* Accept field width in bits, too. */ |
25 | #define CPARSE_MODE_NOIMPLICIT 16 /* Reject implicit declarations. */ | 25 | #define CPARSE_MODE_NOIMPLICIT 16 /* Reject implicit declarations. */ |
26 | #define CPARSE_MODE_SKIP 32 /* Skip definitions, ignore errors. */ | ||
26 | 27 | ||
27 | typedef int CPChar; /* C parser character. Unsigned ext. from char. */ | 28 | typedef int CPChar; /* C parser character. Unsigned ext. from char. */ |
28 | typedef int CPToken; /* C parser token. */ | 29 | typedef int CPToken; /* C parser token. */ |