summaryrefslogtreecommitdiffstats
path: root/stream.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2020-04-22 06:42:32 -0700
committerKaz Kylheku <kaz@kylheku.com>2020-04-22 06:42:32 -0700
commit7fef3c0d7cdad433fbf614ad4b5c30b7f99814c8 (patch)
tree89b3d4c9b2a2349df5ff833a467f97ea994c2bb5 /stream.c
parented0bfb4b8eb40d8a4efc65e528e477a2314b34aa (diff)
downloadtxr-7fef3c0d7cdad433fbf614ad4b5c30b7f99814c8.tar.gz
txr-7fef3c0d7cdad433fbf614ad4b5c30b7f99814c8.tar.bz2
txr-7fef3c0d7cdad433fbf614ad4b5c30b7f99814c8.zip
parser: batched read operation for speed.
As a result of this change, the startup time is reduced. The command txr -e '(compile-toplevel nil)' shows a 54% speedup: around 110 milliseconds down from around 170. Programs that read large amounts of TXR Lisp data will benefit. * parser.l (YY_INPUT): Use new get_bytes function instead of get_byte to read a buffer at a time. * stream.c (get_bytes): New function. * stream.h (get_bytes): Declared.
Diffstat (limited to 'stream.c')
-rw-r--r--stream.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/stream.c b/stream.c
index 7120fd78..d264da16 100644
--- a/stream.c
+++ b/stream.c
@@ -2972,6 +2972,14 @@ val get_byte(val stream_in)
return ops->get_byte(stream);
}
+val get_bytes(val self, val stream_in, mem_t *ptr, ucnum len)
+{
+ val stream = default_arg(stream_in, std_input);
+ struct strm_ops *ops = coerce(struct strm_ops *,
+ cobj_ops(self, stream, stream_s));
+ return unum(ops->fill_buf(stream, ptr, len, 0));
+}
+
val unget_char(val ch, val stream_in)
{
val self = lit("unget-char");