Browse Source

Fixing \u escaping

Sebastien Ros 12 years ago
parent
commit
8efe43f7a3
2 changed files with 14 additions and 11 deletions
  1. 1 0
      Jint.Tests.Ecma/Ecma/6.1.cs
  2. 13 11
      Jint/Parser/JavascriptParser.cs

+ 1 - 0
Jint.Tests.Ecma/Ecma/6.1.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 
 namespace Jint.Tests.Ecma
 namespace Jint.Tests.Ecma
 {
 {
+    [Trait("Category", "Pass")]
     public class Test_6_1 : EcmaTest
     public class Test_6_1 : EcmaTest
     {
     {
         [Fact]
         [Fact]

+ 13 - 11
Jint/Parser/JavascriptParser.cs

@@ -355,7 +355,7 @@ namespace Jint.Parser
         }
         }
 
 
 
 
-        private char ScanHexEscape(char prefix)
+        private bool ScanHexEscape(char prefix, out char result)
         {
         {
             int code = char.MinValue;
             int code = char.MinValue;
 
 
@@ -371,10 +371,13 @@ namespace Jint.Parser
                 }
                 }
                 else
                 else
                 {
                 {
-                    return char.MinValue;
+                    result = char.MinValue;
+                    return false;
                 }
                 }
             }
             }
-            return (char) code;
+
+            result = (char) code;
+            return true;
         }
         }
 
 
         private string GetEscapedIdentifier()
         private string GetEscapedIdentifier()
@@ -390,8 +393,8 @@ namespace Jint.Parser
                     throw new Exception(Messages.UnexpectedToken);
                     throw new Exception(Messages.UnexpectedToken);
                 }
                 }
                 ++_index;
                 ++_index;
-                ch = ScanHexEscape('u');
-                if (ch == char.MinValue || ch == '\\' || !IsIdentifierStart(ch))
+
+                if (ScanHexEscape('u', out ch) || ch == '\\' || !IsIdentifierStart(ch))
                 {
                 {
                     throw new Exception(Messages.UnexpectedToken);
                     throw new Exception(Messages.UnexpectedToken);
                 }
                 }
@@ -417,8 +420,8 @@ namespace Jint.Parser
                         throw new Exception(Messages.UnexpectedToken);
                         throw new Exception(Messages.UnexpectedToken);
                     }
                     }
                     ++_index;
                     ++_index;
-                    ch = ScanHexEscape('u');
-                    if (ch == char.MinValue || ch == '\\' || !IsIdentifierPart(ch))
+
+                    if (ScanHexEscape('u', out ch) || ch == '\\' || !IsIdentifierPart(ch))
                     {
                     {
                         throw new Exception(Messages.UnexpectedToken);
                         throw new Exception(Messages.UnexpectedToken);
                     }
                     }
@@ -882,8 +885,8 @@ namespace Jint.Parser
                             case 'u':
                             case 'u':
                             case 'x':
                             case 'x':
                                 int restore = _index;
                                 int restore = _index;
-                                char unescaped = ScanHexEscape(ch);
-                                if (unescaped > 0)
+                                char unescaped;
+                                if(ScanHexEscape(ch, out unescaped))
                                 {
                                 {
                                     str += unescaped.ToString();
                                     str += unescaped.ToString();
                                 }
                                 }
@@ -1048,8 +1051,7 @@ namespace Jint.Parser
                     {
                     {
                         ++_index;
                         ++_index;
                         int restore = _index;
                         int restore = _index;
-                        ch = ScanHexEscape('u');
-                        if (ch > 0)
+                        if(ScanHexEscape('u', out ch))
                         {
                         {
                             flags += ch.ToString();
                             flags += ch.ToString();
                             for (str += "\\u"; restore < _index; ++restore)
                             for (str += "\\u"; restore < _index; ++restore)