diff options
author | Mike Pall <mike> | 2013-02-27 21:17:27 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2013-02-27 21:28:28 +0100 |
commit | 116cdd7e9a578efffa5a9ca38167d059d12296d7 (patch) | |
tree | cc78e44c4b7a2175f2b16bc5f8898597a72bb228 /src/lj_parse.c | |
parent | 28cfcf77445e144335961a020e3e08d84cf0091f (diff) | |
download | luajit-116cdd7e9a578efffa5a9ca38167d059d12296d7.tar.gz luajit-116cdd7e9a578efffa5a9ca38167d059d12296d7.tar.bz2 luajit-116cdd7e9a578efffa5a9ca38167d059d12296d7.zip |
String buffer refactoring, part 2.
Switch to pointers for start/pos/end of buffer.
Abstract out some buffer writers.
Diffstat (limited to 'src/lj_parse.c')
-rw-r--r-- | src/lj_parse.c | 54 |
1 files changed, 16 insertions, 38 deletions
diff --git a/src/lj_parse.c b/src/lj_parse.c index 3f992bec..64652ed2 100644 --- a/src/lj_parse.c +++ b/src/lj_parse.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include "lj_gc.h" | 13 | #include "lj_gc.h" |
14 | #include "lj_err.h" | 14 | #include "lj_err.h" |
15 | #include "lj_debug.h" | 15 | #include "lj_debug.h" |
16 | #include "lj_buf.h" | ||
16 | #include "lj_str.h" | 17 | #include "lj_str.h" |
17 | #include "lj_tab.h" | 18 | #include "lj_tab.h" |
18 | #include "lj_func.h" | 19 | #include "lj_func.h" |
@@ -1429,31 +1430,6 @@ static void fs_fixup_line(FuncState *fs, GCproto *pt, | |||
1429 | } | 1430 | } |
1430 | } | 1431 | } |
1431 | 1432 | ||
1432 | static LJ_AINLINE void fs_buf_need(LexState *ls, MSize len) | ||
1433 | { | ||
1434 | lj_buf_need(ls->L, &ls->sb, ls->sb.n + len); | ||
1435 | } | ||
1436 | |||
1437 | /* Add string to buffer. */ | ||
1438 | static void fs_buf_str(LexState *ls, const char *str, MSize len) | ||
1439 | { | ||
1440 | char *p = ls->sb.buf + ls->sb.n; | ||
1441 | MSize i; | ||
1442 | ls->sb.n += len; | ||
1443 | for (i = 0; i < len; i++) p[i] = str[i]; | ||
1444 | } | ||
1445 | |||
1446 | /* Add ULEB128 value to buffer. */ | ||
1447 | static void fs_buf_uleb128(LexState *ls, uint32_t v) | ||
1448 | { | ||
1449 | MSize n = ls->sb.n; | ||
1450 | uint8_t *p = (uint8_t *)ls->sb.buf; | ||
1451 | for (; v >= 0x80; v >>= 7) | ||
1452 | p[n++] = (uint8_t)((v & 0x7f) | 0x80); | ||
1453 | p[n++] = (uint8_t)v; | ||
1454 | ls->sb.n = n; | ||
1455 | } | ||
1456 | |||
1457 | /* Prepare variable info for prototype. */ | 1433 | /* Prepare variable info for prototype. */ |
1458 | static size_t fs_prep_var(LexState *ls, FuncState *fs, size_t *ofsvar) | 1434 | static size_t fs_prep_var(LexState *ls, FuncState *fs, size_t *ofsvar) |
1459 | { | 1435 | { |
@@ -1465,33 +1441,35 @@ static size_t fs_prep_var(LexState *ls, FuncState *fs, size_t *ofsvar) | |||
1465 | for (i = 0, n = fs->nuv; i < n; i++) { | 1441 | for (i = 0, n = fs->nuv; i < n; i++) { |
1466 | GCstr *s = strref(vs[fs->uvmap[i]].name); | 1442 | GCstr *s = strref(vs[fs->uvmap[i]].name); |
1467 | MSize len = s->len+1; | 1443 | MSize len = s->len+1; |
1468 | fs_buf_need(ls, len); | 1444 | char *p = lj_buf_more(ls->L, &ls->sb, len); |
1469 | fs_buf_str(ls, strdata(s), len); | 1445 | p = lj_buf_wmem(p, strdata(s), len); |
1446 | setsbufP(&ls->sb, p); | ||
1470 | } | 1447 | } |
1471 | *ofsvar = ls->sb.n; | 1448 | *ofsvar = sbuflen(&ls->sb); |
1472 | lastpc = 0; | 1449 | lastpc = 0; |
1473 | /* Store local variable names and compressed ranges. */ | 1450 | /* Store local variable names and compressed ranges. */ |
1474 | for (ve = vs + ls->vtop, vs += fs->vbase; vs < ve; vs++) { | 1451 | for (ve = vs + ls->vtop, vs += fs->vbase; vs < ve; vs++) { |
1475 | if (!gola_isgotolabel(vs)) { | 1452 | if (!gola_isgotolabel(vs)) { |
1476 | GCstr *s = strref(vs->name); | 1453 | GCstr *s = strref(vs->name); |
1477 | BCPos startpc; | 1454 | BCPos startpc; |
1455 | char *p; | ||
1478 | if ((uintptr_t)s < VARNAME__MAX) { | 1456 | if ((uintptr_t)s < VARNAME__MAX) { |
1479 | fs_buf_need(ls, 1 + 2*5); | 1457 | p = lj_buf_more(ls->L, &ls->sb, 1 + 2*5); |
1480 | ls->sb.buf[ls->sb.n++] = (uint8_t)(uintptr_t)s; | 1458 | *p++ = (char)(uintptr_t)s; |
1481 | } else { | 1459 | } else { |
1482 | MSize len = s->len+1; | 1460 | MSize len = s->len+1; |
1483 | fs_buf_need(ls, len + 2*5); | 1461 | p = lj_buf_more(ls->L, &ls->sb, len + 2*5); |
1484 | fs_buf_str(ls, strdata(s), len); | 1462 | p = lj_buf_wmem(p, strdata(s), len); |
1485 | } | 1463 | } |
1486 | startpc = vs->startpc; | 1464 | startpc = vs->startpc; |
1487 | fs_buf_uleb128(ls, startpc-lastpc); | 1465 | p = lj_buf_wuleb128(p, startpc-lastpc); |
1488 | fs_buf_uleb128(ls, vs->endpc-startpc); | 1466 | p = lj_buf_wuleb128(p, vs->endpc-startpc); |
1467 | setsbufP(&ls->sb, p); | ||
1489 | lastpc = startpc; | 1468 | lastpc = startpc; |
1490 | } | 1469 | } |
1491 | } | 1470 | } |
1492 | fs_buf_need(ls, 1); | 1471 | lj_buf_putb(ls->L, &ls->sb, '\0'); /* Terminator for varinfo. */ |
1493 | ls->sb.buf[ls->sb.n++] = '\0'; /* Terminator for varinfo. */ | 1472 | return sbuflen(&ls->sb); |
1494 | return ls->sb.n; | ||
1495 | } | 1473 | } |
1496 | 1474 | ||
1497 | /* Fixup variable info for prototype. */ | 1475 | /* Fixup variable info for prototype. */ |
@@ -1499,7 +1477,7 @@ static void fs_fixup_var(LexState *ls, GCproto *pt, uint8_t *p, size_t ofsvar) | |||
1499 | { | 1477 | { |
1500 | setmref(pt->uvinfo, p); | 1478 | setmref(pt->uvinfo, p); |
1501 | setmref(pt->varinfo, (char *)p + ofsvar); | 1479 | setmref(pt->varinfo, (char *)p + ofsvar); |
1502 | memcpy(p, ls->sb.buf, ls->sb.n); /* Copy from temp. string buffer. */ | 1480 | memcpy(p, sbufB(&ls->sb), sbuflen(&ls->sb)); /* Copy from temp. buffer. */ |
1503 | } | 1481 | } |
1504 | #else | 1482 | #else |
1505 | 1483 | ||