diff --git a/src/parser.js b/src/parser.js index 35954b4c3..6b096868d 100644 --- a/src/parser.js +++ b/src/parser.js @@ -360,6 +360,7 @@ var Lexer = (function LexerClosure() { do { ch = stream.getChar(); switch (ch) { + case null: case undefined: warn('Unterminated string'); done = true; @@ -378,6 +379,7 @@ var Lexer = (function LexerClosure() { case '\\': ch = stream.getChar(); switch (ch) { + case null: case undefined: warn('Unterminated string'); done = true; @@ -427,10 +429,12 @@ var Lexer = (function LexerClosure() { break; default: str += ch; + break; } break; default: str += ch; + break; } } while (!done); return str; diff --git a/test/unit/parser_spec.js b/test/unit/parser_spec.js index 4de025560..400b1940f 100644 --- a/test/unit/parser_spec.js +++ b/test/unit/parser_spec.js @@ -14,6 +14,19 @@ describe('parser', function() { expect(result).toEqual(11.234); }); + it('should stop parsing strings at the end of stream', function() { + var input = new StringStream('1$4)'); + input.getChar = function(super_getChar) { + // simulating end of file using null (see issue 2766) + var ch = super_getChar.call(input); + return ch == '$' ? null : ch; + }.bind(input, input.getChar); + var lexer = new Lexer(input); + var result = lexer.getString(); + + expect(result).toEqual('1'); + }); + it('should not throw exception on bad input', function() { // '8 0 2 15 5 2 2 2 4 3 2 4' // should be parsed as