diff options
| author | Mike Pall <mike> | 2021-08-12 21:10:13 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2021-08-12 21:27:58 +0200 |
| commit | 15ed84bd499b3ecdba9f431f2d24696a313227e4 (patch) | |
| tree | 637662b1edce646fec939e8bf75685a09e374656 /src/lib_buffer.c | |
| parent | 983d66b8c5032b421e0f5fe8d39e9930bceb7031 (diff) | |
| download | luajit-15ed84bd499b3ecdba9f431f2d24696a313227e4.tar.gz luajit-15ed84bd499b3ecdba9f431f2d24696a313227e4.tar.bz2 luajit-15ed84bd499b3ecdba9f431f2d24696a313227e4.zip | |
String buffers, part 4a: Add metatable serialization dictionary.
Sponsored by fmad.io.
Diffstat (limited to 'src/lib_buffer.c')
| -rw-r--r-- | src/lib_buffer.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/lib_buffer.c b/src/lib_buffer.c index ae065759..2e364861 100644 --- a/src/lib_buffer.c +++ b/src/lib_buffer.c | |||
| @@ -288,7 +288,7 @@ LJLIB_CF(buffer_new) | |||
| 288 | { | 288 | { |
| 289 | MSize sz = 0; | 289 | MSize sz = 0; |
| 290 | int targ = 1; | 290 | int targ = 1; |
| 291 | GCtab *env, *dict = NULL; | 291 | GCtab *env, *dict_str = NULL, *dict_mt = NULL; |
| 292 | GCudata *ud; | 292 | GCudata *ud; |
| 293 | SBufExt *sbx; | 293 | SBufExt *sbx; |
| 294 | if (L->base < L->top && !tvistab(L->base)) { | 294 | if (L->base < L->top && !tvistab(L->base)) { |
| @@ -298,10 +298,16 @@ LJLIB_CF(buffer_new) | |||
| 298 | } | 298 | } |
| 299 | if (L->base+targ-1 < L->top) { | 299 | if (L->base+targ-1 < L->top) { |
| 300 | GCtab *options = lj_lib_checktab(L, targ); | 300 | GCtab *options = lj_lib_checktab(L, targ); |
| 301 | cTValue *opt_dict = lj_tab_getstr(options, lj_str_newlit(L, "dict")); | 301 | cTValue *opt_dict, *opt_mt; |
| 302 | opt_dict = lj_tab_getstr(options, lj_str_newlit(L, "dict")); | ||
| 302 | if (opt_dict && tvistab(opt_dict)) { | 303 | if (opt_dict && tvistab(opt_dict)) { |
| 303 | dict = tabV(opt_dict); | 304 | dict_str = tabV(opt_dict); |
| 304 | lj_serialize_dict_prep(L, dict); | 305 | lj_serialize_dict_prep_str(L, dict_str); |
| 306 | } | ||
| 307 | opt_mt = lj_tab_getstr(options, lj_str_newlit(L, "metatable")); | ||
| 308 | if (opt_mt && tvistab(opt_mt)) { | ||
| 309 | dict_mt = tabV(opt_mt); | ||
| 310 | lj_serialize_dict_prep_mt(L, dict_mt); | ||
| 305 | } | 311 | } |
| 306 | } | 312 | } |
| 307 | env = tabref(curr_func(L)->c.env); | 313 | env = tabref(curr_func(L)->c.env); |
| @@ -312,7 +318,8 @@ LJLIB_CF(buffer_new) | |||
| 312 | setudataV(L, L->top++, ud); | 318 | setudataV(L, L->top++, ud); |
| 313 | sbx = (SBufExt *)uddata(ud); | 319 | sbx = (SBufExt *)uddata(ud); |
| 314 | lj_bufx_init(L, sbx); | 320 | lj_bufx_init(L, sbx); |
| 315 | setgcref(sbx->dict, obj2gco(dict)); | 321 | setgcref(sbx->dict_str, obj2gco(dict_str)); |
| 322 | setgcref(sbx->dict_mt, obj2gco(dict_mt)); | ||
| 316 | if (sz > 0) lj_buf_need2((SBuf *)sbx, sz); | 323 | if (sz > 0) lj_buf_need2((SBuf *)sbx, sz); |
| 317 | return 1; | 324 | return 1; |
| 318 | } | 325 | } |
