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) && |