diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib_string.c | 22 |
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 | ||
123 | LJLIB_CF(string_dump) | 123 | LJLIB_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); |