浏览代码

fix extension and class methods being enumerated (#959)

Gökhan Kurt 3 年之前
父节点
当前提交
2f34c74ef0
共有 3 个文件被更改,包括 66 次插入28 次删除
  1. 62 24
      Jint.Tests/Runtime/InteropTests.cs
  2. 1 1
      Jint/Options.cs
  3. 3 3
      Jint/Runtime/Interop/Reflection/MethodAccessor.cs

+ 62 - 24
Jint.Tests/Runtime/InteropTests.cs

@@ -81,7 +81,7 @@ namespace Jint.Tests.Runtime
         {
             var engine = new Engine();
 
-            var dictionary = new Dictionary<string,object> {
+            var dictionary = new Dictionary<string, object> {
                 { "foo", 5 },
                 { "bar", "A string"},
             };
@@ -705,7 +705,7 @@ namespace Jint.Tests.Runtime
         [Fact]
         public void CanUseTrim()
         {
-            var p = new Person { Name = "Mickey Mouse "};
+            var p = new Person { Name = "Mickey Mouse " };
             _engine.SetValue("p", p);
 
             RunTest(@"
@@ -860,10 +860,10 @@ namespace Jint.Tests.Runtime
             var parts = result.ToObject();
 
             Assert.True(parts.GetType().IsArray);
-            Assert.Equal(3, ((object[])parts).Length);
-            Assert.Equal(2d, ((object[])parts)[0]);
-            Assert.Equal(4d, ((object[])parts)[1]);
-            Assert.Equal(6d, ((object[])parts)[2]);
+            Assert.Equal(3, ((object[]) parts).Length);
+            Assert.Equal(2d, ((object[]) parts)[0]);
+            Assert.Equal(4d, ((object[]) parts)[1]);
+            Assert.Equal(6d, ((object[]) parts)[2]);
         }
 
         [Fact]
@@ -876,10 +876,10 @@ namespace Jint.Tests.Runtime
             var parts = result.ToObject();
 
             Assert.True(parts.GetType().IsArray);
-            Assert.Equal(3, ((object[])parts).Length);
-            Assert.Equal(2d, ((object[])parts)[0]);
-            Assert.Equal(4d, ((object[])parts)[1]);
-            Assert.Equal(6d, ((object[])parts)[2]);
+            Assert.Equal(3, ((object[]) parts).Length);
+            Assert.Equal(2d, ((object[]) parts)[0]);
+            Assert.Equal(4d, ((object[]) parts)[1]);
+            Assert.Equal(6d, ((object[]) parts)[2]);
         }
 
         [Fact]
@@ -888,9 +888,9 @@ namespace Jint.Tests.Runtime
             var parts = _engine.Evaluate("'[email protected]'.split('@');").ToObject();
 
             Assert.True(parts.GetType().IsArray);
-            Assert.Equal(2, ((object[])parts).Length);
-            Assert.Equal("foo", ((object[])parts)[0]);
-            Assert.Equal("bar.com", ((object[])parts)[1]);
+            Assert.Equal(2, ((object[]) parts).Length);
+            Assert.Equal("foo", ((object[]) parts)[0]);
+            Assert.Equal("bar.com", ((object[]) parts)[1]);
         }
 
         [Fact]
@@ -964,7 +964,7 @@ namespace Jint.Tests.Runtime
             Assert.Equal(1, value.a);
             Assert.Equal("foo", value.b);
 
-            var dic = (IDictionary<string, object>)result.ToObject();
+            var dic = (IDictionary<string, object>) result.ToObject();
 
             Assert.Equal(1d, dic["a"]);
             Assert.Equal("foo", dic["b"]);
@@ -1278,12 +1278,12 @@ namespace Jint.Tests.Runtime
             var engine1 = new Engine();
             engine1.SetValue("p", new { Test = true });
             engine1.Execute("var result = p.Test;");
-            Assert.True((bool)engine1.GetValue("result").ToObject());
+            Assert.True((bool) engine1.GetValue("result").ToObject());
 
             var engine2 = new Engine(o => o.AddObjectConverter(new NegateBoolConverter()));
             engine2.SetValue("p", new { Test = true });
             engine2.Execute("var result = p.Test;");
-            Assert.False((bool)engine2.GetValue("result").ToObject());
+            Assert.False((bool) engine2.GetValue("result").ToObject());
 
         }
 
@@ -1295,7 +1295,7 @@ namespace Jint.Tests.Runtime
             engine1.SetValue("p", new { Comparison = StringComparison.CurrentCulture });
             engine1.Execute("assert(p.Comparison === 'CurrentCulture');");
             engine1.Execute("var result = p.Comparison;");
-            Assert.Equal("CurrentCulture", (string)engine1.GetValue("result").ToObject());
+            Assert.Equal("CurrentCulture", (string) engine1.GetValue("result").ToObject());
         }
 
         [Fact]
@@ -1526,7 +1526,7 @@ namespace Jint.Tests.Runtime
         public void ShouldUseExplicitIndexerPropertyGetter()
         {
             var company = new Company("ACME");
-            ((ICompany)company)["Foo"] = "Bar";
+            ((ICompany) company)["Foo"] = "Bar";
             _engine.SetValue("c", company);
 
             RunTest(@"
@@ -1549,7 +1549,7 @@ namespace Jint.Tests.Runtime
         public void ShouldUseExplicitIndexerPropertySetter()
         {
             var company = new Company("ACME");
-            ((ICompany)company)["Foo"] = "Bar";
+            ((ICompany) company)["Foo"] = "Bar";
             _engine.SetValue("c", company);
 
             RunTest(@"
@@ -1646,7 +1646,7 @@ namespace Jint.Tests.Runtime
         public void ShouldReturnUndefinedProperty()
         {
             _engine.SetValue("uo", new { foo = "bar" });
-            _engine.SetValue("ud", new Dictionary<string, object> { {"foo", "bar"} });
+            _engine.SetValue("ud", new Dictionary<string, object> { { "foo", "bar" } });
             _engine.SetValue("ul", new List<string> { "foo", "bar" });
 
             RunTest(@"
@@ -2078,7 +2078,7 @@ namespace Jint.Tests.Runtime
         [Fact]
         public void ArrayFromShouldConvertArrayToArrayLike()
         {
-            var list = new []
+            var list = new[]
             {
                 new Person {Name = "Mike"},
                 new Person {Name = "Mika"}
@@ -2103,7 +2103,7 @@ namespace Jint.Tests.Runtime
         [Fact]
         public void ArrayFromShouldConvertIEnumerable()
         {
-            var enumerable = new []
+            var enumerable = new[]
             {
                 new Person {Name = "Mike"},
                 new Person {Name = "Mika"}
@@ -2148,7 +2148,7 @@ namespace Jint.Tests.Runtime
             ");
 
             Assert.NotNull(c.ToString());
-            Assert.Equal((uint)0, c.As<ObjectInstance>().Length);
+            Assert.Equal((uint) 0, c.As<ObjectInstance>().Length);
         }
 
         class DictionaryWrapper
@@ -2524,7 +2524,7 @@ namespace Jint.Tests.Runtime
         [Fact]
         public void ShouldHandleCyclicReferences()
         {
-            var engine=new Engine();
+            var engine = new Engine();
 
             static void Test(string message, object value) { Console.WriteLine(message); }
 
@@ -2583,5 +2583,43 @@ namespace Jint.Tests.Runtime
             Assert.True(e.Evaluate("a.Call1").IsObject());
             Assert.True(e.Evaluate("a.CALL1").IsObject());
         }
+
+        [Fact]
+        public void ShouldNotEnumerateClassMethods()
+        {
+            var engine = new Engine();
+
+            var dictionary = new Dictionary<string, object> {
+                { "foo", 5 },
+                { "bar", "A string"},
+            };
+            engine.SetValue("dictionary", dictionary);
+
+            var result = engine.Evaluate($"Object.keys(dictionary).join(',')").AsString();
+            Assert.Equal("foo,bar", result);
+
+
+            engine.Execute("dictionary.ContainsKey('foo')");
+            result = engine.Evaluate($"Object.keys(dictionary).join(',')").AsString();
+            Assert.Equal("foo,bar", result);
+        }
+
+        [Fact]
+        public void ShouldNotEnumerateExtensionMethods()
+        {
+            var engine = new Engine(cfg => cfg.AddExtensionMethods(typeof(Enumerable)));
+
+            var result = engine.Evaluate("Object.keys({ ...[1,2,3] }).join(',')").AsString();
+            Assert.Equal("0,1,2", result);
+
+            var script = @"
+                var arr = [1,2,3];
+                var keys = [];
+                for(var index in arr) keys.push(index);
+                keys.join(',');
+            ";
+            result = engine.Evaluate(script).ToString();
+            Assert.Equal("0,1,2", result);
+        }
     }
 }

+ 1 - 1
Jint/Options.cs

@@ -127,7 +127,7 @@ namespace Jint
                         ? new MethodInfoFunctionInstance(engine, MethodDescriptor.Build(overloads.ToList()))
                         : new MethodInfoFunctionInstance(engine, MethodDescriptor.Build(overloads.ToList()), function);
 
-                    return new PropertyDescriptor(instance, PropertyFlag.NonConfigurable);
+                    return new PropertyDescriptor(instance, PropertyFlag.AllForbidden);
                 }
 
                 JsValue key = overloads.Key;

+ 3 - 3
Jint/Runtime/Interop/Reflection/MethodAccessor.cs

@@ -12,7 +12,7 @@ namespace Jint.Runtime.Interop.Reflection
         }
 
         public override bool Writable => false;
-        
+
         protected override object DoGetValue(object target)
         {
             return null;
@@ -24,7 +24,7 @@ namespace Jint.Runtime.Interop.Reflection
 
         public override PropertyDescriptor CreatePropertyDescriptor(Engine engine, object target)
         {
-            return new(new MethodInfoFunctionInstance(engine, _methods), PropertyFlag.OnlyEnumerable);
+            return new(new MethodInfoFunctionInstance(engine, _methods), PropertyFlag.AllForbidden);
         }
     }
-}
+}