diff --git a/lib/srfi/38.scm b/lib/srfi/38.scm index 14399cf2..63afc91c 100644 --- a/lib/srfi/38.scm +++ b/lib/srfi/38.scm @@ -275,6 +275,8 @@ (thunk (lambda () (car cell)))) (set! shared (cons (cons n thunk) shared)) (let ((x (read-one in))) + (if (hole? x) + (read-error "read error: self label reference" n)) (set-car! cell x) x))) ((eqv? #\# (peek-char in)) diff --git a/sexp.c b/sexp.c index c1cb2197..0017ad9d 100644 --- a/sexp.c +++ b/sexp.c @@ -2871,10 +2871,8 @@ sexp sexp_read_raw (sexp ctx, sexp in, sexp *shares) { if (tmp > sexp_fx_add(sexp_vector_data(*shares)[sexp_vector_length(*shares)-1], sexp_make_fixnum(16))) { - fprintf(stderr, "%d - 16 > %ld\n", c2, sexp_unbox_fixnum(sexp_vector_data(*shares)[sexp_vector_length(*shares)-1])); res = sexp_read_error(ctx, "reader label out of order", tmp, in); - } - else { + } else { if (c2 + 1 >= sexp_vector_length(*shares)) { tmp2 = sexp_make_vector(ctx, sexp_make_fixnum(sexp_vector_length(*shares)*2), SEXP_VOID); memcpy(sexp_vector_data(tmp2), sexp_vector_data(*shares), (sexp_vector_length(*shares)-1)*sizeof(sexp)); @@ -2884,7 +2882,10 @@ sexp sexp_read_raw (sexp ctx, sexp in, sexp *shares) { if (tmp > sexp_vector_data(*shares)[sexp_vector_length(*shares)-1]) sexp_vector_data(*shares)[sexp_vector_length(*shares)-1] = tmp; res = sexp_read_raw(ctx, in, shares); - sexp_vector_data(*shares)[c2] = res; + if (sexp_reader_labelp(res)) + res = sexp_read_error(ctx, "self reader label reference", tmp, in); + else + sexp_vector_data(*shares)[c2] = res; } } else { res = sexp_read_error(ctx, "expected # or = after #", sexp_make_character(c1), in);