Browse Source

Fix GetOwnPropertyKeys canonical array index handling (#1184)

Marko Lahma 3 years ago
parent
commit
1ba173f8a5

+ 10 - 1
Jint.Tests/Runtime/EngineTests.cs

@@ -2861,7 +2861,16 @@ x.test = {
             var ex = Assert.Throws<JavaScriptException>(() => engine.Evaluate(script));
             Assert.Equal("Must call super constructor in derived class before accessing 'this' or returning from derived constructor", ex.Message);
         }
-        
+
+        [Fact]
+        public void ShouldGetZeroPrefixedNumericKeys()
+        {
+            var engine = new Engine();
+            engine.Evaluate("const testObj = { '02100' : true };");
+            Assert.Equal(1, engine.Evaluate("Object.keys(testObj).length;").AsNumber());
+            Assert.Equal("[\"02100\"]", engine.Evaluate("JSON.stringify(Object.getOwnPropertyNames(testObj));").AsString());
+        }
+
         private class Wrapper
         {
             public Testificate Test { get; set; }

+ 1 - 1
Jint/Native/Array/ArrayInstance.cs

@@ -526,7 +526,7 @@ namespace Jint.Native.Array
             // return TypeConverter.ToString(index) == TypeConverter.ToString(p) && index != uint.MaxValue;
         }
 
-        private static uint ParseArrayIndex(string p)
+        internal static uint ParseArrayIndex(string p)
         {
             if (p.Length == 0)
             {

+ 15 - 10
Jint/Native/JsString.cs

@@ -143,18 +143,20 @@ namespace Jint.Native
             }
 
             var i = (uint) value[0];
-            if (i < (uint) _charToStringJsValue.Length)
+            var temp = _charToStringJsValue;
+            if (i < (uint) temp.Length)
             {
-                return _charToStringJsValue[i];
+                return temp[i];
             }
             return new JsString(value);
         }
 
         internal static JsString Create(char value)
         {
-            if (value < (uint) _charToJsValue.Length)
+            var temp = _charToJsValue;
+            if (value < (uint) temp.Length)
             {
-                return _charToJsValue[value];
+                return temp[value];
             }
 
             return new JsString(value);
@@ -162,9 +164,10 @@ namespace Jint.Native
 
         internal static JsString Create(int value)
         {
-            if (value < (uint) _intToStringJsValue.Length)
+            var temp = _intToStringJsValue;
+            if (value < (uint) temp.Length)
             {
-                return _intToStringJsValue[value];
+                return temp[value];
             }
 
             return new JsString(TypeConverter.ToString(value));
@@ -172,9 +175,10 @@ namespace Jint.Native
 
         internal static JsValue Create(uint value)
         {
-            if (value < (uint) _intToStringJsValue.Length)
+            var temp = _intToStringJsValue;
+            if (value < (uint) temp.Length)
             {
-                return _intToStringJsValue[value];
+                return temp[value];
             }
 
             return new JsString(TypeConverter.ToString(value));
@@ -182,9 +186,10 @@ namespace Jint.Native
 
         internal static JsValue Create(ulong value)
         {
-            if (value < (uint) _intToStringJsValue.Length)
+            var temp = _intToStringJsValue;
+            if (value < (uint) temp.Length)
             {
-                return _intToStringJsValue[value];
+                return temp[value];
             }
 
             return new JsString(TypeConverter.ToString(value));

+ 6 - 4
Jint/Native/Object/ObjectInstance.cs

@@ -236,14 +236,16 @@ namespace Jint.Native.Object
             {
                 foreach (var pair in _properties)
                 {
-                    var isArrayIndex = ulong.TryParse(pair.Key, out var index) && index < ArrayOperations.MaxArrayLength;
-                    if (isArrayIndex)
+                    var propertyName = pair.Key.Name;
+                    var arrayIndex = ArrayInstance.ParseArrayIndex(propertyName);
+
+                    if (arrayIndex < ArrayOperations.MaxArrayLength)
                     {
-                        keys.Add(JsString.Create(index));
+                        keys.Add(JsString.Create(arrayIndex));
                     }
                     else
                     {
-                        propertyKeys.Add(new JsString(pair.Key));
+                        propertyKeys.Add(new JsString(propertyName));
                     }
                 }
             }