aboutsummaryrefslogtreecommitdiff
path: root/src/lj_parse.c
diff options
context:
space:
mode:
authorMike Pall <mike>2013-02-27 21:17:27 +0100
committerMike Pall <mike>2013-02-27 21:28:28 +0100
commit116cdd7e9a578efffa5a9ca38167d059d12296d7 (patch)
treecc78e44c4b7a2175f2b16bc5f8898597a72bb228 /src/lj_parse.c
parent28cfcf77445e144335961a020e3e08d84cf0091f (diff)
downloadluajit-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.c54
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
1432static 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. */
1438static 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. */
1447static 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. */
1458static size_t fs_prep_var(LexState *ls, FuncState *fs, size_t *ofsvar) 1434static 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