diff --git a/runtime.c b/runtime.c index cd25bd04..944324c7 100644 --- a/runtime.c +++ b/runtime.c @@ -6137,13 +6137,9 @@ void _read_return_atom(void *data, object cont, port_type *p) p->tok_end = 0; // Reset for next atom if (_read_is_numeric(p->tok_buf)) { - make_empty_vector(vec); make_string(str, p->tok_buf); - vec.num_elements = 2; - vec.elements = (object *) alloca(sizeof(object) * vec.num_elements); - vec.elements[0] = &str; - vec.elements[1] = obj_int2obj(10); - return_thread_runnable(data, &vec); + make_c_opaque(opq, &str); + return_thread_runnable(data, &opq); } else if (strncmp("+inf.0", p->tok_buf, 6) == 0 || strncmp("-inf.0", p->tok_buf, 6) == 0) { make_double(d, pow(2.0, 1000000)); diff --git a/scheme/read.sld b/scheme/read.sld index 941264ec..903bc470 100644 --- a/scheme/read.sld +++ b/scheme/read.sld @@ -103,12 +103,22 @@ "(void *data, int argc, closure _, object k, object opq, object obj)" " return_closcall1(data, k, equalp( opaque_ptr(opq), obj ));") +(define-c Cyc-opaque-unsafe-string? + "(void *data, int argc, closure _, object k, object opq)" + " return_closcall1(data, k, Cyc_is_string(opaque_ptr(opq)));") + +(define-c Cyc-opaque-unsafe-string->number + "(void *data, int argc, closure _, object k, object opq)" + " Cyc_string2number_(data, k, opaque_ptr(opq));") + (define (parse fp) (let ((token (read-token fp))) ;(write `(token ,token)) (cond ((Cyc-opaque? token) (cond + ((Cyc-opaque-unsafe-string? token) + (Cyc-opaque-unsafe-string->number token)) ;; Open paren, start read loop ((Cyc-opaque-unsafe-eq? token #\() (let loop ((lis '()) @@ -133,8 +143,6 @@ token))) ;; error if this is returned to original caller of parse ((vector? token) (cond - ((= (vector-length token) 2) ;; Special case: number - (string->number (vector-ref token 0) (vector-ref token 1))) ((= (vector-length token) 3) ;; Special case: exact/inexact number (if (vector-ref token 2) (exact (string->number (vector-ref token 0) (vector-ref token 1)))