Browse Source

Implement well-formed-json-stringify (#1220)

Marko Lahma 3 years ago
parent
commit
7e2069feec

+ 1 - 2
Jint.Tests.Test262/Test262Harness.settings.json

@@ -30,8 +30,7 @@
     "top-level-await",
     "top-level-await",
     "Temporal",
     "Temporal",
     "u180e",
     "u180e",
-    "WeakRef",
-    "well-formed-json-stringify"
+    "WeakRef"
   ],
   ],
   "ExcludedFlags": [
   "ExcludedFlags": [
     "async"
     "async"

+ 10 - 2
Jint/Native/Json/JsonSerializer.cs

@@ -239,8 +239,9 @@ namespace Jint.Native.Json
             var sb = stringBuilder.Builder;
             var sb = stringBuilder.Builder;
             sb.Append('"');
             sb.Append('"');
 
 
-            foreach (var c in value)
+            for (var i = 0; i < value.Length; i++)
             {
             {
+                var c = value[i];
                 switch (c)
                 switch (c)
                 {
                 {
                     case '\"':
                     case '\"':
@@ -265,7 +266,13 @@ namespace Jint.Native.Json
                         sb.Append("\\t");
                         sb.Append("\\t");
                         break;
                         break;
                     default:
                     default:
-                        if (c < 0x20 || (c - 0x10000 >> 10) + 0xD800 == (c - 0x10000) % 0x400 + 0xDC00)
+                        if (char.IsSurrogatePair(value, i))
+                        {
+                            sb.Append(value[i]);
+                            i++;
+                            sb.Append(value[i]);
+                        }
+                        else if (c < 0x20 || char.IsSurrogate(c))
                         {
                         {
                             sb.Append("\\u");
                             sb.Append("\\u");
                             sb.Append(((int) c).ToString("x4"));
                             sb.Append(((int) c).ToString("x4"));
@@ -274,6 +281,7 @@ namespace Jint.Native.Json
                         {
                         {
                             sb.Append(c);
                             sb.Append(c);
                         }
                         }
+
                         break;
                         break;
                 }
                 }
             }
             }