diff options
| author | Mike Pall <mike> | 2021-07-19 16:53:30 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2021-07-19 16:53:30 +0200 |
| commit | 29bc1f04ace7e466437ebb08ac73c86b8a11cfda (patch) | |
| tree | 3202613210b07790f19cc148c6249d5dc32de164 /src/lib_buffer.c | |
| parent | 21826309035979e17973c5ee2761f430adc6b7a6 (diff) | |
| download | luajit-29bc1f04ace7e466437ebb08ac73c86b8a11cfda.tar.gz luajit-29bc1f04ace7e466437ebb08ac73c86b8a11cfda.tar.bz2 luajit-29bc1f04ace7e466437ebb08ac73c86b8a11cfda.zip | |
String buffers, part 3d: Compile string buffer methods and functions.
Sponsored by fmad.io.
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 cb7531a29..ae065759f 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 | ||
