From 248cf2ffa9f43e9645c345d58ae2822fd2225979 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 17 Dec 2011 15:02:53 +0100 Subject: [PATCH] FFI: Ignore number parsing errors while skipping definitions. --- src/lj_cparse.c | 4 +++- src/lj_cparse.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) 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) break; cp_get(cp); } - if (lj_char_isident(cp->c)) + if (lj_char_isident(cp->c) && !(cp->mode & CPARSE_MODE_SKIP)) cp_errmsg(cp, cp->c, LJ_ERR_XNUMBER); return CTOK_INTEGER; } @@ -1593,12 +1593,14 @@ static void cp_decl_func(CPState *cp, CPDecl *fdecl) cp_check(cp, ')'); if (cp_opt(cp, '{')) { /* Skip function definition. */ int level = 1; + cp->mode |= CPARSE_MODE_SKIP; for (;;) { if (cp->tok == '{') level++; else if (cp->tok == '}' && --level == 0) break; else if (cp->tok == CTOK_EOF) cp_err_token(cp, '}'); cp_next(cp); } + cp->mode &= ~CPARSE_MODE_SKIP; cp->tok = ';'; /* Ok for cp_decl_multi(), error in cp_decl_single(). */ } 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 @@ #define CPARSE_MODE_DIRECT 4 /* Accept direct declarators. */ #define CPARSE_MODE_FIELD 8 /* Accept field width in bits, too. */ #define CPARSE_MODE_NOIMPLICIT 16 /* Reject implicit declarations. */ +#define CPARSE_MODE_SKIP 32 /* Skip definitions, ignore errors. */ typedef int CPChar; /* C parser character. Unsigned ext. from char. */ typedef int CPToken; /* C parser token. */