Skip to content

Commit c511984

Browse files
committed
Do not cache methods with out parameters, fixes #13
1 parent 3a568d4 commit c511984

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

src/SpatialFocus.MethodCache.Fody/Extensions/MethodDefinitionExtension.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,15 @@ public static bool IsEligibleForWeaving(this MethodDefinition methodDefinition,
6565
return false;
6666
}
6767

68+
bool hasOutParameter = methodDefinition.Parameters.Any(x => x.IsOut);
69+
6870
bool isSpecialName = methodDefinition.IsSpecialName || methodDefinition.IsGetter || methodDefinition.IsSetter ||
6971
methodDefinition.IsConstructor;
7072

7173
bool hasCompilerGeneratedAttribute =
7274
methodDefinition.CustomAttributes.Any(attribute => attribute.AttributeType.Resolve().Equals(typeDefinition));
7375

74-
return !isSpecialName && !hasCompilerGeneratedAttribute;
76+
return !hasOutParameter && !isSpecialName && !hasCompilerGeneratedAttribute;
7577
}
7678

7779
public static CustomAttribute TryGetCacheAttribute(this MethodDefinition methodDefinition, References references)

src/SpatialFocus.MethodCache.TestAssembly/BasicTestClass.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ public int Add(int a, int b)
2222
return a + b;
2323
}
2424

25+
public int AddAndSubtract(int a, int b, out int difference)
26+
{
27+
difference = a - b;
28+
return a + b;
29+
}
30+
2531
[NoCache]
2632
public int UncachedAdd(int a, int b)
2733
{

src/SpatialFocus.MethodCache.Tests/MemoryCacheBasicTests.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,5 +111,20 @@ public void BasicTest6DerivedClass()
111111
Assert.Equal(1, mockMemoryCache.CountSets);
112112
Assert.Equal(1, mockMemoryCache.CountGets);
113113
}
114+
115+
[Fact]
116+
public void BasicTest7NotWeavingMethodWithOutParameter()
117+
{
118+
using MockMemoryCache mockMemoryCache = MockMemoryCache.Default;
119+
120+
dynamic instance = TestHelpers.CreateInstance<BasicTestClass>(MemoryCacheBasicTests.TestResult.Assembly, mockMemoryCache);
121+
122+
dynamic result = instance.AddAndSubtract(1, 2, out int difference);
123+
124+
Assert.Equal(3, result);
125+
Assert.Equal(-1, difference);
126+
Assert.Equal(0, mockMemoryCache.CountSets);
127+
Assert.Equal(0, mockMemoryCache.CountGets);
128+
}
114129
}
115130
}

0 commit comments

Comments
 (0)