aboutsummaryrefslogtreecommitdiff
path: root/src/lib_string.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib_string.c')
-rw-r--r--src/lib_string.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/lib_string.c b/src/lib_string.c
index 29bcb8fe..255689ce 100644
--- a/src/lib_string.c
+++ b/src/lib_string.c
@@ -122,11 +122,25 @@ static int writer_buf(lua_State *L, const void *p, size_t size, void *sb)
122 122
123LJLIB_CF(string_dump) 123LJLIB_CF(string_dump)
124{ 124{
125 GCfunc *fn = lj_lib_checkfunc(L, 1); 125 GCproto *pt = lj_lib_checkLproto(L, 1, 1);
126 int strip = L->base+1 < L->top && tvistruecond(L->base+1); 126 uint32_t flags = 0;
127 SBuf *sb = lj_buf_tmp_(L); /* Assumes lj_bcwrite() doesn't use tmpbuf. */ 127 SBuf *sb;
128 TValue *o = L->base+1;
129 if (o < L->top) {
130 if (tvisstr(o)) {
131 const char *mode = strVdata(o);
132 char c;
133 while ((c = *mode++)) {
134 if (c == 's') flags |= BCDUMP_F_STRIP;
135 if (c == 'd') flags |= BCDUMP_F_DETERMINISTIC;
136 }
137 } else if (tvistruecond(o)) {
138 flags |= BCDUMP_F_STRIP;
139 }
140 }
141 sb = lj_buf_tmp_(L); /* Assumes lj_bcwrite() doesn't use tmpbuf. */
128 L->top = L->base+1; 142 L->top = L->base+1;
129 if (!isluafunc(fn) || lj_bcwrite(L, funcproto(fn), writer_buf, sb, strip)) 143 if (!pt || lj_bcwrite(L, pt, writer_buf, sb, flags))
130 lj_err_caller(L, LJ_ERR_STRDUMP); 144 lj_err_caller(L, LJ_ERR_STRDUMP);
131 setstrV(L, L->top-1, lj_buf_str(L, sb)); 145 setstrV(L, L->top-1, lj_buf_str(L, sb));
132 lj_gc_check(L); 146 lj_gc_check(L);