quipu mercurial repository
Revisão | aa6e37f2dc8ebd2682a72d141fd995e4310c9e4a (tree) |
---|---|
Hora | 2018-08-17 03:41:21 |
Autor | Agustina Arzille <avarzille@rise...> |
Commiter | Agustina Arzille |
Several fixes to the serialization interfaces
@@ -337,7 +337,8 @@ | ||
337 | 337 | |
338 | 338 | valref ret (interp, alloc_array (interp, len)); |
339 | 339 | for (int i = 0; i < len; ++i) |
340 | - xaref(*ret, i) = xdeserialize (interp, strm); | |
340 | + if ((xaref (*ret, i) = xdeserialize (interp, strm)) == UNBOUND) | |
341 | + qp_return (UNBOUND); | |
341 | 342 | |
342 | 343 | qp_return (*ret); |
343 | 344 | } |
@@ -86,10 +86,10 @@ | ||
86 | 86 | object xdeserialize (interpreter *interp, stream *strm) |
87 | 87 | { |
88 | 88 | int tp = strm->getb (interp); |
89 | + object ret = UNBOUND; | |
90 | + | |
89 | 91 | if (tp < 0) |
90 | - interp->raise2 ("io-error", "deserialize: unexpected end of input"); | |
91 | - | |
92 | - object ret = UNBOUND; | |
92 | + qp_return (ret); | |
93 | 93 | |
94 | 94 | switch (tp) |
95 | 95 | { |
@@ -2347,7 +2347,7 @@ | ||
2347 | 2347 | raw_acc<array> fvals; |
2348 | 2348 | valref expr (interp, NIL); |
2349 | 2349 | |
2350 | - while (true) | |
2350 | + for (ctable.cmp.ip = interp ; ; ) | |
2351 | 2351 | { |
2352 | 2352 | if ((*expr = rd.read_sexpr ()) == EOS) |
2353 | 2353 | break; |
@@ -434,14 +434,14 @@ | ||
434 | 434 | int len = 0, ret = 0; |
435 | 435 | |
436 | 436 | ret += strm->write (interp, &len); |
437 | - for ( ; ; ++len) | |
437 | + while (true) | |
438 | 438 | { |
439 | 439 | if (*tmp == NIL) |
440 | 440 | break; |
441 | 441 | |
442 | 442 | valref head (interp, xcar (*tmp)); |
443 | 443 | ret += xserialize (interp, strm, *head); |
444 | - *tmp = xcdr (*tmp); | |
444 | + *tmp = xcdr (*tmp), ++len; | |
445 | 445 | |
446 | 446 | if (!xcons_p (*tmp)) |
447 | 447 | { |
@@ -451,6 +451,9 @@ | ||
451 | 451 | } |
452 | 452 | } |
453 | 453 | |
454 | + if (len == 0) | |
455 | + return (ret); | |
456 | + | |
454 | 457 | valref pos2 (interp, strm->tell (interp)); |
455 | 458 | if (!strm->seek (interp, *pos1, SEEK_SET)) |
456 | 459 | return (-1); |
@@ -470,16 +473,16 @@ | ||
470 | 473 | |
471 | 474 | bool dotted = len < 0 ? (len = -len, true) : false; |
472 | 475 | valref ret (interp, alloc_cons (interp, len)); |
473 | - cons *outp = as_cons (*ret); | |
476 | + object *outp = &*ret; | |
474 | 477 | |
475 | 478 | for (int i = 0; i < len; ++i) |
476 | 479 | { |
477 | - outp->car = xdeserialize (interp, strm); | |
478 | - outp = as_cons (outp->cdr); | |
480 | + xcar(*outp) = xdeserialize (interp, strm); | |
481 | + outp = &xcdr(*outp); | |
479 | 482 | } |
480 | 483 | |
481 | 484 | if (dotted) |
482 | - outp->cdr = xdeserialize (interp, strm); | |
485 | + *outp = xdeserialize (interp, strm); | |
483 | 486 | |
484 | 487 | qp_return (*ret); |
485 | 488 | } |
@@ -374,13 +374,13 @@ | ||
374 | 374 | { |
375 | 375 | int sign, cls; |
376 | 376 | double v = get_dbl (obj, sign, cls); |
377 | - return (strm->write (interp, &v, sizeof (v))); | |
377 | + return (strm->write (interp, &v)); | |
378 | 378 | } |
379 | 379 | |
380 | 380 | object deserialize_f (interpreter *interp, stream *strm) |
381 | 381 | { |
382 | 382 | double v; |
383 | - qp_return (strm->read (interp, &v, sizeof (v)) < (int)sizeof (v) ? | |
383 | + qp_return (strm->read (interp, &v) < (int)sizeof (v) ? | |
384 | 384 | UNBOUND : fltobj (interp, v)); |
385 | 385 | } |
386 | 386 |
@@ -1234,8 +1234,7 @@ | ||
1234 | 1234 | xl = -xl; |
1235 | 1235 | #endif |
1236 | 1236 | |
1237 | - return (strm->write (interp, &expo, sizeof (expo)) + | |
1238 | - strm->write (interp, &xl, sizeof (xl)) + | |
1237 | + return (strm->write (interp, &expo) + strm->write (interp, &xl) + | |
1239 | 1238 | strm->write (interp, lp->data, F_ABS (lp->len) * sizeof (*lp->data))); |
1240 | 1239 | } |
1241 | 1240 |
@@ -960,7 +960,7 @@ | ||
960 | 960 | int serialize_i (interpreter *interp, stream *strm, object obj) |
961 | 961 | { |
962 | 962 | int val = as_int (obj); |
963 | - return (strm->write (interp, &val, sizeof (val))); | |
963 | + return (strm->write (interp, &val)); | |
964 | 964 | } |
965 | 965 | |
966 | 966 | int serialize_I (interpreter *interp, stream *strm, object obj) |
@@ -969,7 +969,7 @@ | ||
969 | 969 | const bigint *bi = get_bigint (obj, sv); |
970 | 970 | |
971 | 971 | sv = sv < 0 ? -bi->len : bi->len; |
972 | - ret += strm->write (interp, &sv, sizeof (sv)); | |
972 | + ret += strm->write (interp, &sv); | |
973 | 973 | ret += strm->write (interp, bi->data, bi->len * sizeof (*bi->data)); |
974 | 974 | return (ret); |
975 | 975 | } |
@@ -418,6 +418,9 @@ | ||
418 | 418 | if (this->ops.seek != seek_stub && (whence == SEEK_SET || |
419 | 419 | whence == SEEK_CUR || whence == SEEK_END)) |
420 | 420 | { |
421 | + if (this->need_wflush () && !this->wflush (interp)) | |
422 | + return (ret); | |
423 | + | |
421 | 424 | ret = this->xseek (interp, spos::decode (off), whence); |
422 | 425 | if (ret) |
423 | 426 | { |
@@ -347,11 +347,8 @@ | ||
347 | 347 | object pkg = as_symbol(obj)->pkg; |
348 | 348 | |
349 | 349 | int pn = pkg_number (pkg); |
350 | - | |
351 | - if (pn != 0) | |
352 | - ret += strm->write (interp, &pn); | |
353 | - else | |
354 | - ret += xserialize (interp, strm, as_package(pkg)->name); | |
350 | + ret += xserialize (interp, strm, pn != 0 ? | |
351 | + intobj (pn) : as_package(pkg)->name); | |
355 | 352 | |
356 | 353 | return (ret); |
357 | 354 | } |
@@ -741,6 +741,8 @@ | ||
741 | 741 | if (tst < 0 || (tst != 0xff && |
742 | 742 | (*e2 = xdeserialize (interp, strm)) == UNBOUND)) |
743 | 743 | qp_return (UNBOUND); |
744 | + else if (tst == 0xff) | |
745 | + strm->getb (interp); | |
744 | 746 | |
745 | 747 | float mv_ratio; |
746 | 748 | uint32_t nelem; |
@@ -540,9 +540,6 @@ | ||
540 | 540 | strm->read (interp, &nelem) != (int)sizeof (nelem)) |
541 | 541 | qp_return (UNBOUND); |
542 | 542 | |
543 | - if (strm->read (interp, &hw) != (int)sizeof (hw)) | |
544 | - qp_return (UNBOUND); | |
545 | - | |
546 | 543 | valref ret (interp, alloc_tree (interp, *tmp)); |
547 | 544 | |
548 | 545 | for (uint32_t i = 0; i < nelem; ++i) |