Ver Fonte

Comparing Object wrappers (#367)

Sébastien Ros há 8 anos atrás
pai
commit
2367a263dc

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

@@ -1863,5 +1863,22 @@ namespace Jint.Tests.Runtime
 				}
             ");
 		}
-    }
+
+        [Fact]
+        public void ShouldCompareInnerValueOfClrInstances()
+        {
+            var engine = new Engine();
+
+            // Create two separate Guid with identical inner values.
+            var guid1 = Guid.NewGuid();
+            var guid2 = new Guid(guid1.ToString());
+
+            engine.SetValue("guid1", guid1);
+            engine.SetValue("guid2", guid2);
+
+			var result = engine.Execute("guid1 == guid2").GetCompletionValue().AsBoolean();
+
+			Assert.True(result);
+        }
+	}
 }

+ 21 - 38
Jint/Runtime/ExpressionIntepreter.cs

@@ -6,6 +6,7 @@ using Jint.Native.Number;
 using Jint.Parser.Ast;
 using Jint.Runtime.Descriptors;
 using Jint.Runtime.Environments;
+using Jint.Runtime.Interop;
 using Jint.Runtime.References;
 
 namespace Jint.Runtime
@@ -381,40 +382,7 @@ namespace Jint.Runtime
 
             if (typex == typey)
             {
-                if (typex == Types.Undefined || typex == Types.Null)
-                {
-                    return true;
-                }
-
-                if (typex == Types.Number)
-                {
-                    var nx = TypeConverter.ToNumber(x);
-                    var ny = TypeConverter.ToNumber(y);
-
-                    if (double.IsNaN(nx) || double.IsNaN(ny))
-                    {
-                        return false;
-                    }
-
-                    if (nx.Equals(ny))
-                    {
-                        return true;
-                    }
-
-                    return false;
-                }
-
-                if (typex == Types.String)
-                {
-                    return TypeConverter.ToString(x) == TypeConverter.ToString(y);
-                }
-
-                if (typex == Types.Boolean)
-                {
-                    return x.AsBoolean() == y.AsBoolean();
-                }
-
-                return x == y;
+				return StrictlyEqual(x, y);
             }
 
             if (x == Null.Instance && y == Undefined.Instance)
@@ -479,10 +447,11 @@ namespace Jint.Runtime
             {
                 return true;
             }
+
             if (typea == Types.Number)
             {
-                var nx = TypeConverter.ToNumber(x);
-                var ny = TypeConverter.ToNumber(y);
+                var nx = x.AsNumber();
+                var ny = y.AsNumber();
 
                 if (double.IsNaN(nx) || double.IsNaN(ny))
                 {
@@ -496,14 +465,28 @@ namespace Jint.Runtime
 
                 return false;
             }
+
             if (typea == Types.String)
             {
-                return TypeConverter.ToString(x) == TypeConverter.ToString(y);
+                return x.AsString() == y.AsString();
             }
+
             if (typea == Types.Boolean)
             {
-                return TypeConverter.ToBoolean(x) == TypeConverter.ToBoolean(y);
+                return x.AsBoolean() == y.AsBoolean();
             }
+
+			if (typea == Types.Object)
+			{
+				var xw = x.AsObject() as IObjectWrapper;
+
+				if (xw != null)
+				{
+					var yw = y.AsObject() as IObjectWrapper;
+					return Object.Equals(xw.Target, yw.Target);
+				}
+			}
+
             return x == y;
         }
 

+ 2 - 7
Jint/Runtime/Interop/IObjectWrapper.cs

@@ -1,11 +1,6 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace Jint.Runtime.Interop
+namespace Jint.Runtime.Interop
 {
-    public interface IObjectWrapper
+	public interface IObjectWrapper
     {
         object Target { get; }
     }

+ 4 - 5
Jint/Runtime/Interop/ObjectWrapper.cs

@@ -5,14 +5,13 @@ using Jint.Native;
 using Jint.Native.Object;
 using Jint.Runtime.Descriptors;
 using Jint.Runtime.Descriptors.Specialized;
-using System.Collections;
 
 namespace Jint.Runtime.Interop
 {
-    /// <summary>
-    /// Wraps a CLR instance
-    /// </summary>
-    public sealed class ObjectWrapper : ObjectInstance, IObjectWrapper
+	/// <summary>
+	/// Wraps a CLR instance
+	/// </summary>
+	public sealed class ObjectWrapper : ObjectInstance, IObjectWrapper
     {
         public Object Target { get; set; }