diff options
| author | Mike Pall <mike> | 2011-12-17 15:02:53 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-12-17 15:02:53 +0100 |
| commit | 248cf2ffa9f43e9645c345d58ae2822fd2225979 (patch) | |
| tree | 5c1e13c7134298337da1b628d2b6a7f4ed224571 /src | |
| parent | d050b2fff56011b8fafb754ad579c02e04097953 (diff) | |
| download | luajit-248cf2ffa9f43e9645c345d58ae2822fd2225979.tar.gz luajit-248cf2ffa9f43e9645c345d58ae2822fd2225979.tar.bz2 luajit-248cf2ffa9f43e9645c345d58ae2822fd2225979.zip | |
FFI: Ignore number parsing errors while skipping definitions.
Diffstat (limited to 'src')
| -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. */ |
