Pārlūkot izejas kodu

Don't override existing prototype functions with extension methods (#861)

Marko Lahma 4 gadi atpakaļ
vecāks
revīzija
ca10397b34

+ 7 - 1
Jint.Tests/Runtime/ExtensionMethods/CustomStringExtensions.cs

@@ -1,4 +1,5 @@
-using System.Dynamic;
+using System;
+using System.Dynamic;
 using System.Linq;
 using Newtonsoft.Json;
 
@@ -20,5 +21,10 @@ namespace Jint.Tests.Runtime.ExtensionMethods
         {
             return DeserializeObject<ExpandoObject>(json);
         }
+        
+        public static string[] Split(this string value, string split, StringSplitOptions options)
+        {
+            return Array.Empty<string>();
+        }
     }
 }

+ 12 - 0
Jint.Tests/Runtime/ExtensionMethods/ExtensionMethodsTest.cs

@@ -57,5 +57,17 @@ namespace Jint.Tests.Runtime.ExtensionMethods
 
             Assert.Equal("Mickey", result.name);
         }
+
+        [Fact]
+        public void PrototypeFunctionsShouldNotBeOverridden()
+        {
+            var engine = new Engine(opts =>
+            {
+                opts.AddExtensionMethods(typeof(CustomStringExtensions));
+            });
+            var arr = engine.Execute("'yes,no'.split(',')").GetCompletionValue().AsArray();
+            Assert.Equal("yes", arr[0]);
+            Assert.Equal("no", arr[1]);
+        }
     }
 }

+ 10 - 2
Jint/Options.cs

@@ -118,10 +118,18 @@ namespace Jint
                 var descriptor = new PropertyDescriptor(functionInstance, PropertyFlag.None);
 
                 // make sure we register both lower case and upper case
-                prototype.SetOwnProperty(overloads.Key, descriptor);
+                JsValue key = overloads.Key;
+                if (!prototype.HasOwnProperty(key))
+                {
+                    prototype.SetOwnProperty(key, descriptor);
+                }
                 if (char.IsUpper(overloads.Key[0]))
                 {
-                    prototype.SetOwnProperty(char.ToLower(overloads.Key[0]) + overloads.Key.Substring(1), descriptor);
+                    key = char.ToLower(overloads.Key[0]) + overloads.Key.Substring(1);
+                    if (!prototype.HasOwnProperty(key))
+                    {
+                        prototype.SetOwnProperty(key, descriptor);
+                    }
                 }
             }
         }