Browse Source

Fix calling pop on generic list of value types (#2112)

Genteure 2 months ago
parent
commit
6aea437d06

+ 14 - 0
Jint.Tests/Runtime/ArrayTests.cs

@@ -373,4 +373,18 @@ return get + '' === ""length,0,1,2,3"";";
         enumerableResult[0].Key.Should().Be(item2.Key);
         enumerableResult[0].Key.Should().Be(item2.Key);
         enumerableResult[1].Key.Should().Be(item1.Key);
         enumerableResult[1].Key.Should().Be(item1.Key);
     }
     }
+
+    [Fact]
+    public void PopWrappedGenericList()
+    {
+        var engine = new Engine();
+        var list = new List<int> { 1, 2, 3 };
+        engine.SetValue("list", list);
+        var result = engine.Evaluate("list.pop()").AsNumber();
+
+        Assert.Equal(3, result);
+        Assert.Equal(2, list.Count);
+        Assert.Equal(1, list[0]);
+        Assert.Equal(2, list[1]);
+    }
 }
 }

+ 11 - 1
Jint/Runtime/Interop/ObjectWrapper.Specialized.cs

@@ -66,7 +66,17 @@ internal abstract class ArrayLikeWrapper : ObjectWrapper
             var value = ((JsNumber) property)._value;
             var value = ((JsNumber) property)._value;
             if (TypeConverter.IsIntegralNumber(value))
             if (TypeConverter.IsIntegralNumber(value))
             {
             {
-                DoSetAt((int) value, default);
+                var defaultValue = default(object);
+                if (typeof(JsValue).IsAssignableFrom(ItemType))
+                {
+                    defaultValue = JsValue.Undefined;
+                }
+                else if (ItemType.IsValueType)
+                {
+                    defaultValue = Activator.CreateInstance(ItemType);
+                }
+
+                DoSetAt((int) value, defaultValue);
                 return true;
                 return true;
             }
             }
         }
         }