summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2016-01-18 12:34:48 +0100
committerMike Pall <mike>2016-01-18 12:34:48 +0100
commit89982b7849da496e8f5199c82636836fb24a329f (patch)
tree18c326a428093a0985c2c66b9701b93d34be98a6 /src
parent39eddd3b96e3a234973906a4b1979e4f64e87e1c (diff)
downloadluajit-89982b7849da496e8f5199c82636836fb24a329f.tar.gz
luajit-89982b7849da496e8f5199c82636836fb24a329f.tar.bz2
luajit-89982b7849da496e8f5199c82636836fb24a329f.zip
FFI: Parse #line NN and #NN.
Diffstat (limited to 'src')
-rw-r--r--src/lj_cparse.c31
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. */
1748static 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. */
1748static void cp_decl_multi(CPState *cp) 1758static 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) &&