aboutsummaryrefslogtreecommitdiff
path: root/src/lib_buffer.c
diff options
context:
space:
mode:
authorMike Pall <mike>2021-07-19 16:53:30 +0200
committerMike Pall <mike>2021-07-19 16:53:30 +0200
commit29bc1f04ace7e466437ebb08ac73c86b8a11cfda (patch)
tree3202613210b07790f19cc148c6249d5dc32de164 /src/lib_buffer.c
parent21826309035979e17973c5ee2761f430adc6b7a6 (diff)
downloadluajit-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.c52
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
64LJLIB_CF(buffer_method_reset) 64LJLIB_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
72LJLIB_CF(buffer_method_skip) 72LJLIB_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
86LJLIB_CF(buffer_method_set) 86LJLIB_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
114LJLIB_CF(buffer_method_put) 114LJLIB_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
150LJLIB_CF(buffer_method_putf) 150LJLIB_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
159LJLIB_CF(buffer_method_get) 159LJLIB_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
182LJLIB_CF(buffer_method_putcdata) 182LJLIB_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
200LJLIB_CF(buffer_method_reserve) 200LJLIB_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
214LJLIB_CF(buffer_method_commit) 214LJLIB_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
224LJLIB_CF(buffer_method_ref) 224LJLIB_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
237LJLIB_CF(buffer_method_encode) 237LJLIB_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
247LJLIB_CF(buffer_method_decode) 247LJLIB_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
263LJLIB_CF(buffer_method___tostring) 263LJLIB_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
271LJLIB_CF(buffer_method___len) 271LJLIB_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
320LJLIB_CF(buffer_encode) 320LJLIB_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
332LJLIB_CF(buffer_decode) 328LJLIB_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