diff options
| author | Misko Hevery | 2010-11-05 16:41:36 -0700 |
|---|---|---|
| committer | Misko Hevery | 2010-11-05 16:41:36 -0700 |
| commit | d5e9f38f3de317a74f2711e93c7a5df0c89099c7 (patch) | |
| tree | 439cb74357cd6f107c4b9c93cabb09c70757b5c1 | |
| parent | dc66687149078876f3964a5ab0b9aa0434f46cdc (diff) | |
| download | angular.js-d5e9f38f3de317a74f2711e93c7a5df0c89099c7.tar.bz2 | |
fix error in json parser which did not allow 1.2E10 as number
| -rw-r--r-- | src/parser.js | 10 | ||||
| -rw-r--r-- | test/JsonSpec.js | 7 |
2 files changed, 12 insertions, 5 deletions
diff --git a/src/parser.js b/src/parser.js index 8dc8f9c2..77800209 100644 --- a/src/parser.js +++ b/src/parser.js @@ -101,26 +101,26 @@ function lex(text, parseStringsForObjects){ '_' == ch || ch == '$'; } function isExpOperator(ch) { - return ch == '-' || ch == '+'; + return ch == '-' || ch == '+' || isNumber(ch); } function readNumber() { var number = ""; var start = index; while (index < text.length) { - var ch = text.charAt(index); + var ch = lowercase(text.charAt(index)); if (ch == '.' || isNumber(ch)) { number += ch; } else { var peekCh = peek(); - if (ch == 'E' && isExpOperator(peekCh)) { + if (ch == 'e' && isExpOperator(peekCh)) { number += ch; } else if (isExpOperator(ch) && peekCh && isNumber(peekCh) && - number.charAt(number.length - 1) == 'E') { + number.charAt(number.length - 1) == 'e') { number += ch; } else if (isExpOperator(ch) && (!peekCh || !isNumber(peekCh)) && - number.charAt(number.length - 1) == 'E') { + number.charAt(number.length - 1) == 'e') { throw 'Lexer found invalid exponential value "' + text + '"'; } else { break; diff --git a/test/JsonSpec.js b/test/JsonSpec.js index 052c239c..e91f50cd 100644 --- a/test/JsonSpec.js +++ b/test/JsonSpec.js @@ -109,6 +109,13 @@ describe('json', function(){ expect(fromJson("{neg:-2.55, pos:+.3, a:[-2, +.1, -.2, +.3]}")).toEqual({neg:-2.55, pos:+.3, a:[-2, +.1, -.2, +.3]}); }); + it('should parse exponents', function() { + expect(fromJson("{exp:1.2E10}")).toEqual({exp:1.2E10}); + expect(fromJson("{exp:1.2E-10}")).toEqual({exp:1.2E-10}); + expect(fromJson("{exp:1.2e+10}")).toEqual({exp:1.2E10}); + expect(fromJson("{exp:1.2e-10}")).toEqual({exp:1.2E-10}); + }); + describe('security', function(){ it('should not allow naked expressions', function(){ expect(function(){fromJson('1+2');}).toThrow("Did not understand '+2' while evaluating '1+2'."); |
