Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/xamarin/NRefactory.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Grunwald <daniel@danielgrunwald.de>2014-08-10 14:50:55 +0400
committerDaniel Grunwald <daniel@danielgrunwald.de>2014-08-10 14:50:55 +0400
commitf972403e28c165674fc0a94c10bbf23902159597 (patch)
treecaab42dfc84a34bf5098f8d61f8a49a13a54c472 /ICSharpCode.NRefactory
parentccecc31466e652f70cc4dbefabe7914c7c73f6cd (diff)
Protect against cyclic type forwarders.
Diffstat (limited to 'ICSharpCode.NRefactory')
-rw-r--r--ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs12
1 files changed, 8 insertions, 4 deletions
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs
index 0999c843..d1cbb4f7 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs
@@ -344,10 +344,14 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
ITypeReference typeRef;
if (unresolvedAssembly.typeDefinitions.TryGetValue(topLevelTypeName, out td))
return GetTypeDefinition(td);
- else if (unresolvedAssembly.typeForwarders.TryGetValue(topLevelTypeName, out typeRef))
- return typeRef.Resolve(compilation.TypeResolveContext).GetDefinition();
- else
- return null;
+ if (unresolvedAssembly.typeForwarders.TryGetValue(topLevelTypeName, out typeRef)) {
+ // Protect against cyclic type forwarders:
+ using (var busyLock = BusyManager.Enter(typeRef)) {
+ if (busyLock.Success)
+ return typeRef.Resolve(compilation.TypeResolveContext).GetDefinition();
+ }
+ }
+ return null;
}
ITypeDefinition GetTypeDefinition(IUnresolvedTypeDefinition unresolved)