aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_cparse.c4
-rw-r--r--src/lj_cparse.h1
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
27typedef int CPChar; /* C parser character. Unsigned ext. from char. */ 28typedef int CPChar; /* C parser character. Unsigned ext. from char. */
28typedef int CPToken; /* C parser token. */ 29typedef int CPToken; /* C parser token. */