diff options
| author | Mike Pall <mike> | 2016-01-18 12:34:48 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2016-01-18 12:34:48 +0100 |
| commit | 89982b7849da496e8f5199c82636836fb24a329f (patch) | |
| tree | 18c326a428093a0985c2c66b9701b93d34be98a6 | |
| parent | 39eddd3b96e3a234973906a4b1979e4f64e87e1c (diff) | |
| download | luajit-89982b7849da496e8f5199c82636836fb24a329f.tar.gz luajit-89982b7849da496e8f5199c82636836fb24a329f.tar.bz2 luajit-89982b7849da496e8f5199c82636836fb24a329f.zip | |
FFI: Parse #line NN and #NN.
| -rw-r--r-- | src/lj_cparse.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/lj_cparse.c b/src/lj_cparse.c index f212bd36..c5e16fd7 100644 --- a/src/lj_cparse.c +++ b/src/lj_cparse.c | |||
| @@ -1744,6 +1744,16 @@ static void cp_pragma(CPState *cp, BCLine pragmaline) | |||
| 1744 | } | 1744 | } |
| 1745 | } | 1745 | } |
| 1746 | 1746 | ||
| 1747 | /* Handle line number. */ | ||
| 1748 | static void cp_line(CPState *cp, BCLine hashline) | ||
| 1749 | { | ||
| 1750 | BCLine newline = cp->val.u32; | ||
| 1751 | /* TODO: Handle file name and include it in error messages. */ | ||
| 1752 | while (cp->tok != CTOK_EOF && cp->linenumber == hashline) | ||
| 1753 | cp_next(cp); | ||
| 1754 | cp->linenumber = newline; | ||
| 1755 | } | ||
| 1756 | |||
| 1747 | /* Parse multiple C declarations of types or extern identifiers. */ | 1757 | /* Parse multiple C declarations of types or extern identifiers. */ |
| 1748 | static void cp_decl_multi(CPState *cp) | 1758 | static void cp_decl_multi(CPState *cp) |
| 1749 | { | 1759 | { |
| @@ -1756,12 +1766,23 @@ static void cp_decl_multi(CPState *cp) | |||
| 1756 | continue; | 1766 | continue; |
| 1757 | } | 1767 | } |
| 1758 | if (cp->tok == '#') { /* Workaround, since we have no preprocessor, yet. */ | 1768 | if (cp->tok == '#') { /* Workaround, since we have no preprocessor, yet. */ |
| 1759 | BCLine pragmaline = cp->linenumber; | 1769 | BCLine hashline = cp->linenumber; |
| 1760 | if (!(cp_next(cp) == CTOK_IDENT && | 1770 | CPToken tok = cp_next(cp); |
| 1761 | cp->str->hash == H_(f5e6b4f8,1d509107))) /* pragma */ | 1771 | if (tok == CTOK_INTEGER) { |
| 1772 | cp_line(cp, hashline); | ||
| 1773 | continue; | ||
| 1774 | } else if (tok == CTOK_IDENT && | ||
| 1775 | cp->str->hash == H_(187aab88,fcb60b42)) { /* line */ | ||
| 1776 | if (cp_next(cp) != CTOK_INTEGER) cp_err_token(cp, tok); | ||
| 1777 | cp_line(cp, hashline); | ||
| 1778 | continue; | ||
| 1779 | } else if (tok == CTOK_IDENT && | ||
| 1780 | cp->str->hash == H_(f5e6b4f8,1d509107)) { /* pragma */ | ||
| 1781 | cp_pragma(cp, hashline); | ||
| 1782 | continue; | ||
| 1783 | } else { | ||
| 1762 | cp_errmsg(cp, cp->tok, LJ_ERR_XSYMBOL); | 1784 | cp_errmsg(cp, cp->tok, LJ_ERR_XSYMBOL); |
| 1763 | cp_pragma(cp, pragmaline); | 1785 | } |
| 1764 | continue; | ||
| 1765 | } | 1786 | } |
| 1766 | scl = cp_decl_spec(cp, &decl, CDF_TYPEDEF|CDF_EXTERN|CDF_STATIC); | 1787 | scl = cp_decl_spec(cp, &decl, CDF_TYPEDEF|CDF_EXTERN|CDF_STATIC); |
| 1767 | if ((cp->tok == ';' || cp->tok == CTOK_EOF) && | 1788 | if ((cp->tok == ';' || cp->tok == CTOK_EOF) && |
