|
@@ -1,5 +1,5 @@
|
|
using System.Diagnostics;
|
|
using System.Diagnostics;
|
|
-using System.Collections.Concurrent;
|
|
|
|
|
|
+using System.Collections.Concurrent;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Runtime.CompilerServices;
|
|
using Jint.Native;
|
|
using Jint.Native;
|
|
@@ -50,7 +50,10 @@ public sealed partial class Engine : IDisposable
|
|
internal readonly Constraint[] _constraints;
|
|
internal readonly Constraint[] _constraints;
|
|
internal readonly bool _isDebugMode;
|
|
internal readonly bool _isDebugMode;
|
|
internal readonly bool _isStrict;
|
|
internal readonly bool _isStrict;
|
|
|
|
+
|
|
|
|
+ private bool _customResolver;
|
|
internal readonly IReferenceResolver _referenceResolver;
|
|
internal readonly IReferenceResolver _referenceResolver;
|
|
|
|
+
|
|
internal readonly ReferencePool _referencePool;
|
|
internal readonly ReferencePool _referencePool;
|
|
internal readonly ArgumentsInstancePool _argumentsInstancePool;
|
|
internal readonly ArgumentsInstancePool _argumentsInstancePool;
|
|
internal readonly JsValueArrayPool _jsValueArrayPool;
|
|
internal readonly JsValueArrayPool _jsValueArrayPool;
|
|
@@ -135,6 +138,7 @@ public sealed partial class Engine : IDisposable
|
|
|
|
|
|
_constraints = Options.Constraints.Constraints.ToArray();
|
|
_constraints = Options.Constraints.Constraints.ToArray();
|
|
_referenceResolver = Options.ReferenceResolver;
|
|
_referenceResolver = Options.ReferenceResolver;
|
|
|
|
+ _customResolver = !ReferenceEquals(_referenceResolver, DefaultReferenceResolver.Instance);
|
|
|
|
|
|
_referencePool = new ReferencePool();
|
|
_referencePool = new ReferencePool();
|
|
_argumentsInstancePool = new ArgumentsInstancePool(this);
|
|
_argumentsInstancePool = new ArgumentsInstancePool(this);
|
|
@@ -564,18 +568,25 @@ public sealed partial class Engine : IDisposable
|
|
|
|
|
|
if (baseValue.IsUndefined())
|
|
if (baseValue.IsUndefined())
|
|
{
|
|
{
|
|
- if (_referenceResolver.TryUnresolvableReference(this, reference, out var val))
|
|
|
|
|
|
+ if (_customResolver)
|
|
{
|
|
{
|
|
- return val;
|
|
|
|
|
|
+ reference.EvaluateAndCachePropertyKey();
|
|
|
|
+ if (_referenceResolver.TryUnresolvableReference(this, reference, out var val))
|
|
|
|
+ {
|
|
|
|
+ return val;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
ExceptionHelper.ThrowReferenceError(Realm, reference);
|
|
ExceptionHelper.ThrowReferenceError(Realm, reference);
|
|
}
|
|
}
|
|
|
|
|
|
- if ((baseValue._type & InternalTypes.ObjectEnvironmentRecord) == InternalTypes.Empty
|
|
|
|
- && _referenceResolver.TryPropertyReference(this, reference, ref baseValue))
|
|
|
|
|
|
+ if ((baseValue._type & InternalTypes.ObjectEnvironmentRecord) == InternalTypes.Empty && _customResolver)
|
|
{
|
|
{
|
|
- return baseValue;
|
|
|
|
|
|
+ reference.EvaluateAndCachePropertyKey();
|
|
|
|
+ if (_referenceResolver.TryPropertyReference(this, reference, ref baseValue))
|
|
|
|
+ {
|
|
|
|
+ return baseValue;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
if (reference.IsPropertyReference)
|
|
if (reference.IsPropertyReference)
|