|
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