Faster parsing of numbers

This commit is contained in:
Justin Ethier 2017-08-21 10:39:03 +00:00
parent c7b395506b
commit d471813a37
2 changed files with 12 additions and 8 deletions

View file

@ -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));

View file

@ -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)))