Przeglądaj źródła

Supporting big hex literal (#435)

Sébastien Ros 7 lat temu
rodzic
commit
b24306e099

+ 2 - 0
Jint.Tests/Parser/JavascriptParserTests.cs

@@ -125,6 +125,8 @@ namespace Jint.Tests.Parser
         [InlineData(02, "02")]
         [InlineData(10, "012")]
         [InlineData(10, "0012")]
+        [InlineData(1.189008226412092e+38, "0x5973772948c653ac1971f1576e03c4d4")]
+        [InlineData(18446744073709552000d, "0xffffffffffffffff")]
         public void ShouldParseNumericLiterals(object expected, string source)
         {
             Literal literal;

+ 32 - 1
Jint/Parser/JavascriptParser.cs

@@ -759,10 +759,41 @@ namespace Jint.Parser
                 ThrowError(null, Messages.UnexpectedToken, "ILLEGAL");
             }
 
+            double value = 0;
+
+            if (number.Length < 16)
+            {
+                value = Convert.ToUInt64(number, 16);
+            }
+            else if(number.Length > 255)
+            {
+                value = double.PositiveInfinity;
+            }
+            else
+            {
+                double modulo = 1;
+                var literal = number.ToLowerInvariant();
+                for (var i = literal.Length - 1; i >= 0; i--)
+                {
+                    var c = literal[i];
+
+                    if (c <= '9')
+                    {
+                        value += modulo * (c - '0');
+                    }
+                    else
+                    {
+                        value += modulo * (c - 'a' + 10);
+                    }
+                    
+                    modulo *= 16;
+                }
+            }
+            
             return new Token
                 {
                     Type = Tokens.NumericLiteral,
-                    Value = Convert.ToInt64(number, 16),
+                    Value = value,
                     LineNumber = _lineNumber,
                     LineStart = _lineStart,
                     Range = new[] {start, _index}