]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Abstract out some common buffer operations.
authorMike Pall <mike>
Fri, 26 Apr 2013 17:20:21 +0000 (19:20 +0200)
committerMike Pall <mike>
Fri, 26 Apr 2013 17:20:21 +0000 (19:20 +0200)
src/lib_os.c
src/lib_string.c
src/lj_buf.c
src/lj_buf.h
src/lj_opt_fold.c

index 08f538bd9c19d2fa59d43671e50077b9edb1a282..9bfc418bfa41b0147dd9374eec32436c50e511c3 100644 (file)
@@ -205,7 +205,7 @@ LJLIB_CF(os_date)
     const char *q;
     for (q = s; *q; q++)
       sz += (*q == '%') ? 30 : 1;  /* Overflow doesn't matter. */
-    setmref(sb->L, L);
+    setsbufL(sb, L);
     for (;;) {
       char *buf = lj_buf_need(sb, sz);
       size_t len = strftime(buf, sbufsz(sb), s, stm);
index db2c275df6b3f56c072c01bee43f73b0c27935ff..cd67347822a2febddc7e5625ffe19e146b0dbcb8 100644 (file)
@@ -155,9 +155,7 @@ LJLIB_CF(string_dump)
 {
   GCfunc *fn = lj_lib_checkfunc(L, 1);
   int strip = L->base+1 < L->top && tvistruecond(L->base+1);
-  SBuf *sb = &G(L)->tmpbuf;  /* Assumes lj_bcwrite() doesn't use tmpbuf. */
-  setmref(sb->L, L);
-  lj_buf_reset(sb);
+  SBuf *sb = lj_buf_tmp_(L);  /* Assumes lj_bcwrite() doesn't use tmpbuf. */
   L->top = L->base+1;
   if (!isluafunc(fn) || lj_bcwrite(L, funcproto(fn), writer_buf, sb, strip))
     lj_err_caller(L, LJ_ERR_STRDUMP);
@@ -851,9 +849,7 @@ LJLIB_CF(string_format)
   GCstr *sfmt = lj_lib_checkstr(L, arg);
   const char *fmt = strdata(sfmt);
   const char *efmt = fmt + sfmt->len;
-  SBuf *sb = &G(L)->tmpbuf;
-  setmref(sb->L, L);
-  lj_buf_reset(sb);
+  SBuf *sb = lj_buf_tmp_(L);
   while (fmt < efmt) {
     if (*fmt != L_ESC || *++fmt == L_ESC) {
       lj_buf_putb(sb, *fmt++);
index 32ed52b9e54d59512641108847fcb084e46b4c10..3526a6e51804ed37c8830e50c7507f2562e72a67 100644 (file)
@@ -149,6 +149,15 @@ GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb)
   return lj_str_new(sbufL(sb), sbufB(sb), sbuflen(sb));
 }
 
+GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2)
+{
+  MSize len1 = s1->len, len2 = s2->len;
+  char *buf = lj_buf_tmp(L, len1 + len2);
+  memcpy(buf, strdata(s1), len1);
+  memcpy(buf+len1, strdata(s2), len2);
+  return lj_str_new(L, buf, len1 + len2);
+}
+
 uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp)
 {
   const uint8_t *p = (const uint8_t *)*pp;
index 98bcad20726ba77b59c07151ae64eaca8645ffce..92a6055a2d571177e071655b2ddb30804ea94b79 100644 (file)
@@ -36,6 +36,7 @@ LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_reverse(SBuf *sb, GCstr *s);
 LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_lower(SBuf *sb, GCstr *s);
 LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_upper(SBuf *sb, GCstr *s);
 LJ_FUNCA GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb);
+LJ_FUNC GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2);
 LJ_FUNC uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp);
 LJ_FUNC char * LJ_FASTCALL lj_buf_wuleb128(char *p, uint32_t v);
 
@@ -50,6 +51,14 @@ static LJ_AINLINE void lj_buf_reset(SBuf *sb)
   setmrefr(sb->p, sb->b);
 }
 
+static LJ_AINLINE SBuf *lj_buf_tmp_(lua_State *L)
+{
+  SBuf *sb = &G(L)->tmpbuf;
+  setsbufL(sb, L);
+  lj_buf_reset(sb);
+  return sb;
+}
+
 static LJ_AINLINE void lj_buf_free(global_State *g, SBuf *sb)
 {
   lj_mem_free(g, sbufB(sb), sbufsz(sb));
index e9f873b77e5d35c60a0431219bb8f6f18f0ef316..fc625b848e9887c7cdcb8fdb11a9a079e07fb001 100644 (file)
@@ -559,20 +559,13 @@ LJFOLDF(bufput_kgc)
 {
   if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fright->o == IR_KGC) {
     GCstr *s2 = ir_kstr(fright);
-    MSize len2 = s2->len;
-    if (len2 == 0) {  /* Empty string? */
+    if (s2->len == 0) {  /* Empty string? */
       return LEFTFOLD;
     } else {
       if (fleft->o == IR_BUFPUT && irref_isk(fleft->op2) &&
-         !irt_isphi(fleft->t)) {
-       /* Join two constant string puts in a row. */
+         !irt_isphi(fleft->t)) {  /* Join two constant string puts in a row. */
        GCstr *s1 = ir_kstr(IR(fleft->op2));
-       MSize len1 = s1->len;
-       char *buf = lj_buf_tmp(J->L, len1 + len2);
-       IRRef kref;
-       memcpy(buf, strdata(s1), len1);
-       memcpy(buf+len1, strdata(s2), len2);
-       kref = lj_ir_kstr(J, lj_str_new(J->L, buf, len1 + len2));
+       IRRef kref = lj_ir_kstr(J, lj_buf_cat2str(J->L, s1, s2));
        /* lj_ir_kstr() may realloc the IR and invalidates any IRIns *. */
        IR(fins->op1)->op2 = kref;  /* Modify previous BUFPUT. */
        return fins->op1;