summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordaurnimator <quae@daurnimator.com>2017-04-27 01:59:10 +1000
committerdaurnimator <quae@daurnimator.com>2017-04-27 02:32:21 +1000
commitb41aad71a6b0d742cb83c16bcf53c0383de8d77e (patch)
tree97ef0cee8a4b3597107236851e4527dd9a23de2d
parent0ad47e19d91dbfc04f890cdbbd09f7cf9f3e9d5f (diff)
downloadfengari-b41aad71a6b0d742cb83c16bcf53c0383de8d77e.tar.gz
fengari-b41aad71a6b0d742cb83c16bcf53c0383de8d77e.tar.bz2
fengari-b41aad71a6b0d742cb83c16bcf53c0383de8d77e.zip
src/llex.js: getc should return -1 if no more input
If the buffer was exhausted, the previous implementation could return undefined
-rw-r--r--src/llex.js32
1 files changed, 18 insertions, 14 deletions
diff --git a/src/llex.js b/src/llex.js
index 703db49..ee7f993 100644
--- a/src/llex.js
+++ b/src/llex.js
@@ -90,26 +90,30 @@ class MBuffer {
}
getc() {
- if (this.buffer instanceof DataView)
- return this.n-- > 0 ? this.buffer.getUint8(this.off++, true) : this.fill();
-
- return this.n-- > 0 ? this.buffer[this.off++] : this.fill();
+ if (this.n <= 0)
+ this.fill();
+ if (this.n <= 0)
+ return -1;
+ let r;
+ if (this.buffer instanceof DataView) {
+ r = this.buffer.getUint8(this.off++, true);
+ } else {
+ r = this.buffer[this.off++];
+ }
+ if (this.n-- === 0) // remove reference to input so it can get freed
+ this.buffer = null;
+ return r;
}
fill() {
if (this.reader) {
this.buffer = this.reader(this.L, this.data);
assert(typeof this.buffer !== "string", "Should only load binary of array of bytes");
- if (this.buffer === null)
- return -1;
- this.n = this.buffer instanceof DataView ? this.buffer.byteLength - 1 : this.buffer.length - 1;
- this.off = 0;
- } else return -1;
-
- if (this.buffer instanceof DataView)
- return this.buffer.getUint8(this.off++, true);
-
- return this.buffer[this.off++];
+ if (this.buffer !== null) {
+ this.n = ((this.buffer instanceof DataView) ? this.buffer.byteLength : this.buffer.length);
+ this.off = 0;
+ }
+ }
}
}