| 
1 | 1 | using System.Diagnostics;  | 
2 |  | -using System.Collections.Concurrent;  | 
 | 2 | +using System.Collections.Concurrent;  | 
3 | 3 | using System.Diagnostics.CodeAnalysis;  | 
4 | 4 | using System.Runtime.CompilerServices;  | 
5 | 5 | using Jint.Native;  | 
@@ -50,7 +50,10 @@ public sealed partial class Engine : IDisposable  | 
50 | 50 |     internal readonly Constraint[] _constraints;  | 
51 | 51 |     internal readonly bool _isDebugMode;  | 
52 | 52 |     internal readonly bool _isStrict;  | 
 | 53 | + | 
 | 54 | +    private bool _customResolver;  | 
53 | 55 |     internal readonly IReferenceResolver _referenceResolver;  | 
 | 56 | + | 
54 | 57 |     internal readonly ReferencePool _referencePool;  | 
55 | 58 |     internal readonly ArgumentsInstancePool _argumentsInstancePool;  | 
56 | 59 |     internal readonly JsValueArrayPool _jsValueArrayPool;  | 
@@ -135,6 +138,7 @@ private Engine(Options? options, Action<Engine, Options>? configure)  | 
135 | 138 | 
 
  | 
136 | 139 |         _constraints = Options.Constraints.Constraints.ToArray();  | 
137 | 140 |         _referenceResolver = Options.ReferenceResolver;  | 
 | 141 | +        _customResolver = !ReferenceEquals(_referenceResolver, DefaultReferenceResolver.Instance);  | 
138 | 142 | 
 
  | 
139 | 143 |         _referencePool = new ReferencePool();  | 
140 | 144 |         _argumentsInstancePool = new ArgumentsInstancePool(this);  | 
@@ -564,18 +568,25 @@ internal JsValue GetValue(Reference reference, bool returnReferenceToPool)  | 
564 | 568 | 
 
  | 
565 | 569 |         if (baseValue.IsUndefined())  | 
566 | 570 |         {  | 
567 |  | -            if (_referenceResolver.TryUnresolvableReference(this, reference, out var val))  | 
 | 571 | +            if (_customResolver)  | 
568 | 572 |             {  | 
569 |  | -                return val;  | 
 | 573 | +                reference.EvaluateAndCachePropertyKey();  | 
 | 574 | +                if (_referenceResolver.TryUnresolvableReference(this, reference, out var val))  | 
 | 575 | +                {  | 
 | 576 | +                    return val;  | 
 | 577 | +                }  | 
570 | 578 |             }  | 
571 | 579 | 
 
  | 
572 | 580 |             ExceptionHelper.ThrowReferenceError(Realm, reference);  | 
573 | 581 |         }  | 
574 | 582 | 
 
  | 
575 |  | -        if ((baseValue._type & InternalTypes.ObjectEnvironmentRecord) == InternalTypes.Empty  | 
576 |  | -            && _referenceResolver.TryPropertyReference(this, reference, ref baseValue))  | 
 | 583 | +        if ((baseValue._type & InternalTypes.ObjectEnvironmentRecord) == InternalTypes.Empty && _customResolver)  | 
577 | 584 |         {  | 
578 |  | -            return baseValue;  | 
 | 585 | +            reference.EvaluateAndCachePropertyKey();  | 
 | 586 | +            if (_referenceResolver.TryPropertyReference(this, reference, ref baseValue))  | 
 | 587 | +            {  | 
 | 588 | +                return baseValue;  | 
 | 589 | +            }  | 
579 | 590 |         }  | 
580 | 591 | 
 
  | 
581 | 592 |         if (reference.IsPropertyReference)  | 
 | 
0 commit comments