diff options
author | Mike Pall <mike> | 2013-02-03 12:47:52 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2013-02-03 12:47:52 +0100 |
commit | 8b46013fdd7a7aad2f3da5cd9b35e0a17be34225 (patch) | |
tree | 94907392bcbfae3b3c8d66e574663e5e1c6f336d /src | |
parent | fe9934feea0a8d580de19389f1a54d6cd4563d6b (diff) | |
download | luajit-8b46013fdd7a7aad2f3da5cd9b35e0a17be34225.tar.gz luajit-8b46013fdd7a7aad2f3da5cd9b35e0a17be34225.tar.bz2 luajit-8b46013fdd7a7aad2f3da5cd9b35e0a17be34225.zip |
FFI: Stricter parsing of declaration specifiers.
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_cparse.c | 53 |
1 files changed, 30 insertions, 23 deletions
diff --git a/src/lj_cparse.c b/src/lj_cparse.c index 9121da11..7c037e2c 100644 --- a/src/lj_cparse.c +++ b/src/lj_cparse.c | |||
@@ -1469,43 +1469,50 @@ static CPscl cp_decl_spec(CPState *cp, CPDecl *decl, CPscl scl) | |||
1469 | 1469 | ||
1470 | for (;;) { /* Parse basic types. */ | 1470 | for (;;) { /* Parse basic types. */ |
1471 | cp_decl_attributes(cp, decl); | 1471 | cp_decl_attributes(cp, decl); |
1472 | if (cp->tok >= CTOK_FIRSTDECL && cp->tok <= CTOK_LASTDECLFLAG) { | ||
1473 | uint32_t cbit; | ||
1474 | if (cp->ct->size) { | ||
1475 | if (sz) goto end_decl; | ||
1476 | sz = cp->ct->size; | ||
1477 | } | ||
1478 | cbit = (1u << (cp->tok - CTOK_FIRSTDECL)); | ||
1479 | cds = cds | cbit | ((cbit & cds & CDF_LONG) << 1); | ||
1480 | if (cp->tok >= CTOK_FIRSTSCL) { | ||
1481 | if (!(scl & cbit)) cp_errmsg(cp, cp->tok, LJ_ERR_FFI_BADSCL); | ||
1482 | } else if (tdef) { | ||
1483 | goto end_decl; | ||
1484 | } | ||
1485 | cp_next(cp); | ||
1486 | continue; | ||
1487 | } | ||
1488 | if (sz || tdef || | ||
1489 | (cds & (CDF_SHORT|CDF_LONG|CDF_SIGNED|CDF_UNSIGNED|CDF_COMPLEX))) | ||
1490 | break; | ||
1472 | switch (cp->tok) { | 1491 | switch (cp->tok) { |
1473 | case CTOK_STRUCT: | 1492 | case CTOK_STRUCT: |
1474 | tdef = cp_decl_struct(cp, decl, CTINFO(CT_STRUCT, 0)); | 1493 | tdef = cp_decl_struct(cp, decl, CTINFO(CT_STRUCT, 0)); |
1475 | break; | 1494 | continue; |
1476 | case CTOK_UNION: | 1495 | case CTOK_UNION: |
1477 | tdef = cp_decl_struct(cp, decl, CTINFO(CT_STRUCT, CTF_UNION)); | 1496 | tdef = cp_decl_struct(cp, decl, CTINFO(CT_STRUCT, CTF_UNION)); |
1478 | break; | 1497 | continue; |
1479 | case CTOK_ENUM: | 1498 | case CTOK_ENUM: |
1480 | tdef = cp_decl_enum(cp, decl); | 1499 | tdef = cp_decl_enum(cp, decl); |
1481 | break; | 1500 | continue; |
1482 | case CTOK_IDENT: | 1501 | case CTOK_IDENT: |
1483 | if (!ctype_istypedef(cp->ct->info) || sz || tdef || | 1502 | if (ctype_istypedef(cp->ct->info)) { |
1484 | (cds & (CDF_SHORT|CDF_LONG|CDF_SIGNED|CDF_UNSIGNED|CDF_COMPLEX))) | 1503 | tdef = ctype_cid(cp->ct->info); /* Get typedef. */ |
1485 | goto end_decl; | 1504 | cp_next(cp); |
1486 | tdef = ctype_cid(cp->ct->info); /* Get typedef. */ | 1505 | continue; |
1487 | cp_next(cp); | 1506 | } |
1488 | break; | 1507 | break; |
1489 | case '$': | 1508 | case '$': |
1490 | tdef = cp->val.id; | 1509 | tdef = cp->val.id; |
1491 | cp_next(cp); | 1510 | cp_next(cp); |
1492 | break; | 1511 | continue; |
1493 | default: | 1512 | default: |
1494 | if (cp->tok >= CTOK_FIRSTDECL && cp->tok <= CTOK_LASTDECLFLAG) { | 1513 | break; |
1495 | uint32_t cbit; | ||
1496 | if (cp->ct->size) { | ||
1497 | if (sz) goto end_decl; | ||
1498 | sz = cp->ct->size; | ||
1499 | } | ||
1500 | cbit = (1u << (cp->tok - CTOK_FIRSTDECL)); | ||
1501 | cds = cds | cbit | ((cbit & cds & CDF_LONG) << 1); | ||
1502 | if (cp->tok >= CTOK_FIRSTSCL && !(scl & cbit)) | ||
1503 | cp_errmsg(cp, cp->tok, LJ_ERR_FFI_BADSCL); | ||
1504 | cp_next(cp); | ||
1505 | break; | ||
1506 | } | ||
1507 | goto end_decl; | ||
1508 | } | 1514 | } |
1515 | break; | ||
1509 | } | 1516 | } |
1510 | end_decl: | 1517 | end_decl: |
1511 | 1518 | ||