diff --git a/Jint.Tests/Runtime/Domain/HiddenMembers.cs b/Jint.Tests/Runtime/Domain/HiddenMembers.cs index 34a21c225d..546d7f1d7f 100644 --- a/Jint.Tests/Runtime/Domain/HiddenMembers.cs +++ b/Jint.Tests/Runtime/Domain/HiddenMembers.cs @@ -2,6 +2,15 @@ public class HiddenMembers { + public HiddenMembers() + { + } + + public HiddenMembers(string member1) + { + Member1 = member1; + } + [Obsolete] public string Field1 = "Field1"; @@ -18,4 +27,4 @@ public class HiddenMembers public string Method2() => "Method2"; public Type Type => GetType(); -} \ No newline at end of file +} diff --git a/Jint.Tests/Runtime/EngineLimitTests.cs b/Jint.Tests/Runtime/EngineLimitTests.cs index 30d479e4d2..4eebb51971 100644 --- a/Jint.Tests/Runtime/EngineLimitTests.cs +++ b/Jint.Tests/Runtime/EngineLimitTests.cs @@ -11,7 +11,7 @@ public class EngineLimitTests #if RELEASE const int FunctionNestingCount = 990; #else - const int FunctionNestingCount = 495; + const int FunctionNestingCount = 475; #endif [Fact] diff --git a/Jint.Tests/Runtime/InteropTests.MemberAccess.cs b/Jint.Tests/Runtime/InteropTests.MemberAccess.cs index 2279193702..c4f2c04304 100644 --- a/Jint.Tests/Runtime/InteropTests.MemberAccess.cs +++ b/Jint.Tests/Runtime/InteropTests.MemberAccess.cs @@ -1,6 +1,7 @@ using System.Collections; using System.Diagnostics.CodeAnalysis; using Jint.Native; +using Jint.Native.Object; using Jint.Runtime; using Jint.Runtime.Interop; using Jint.Tests.Runtime.Domain; @@ -76,6 +77,23 @@ public void ShouldBeAbleToFilterMembers() Assert.True(engine.Evaluate("m.GetType").IsUndefined()); } + [Fact] + public void ShouldBeAbleToFilterConstructors() + { + var engine = new Engine(options => options + .SetTypeResolver(new TypeResolver + { + MemberFilter = member => member is System.Reflection.ConstructorInfo ci && ci.GetParameters().Length == 0 + }) + ); + + engine.SetValue("HiddenMembers", TypeReference.CreateTypeReference(engine)); + engine.Evaluate("new HiddenMembers()").Should().BeAssignableTo(); + + var act = () => engine.Evaluate("new HiddenMembers('/etc/passwd')"); + act.Should().Throw().WithMessage("Could not resolve a constructor*"); + } + [Fact] public void ShouldBeAbleToExposeGetType() { diff --git a/Jint/Runtime/Interop/TypeReference.cs b/Jint/Runtime/Interop/TypeReference.cs index deac09b065..2b3423655c 100644 --- a/Jint/Runtime/Interop/TypeReference.cs +++ b/Jint/Runtime/Interop/TypeReference.cs @@ -80,7 +80,12 @@ static ObjectInstance ObjectCreator(Engine engine, Realm realm, ObjectCreateStat { var constructors = _constructorCache.GetOrAdd( referenceType, - t => MethodDescriptor.Build(t.GetConstructors(BindingFlags.Public | BindingFlags.Instance))); + t => + { + List constructors = [.. t.GetConstructors(BindingFlags.Public | BindingFlags.Instance)]; + constructors.RemoveAll(x => !engine.Options.Interop.TypeResolver.MemberFilter(x)); + return MethodDescriptor.Build(constructors); + }); Func argumentProvider = static (method, state) => {