Bladeren bron

Allow registering symbols to TypeReference (#1655)

Marko Lahma 1 jaar geleden
bovenliggende
commit
f12cb7d4cd

+ 16 - 0
Jint.Tests/Runtime/InteropTests.TypeReference.cs

@@ -1,4 +1,6 @@
 using Jint.Native;
+using Jint.Native.Symbol;
+using Jint.Runtime.Descriptors;
 using Jint.Runtime.Interop;
 using Jint.Tests.Runtime.Domain;
 using Microsoft.Extensions.DependencyInjection;
@@ -181,6 +183,20 @@ public partial class InteropTests
         Assert.Equal("Hello world", engine.Evaluate("new Injectable(123, 'abc').getInjectedValue();"));
     }
 
+    [Fact]
+    public void CanRegisterToStringTag()
+    {
+        var reference = TypeReference.CreateTypeReference<Dependency>(_engine);
+        reference.FastSetProperty(GlobalSymbolRegistry.ToStringTag, new PropertyDescriptor(nameof(Dependency), false, false, true));
+        reference.FastSetDataProperty("abc", 123);
+
+        _engine.SetValue("MyClass", reference);
+        _engine.Execute("var c = new MyClass();");
+
+        Assert.Equal("[object Dependency]", _engine.Evaluate("Object.prototype.toString.call(c);"));
+        Assert.Equal(123, _engine.Evaluate("c.abc"));
+    }
+
     private class Injectable
     {
         private readonly Dependency _dependency;

+ 11 - 11
Jint/Runtime/Interop/TypeReference.cs

@@ -261,20 +261,20 @@ namespace Jint.Runtime.Interop
                     SetProperty(GlobalSymbolRegistry.HasInstance, hasInstanceProperty);
                     return hasInstanceProperty;
                 }
-
-                return PropertyDescriptor.Undefined;
             }
-
-            var key = jsString._value;
-
-            if (_properties?.TryGetValue(key, out var descriptor) != true)
+            else
             {
-                descriptor = CreatePropertyDescriptor(key);
-                if (!ReferenceEquals(descriptor, PropertyDescriptor.Undefined))
+                var key = jsString._value;
+
+                if (_properties?.TryGetValue(key, out var descriptor) != true)
                 {
-                    _properties ??= new PropertyDictionary();
-                    _properties[key] = descriptor;
-                    return descriptor;
+                    descriptor = CreatePropertyDescriptor(key);
+                    if (!ReferenceEquals(descriptor, PropertyDescriptor.Undefined))
+                    {
+                        _properties ??= new PropertyDictionary();
+                        _properties[key] = descriptor;
+                        return descriptor;
+                    }
                 }
             }
 

+ 13 - 1
Jint/Runtime/Interop/TypeReferencePrototype.cs

@@ -1,4 +1,6 @@
-using Jint.Native.Object;
+using Jint.Native;
+using Jint.Native.Object;
+using Jint.Runtime.Descriptors;
 
 namespace Jint.Runtime.Interop;
 
@@ -11,4 +13,14 @@ internal sealed class TypeReferencePrototype : ObjectInstance
     }
 
     public TypeReference TypeReference { get; }
+
+    public override PropertyDescriptor GetOwnProperty(JsValue property)
+    {
+        var descriptor = TypeReference.GetOwnProperty(property);
+        if (descriptor != PropertyDescriptor.Undefined)
+        {
+            return descriptor;
+        }
+        return base.GetOwnProperty(property);
+    }
 }