diff options
Diffstat (limited to 'src/lib_buffer.c')
-rw-r--r-- | src/lib_buffer.c | 52 |
1 files changed, 21 insertions, 31 deletions
diff --git a/src/lib_buffer.c b/src/lib_buffer.c index cb7531a2..ae065759 100644 --- a/src/lib_buffer.c +++ b/src/lib_buffer.c | |||
@@ -61,7 +61,7 @@ LJLIB_CF(buffer_method_free) | |||
61 | return 1; | 61 | return 1; |
62 | } | 62 | } |
63 | 63 | ||
64 | LJLIB_CF(buffer_method_reset) | 64 | LJLIB_CF(buffer_method_reset) LJLIB_REC(.) |
65 | { | 65 | { |
66 | SBufExt *sbx = buffer_tobuf(L); | 66 | SBufExt *sbx = buffer_tobuf(L); |
67 | lj_bufx_reset(sbx); | 67 | lj_bufx_reset(sbx); |
@@ -69,7 +69,7 @@ LJLIB_CF(buffer_method_reset) | |||
69 | return 1; | 69 | return 1; |
70 | } | 70 | } |
71 | 71 | ||
72 | LJLIB_CF(buffer_method_skip) | 72 | LJLIB_CF(buffer_method_skip) LJLIB_REC(.) |
73 | { | 73 | { |
74 | SBufExt *sbx = buffer_tobuf(L); | 74 | SBufExt *sbx = buffer_tobuf(L); |
75 | MSize n = (MSize)lj_lib_checkintrange(L, 2, 0, LJ_MAX_BUF); | 75 | MSize n = (MSize)lj_lib_checkintrange(L, 2, 0, LJ_MAX_BUF); |
@@ -83,7 +83,7 @@ LJLIB_CF(buffer_method_skip) | |||
83 | return 1; | 83 | return 1; |
84 | } | 84 | } |
85 | 85 | ||
86 | LJLIB_CF(buffer_method_set) | 86 | LJLIB_CF(buffer_method_set) LJLIB_REC(.) |
87 | { | 87 | { |
88 | SBufExt *sbx = buffer_tobuf(L); | 88 | SBufExt *sbx = buffer_tobuf(L); |
89 | GCobj *ref; | 89 | GCobj *ref; |
@@ -111,7 +111,7 @@ LJLIB_CF(buffer_method_set) | |||
111 | return 1; | 111 | return 1; |
112 | } | 112 | } |
113 | 113 | ||
114 | LJLIB_CF(buffer_method_put) | 114 | LJLIB_CF(buffer_method_put) LJLIB_REC(.) |
115 | { | 115 | { |
116 | SBufExt *sbx = buffer_tobufw(L); | 116 | SBufExt *sbx = buffer_tobufw(L); |
117 | ptrdiff_t arg, narg = L->top - L->base; | 117 | ptrdiff_t arg, narg = L->top - L->base; |
@@ -147,7 +147,7 @@ LJLIB_CF(buffer_method_put) | |||
147 | return 1; | 147 | return 1; |
148 | } | 148 | } |
149 | 149 | ||
150 | LJLIB_CF(buffer_method_putf) | 150 | LJLIB_CF(buffer_method_putf) LJLIB_REC(.) |
151 | { | 151 | { |
152 | SBufExt *sbx = buffer_tobufw(L); | 152 | SBufExt *sbx = buffer_tobufw(L); |
153 | lj_strfmt_putarg(L, (SBuf *)sbx, 2, 2); | 153 | lj_strfmt_putarg(L, (SBuf *)sbx, 2, 2); |
@@ -156,7 +156,7 @@ LJLIB_CF(buffer_method_putf) | |||
156 | return 1; | 156 | return 1; |
157 | } | 157 | } |
158 | 158 | ||
159 | LJLIB_CF(buffer_method_get) | 159 | LJLIB_CF(buffer_method_get) LJLIB_REC(.) |
160 | { | 160 | { |
161 | SBufExt *sbx = buffer_tobuf(L); | 161 | SBufExt *sbx = buffer_tobuf(L); |
162 | ptrdiff_t arg, narg = L->top - L->base; | 162 | ptrdiff_t arg, narg = L->top - L->base; |
@@ -179,7 +179,7 @@ LJLIB_CF(buffer_method_get) | |||
179 | } | 179 | } |
180 | 180 | ||
181 | #if LJ_HASFFI | 181 | #if LJ_HASFFI |
182 | LJLIB_CF(buffer_method_putcdata) | 182 | LJLIB_CF(buffer_method_putcdata) LJLIB_REC(.) |
183 | { | 183 | { |
184 | SBufExt *sbx = buffer_tobufw(L); | 184 | SBufExt *sbx = buffer_tobufw(L); |
185 | const char *p; | 185 | const char *p; |
@@ -197,12 +197,12 @@ LJLIB_CF(buffer_method_putcdata) | |||
197 | return 1; | 197 | return 1; |
198 | } | 198 | } |
199 | 199 | ||
200 | LJLIB_CF(buffer_method_reserve) | 200 | LJLIB_CF(buffer_method_reserve) LJLIB_REC(.) |
201 | { | 201 | { |
202 | SBufExt *sbx = buffer_tobufw(L); | 202 | SBufExt *sbx = buffer_tobufw(L); |
203 | MSize len = (MSize)lj_lib_checkintrange(L, 2, 0, LJ_MAX_BUF); | 203 | MSize sz = (MSize)lj_lib_checkintrange(L, 2, 0, LJ_MAX_BUF); |
204 | GCcdata *cd; | 204 | GCcdata *cd; |
205 | lj_buf_more((SBuf *)sbx, len); | 205 | lj_buf_more((SBuf *)sbx, sz); |
206 | ctype_loadffi(L); | 206 | ctype_loadffi(L); |
207 | cd = lj_cdata_new_(L, CTID_P_UINT8, CTSIZE_PTR); | 207 | cd = lj_cdata_new_(L, CTID_P_UINT8, CTSIZE_PTR); |
208 | *(void **)cdataptr(cd) = sbx->w; | 208 | *(void **)cdataptr(cd) = sbx->w; |
@@ -211,7 +211,7 @@ LJLIB_CF(buffer_method_reserve) | |||
211 | return 2; | 211 | return 2; |
212 | } | 212 | } |
213 | 213 | ||
214 | LJLIB_CF(buffer_method_commit) | 214 | LJLIB_CF(buffer_method_commit) LJLIB_REC(.) |
215 | { | 215 | { |
216 | SBufExt *sbx = buffer_tobuf(L); | 216 | SBufExt *sbx = buffer_tobuf(L); |
217 | MSize len = (MSize)lj_lib_checkintrange(L, 2, 0, LJ_MAX_BUF); | 217 | MSize len = (MSize)lj_lib_checkintrange(L, 2, 0, LJ_MAX_BUF); |
@@ -221,7 +221,7 @@ LJLIB_CF(buffer_method_commit) | |||
221 | return 1; | 221 | return 1; |
222 | } | 222 | } |
223 | 223 | ||
224 | LJLIB_CF(buffer_method_ref) | 224 | LJLIB_CF(buffer_method_ref) LJLIB_REC(.) |
225 | { | 225 | { |
226 | SBufExt *sbx = buffer_tobuf(L); | 226 | SBufExt *sbx = buffer_tobuf(L); |
227 | GCcdata *cd; | 227 | GCcdata *cd; |
@@ -234,7 +234,7 @@ LJLIB_CF(buffer_method_ref) | |||
234 | } | 234 | } |
235 | #endif | 235 | #endif |
236 | 236 | ||
237 | LJLIB_CF(buffer_method_encode) | 237 | LJLIB_CF(buffer_method_encode) LJLIB_REC(.) |
238 | { | 238 | { |
239 | SBufExt *sbx = buffer_tobufw(L); | 239 | SBufExt *sbx = buffer_tobufw(L); |
240 | cTValue *o = lj_lib_checkany(L, 2); | 240 | cTValue *o = lj_lib_checkany(L, 2); |
@@ -244,11 +244,11 @@ LJLIB_CF(buffer_method_encode) | |||
244 | return 1; | 244 | return 1; |
245 | } | 245 | } |
246 | 246 | ||
247 | LJLIB_CF(buffer_method_decode) | 247 | LJLIB_CF(buffer_method_decode) LJLIB_REC(.) |
248 | { | 248 | { |
249 | SBufExt *sbx = buffer_tobufw(L); | 249 | SBufExt *sbx = buffer_tobufw(L); |
250 | setnilV(L->top++); | 250 | setnilV(L->top++); |
251 | lj_serialize_get(sbx, L->top-1); | 251 | sbx->r = lj_serialize_get(sbx, L->top-1); |
252 | lj_gc_check(L); | 252 | lj_gc_check(L); |
253 | return 1; | 253 | return 1; |
254 | } | 254 | } |
@@ -260,7 +260,7 @@ LJLIB_CF(buffer_method___gc) | |||
260 | return 0; | 260 | return 0; |
261 | } | 261 | } |
262 | 262 | ||
263 | LJLIB_CF(buffer_method___tostring) | 263 | LJLIB_CF(buffer_method___tostring) LJLIB_REC(.) |
264 | { | 264 | { |
265 | SBufExt *sbx = buffer_tobuf(L); | 265 | SBufExt *sbx = buffer_tobuf(L); |
266 | setstrV(L, L->top-1, lj_str_new(L, sbx->r, sbufxlen(sbx))); | 266 | setstrV(L, L->top-1, lj_str_new(L, sbx->r, sbufxlen(sbx))); |
@@ -268,7 +268,7 @@ LJLIB_CF(buffer_method___tostring) | |||
268 | return 1; | 268 | return 1; |
269 | } | 269 | } |
270 | 270 | ||
271 | LJLIB_CF(buffer_method___len) | 271 | LJLIB_CF(buffer_method___len) LJLIB_REC(.) |
272 | { | 272 | { |
273 | SBufExt *sbx = buffer_tobuf(L); | 273 | SBufExt *sbx = buffer_tobuf(L); |
274 | setintV(L->top-1, (int32_t)sbufxlen(sbx)); | 274 | setintV(L->top-1, (int32_t)sbufxlen(sbx)); |
@@ -317,29 +317,19 @@ LJLIB_CF(buffer_new) | |||
317 | return 1; | 317 | return 1; |
318 | } | 318 | } |
319 | 319 | ||
320 | LJLIB_CF(buffer_encode) | 320 | LJLIB_CF(buffer_encode) LJLIB_REC(.) |
321 | { | 321 | { |
322 | cTValue *o = lj_lib_checkany(L, 1); | 322 | cTValue *o = lj_lib_checkany(L, 1); |
323 | SBufExt sbx; | 323 | setstrV(L, L->top++, lj_serialize_encode(L, o)); |
324 | memset(&sbx, 0, sizeof(SBufExt)); | ||
325 | lj_bufx_set_borrow(L, &sbx, &G(L)->tmpbuf); | ||
326 | lj_serialize_put(&sbx, o); | ||
327 | setstrV(L, L->top++, lj_buf_str(L, (SBuf *)&sbx)); | ||
328 | lj_gc_check(L); | 324 | lj_gc_check(L); |
329 | return 1; | 325 | return 1; |
330 | } | 326 | } |
331 | 327 | ||
332 | LJLIB_CF(buffer_decode) | 328 | LJLIB_CF(buffer_decode) LJLIB_REC(.) |
333 | { | 329 | { |
334 | GCstr *str = lj_lib_checkstrx(L, 1); | 330 | GCstr *str = lj_lib_checkstrx(L, 1); |
335 | SBufExt sbx; | ||
336 | memset(&sbx, 0, sizeof(SBufExt)); | ||
337 | lj_bufx_set_cow(L, &sbx, strdata(str), str->len); | ||
338 | /* No need to set sbx.cowref here. */ | ||
339 | setnilV(L->top++); | 331 | setnilV(L->top++); |
340 | lj_serialize_get(&sbx, L->top-1); | 332 | lj_serialize_decode(L, L->top-1, str); |
341 | lj_gc_check(L); | ||
342 | if (sbx.r != sbx.w) lj_err_caller(L, LJ_ERR_BUFFER_LEFTOV); | ||
343 | return 1; | 333 | return 1; |
344 | } | 334 | } |
345 | 335 | ||