Skip to content

Commit

Permalink
Fix delegate combine when left side has already been invoked.
Browse files Browse the repository at this point in the history
  • Loading branch information
kumpera committed Jun 11, 2013
1 parent f9dac2e commit c9b90f8
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 0 deletions.
1 change: 1 addition & 0 deletions mcs/class/corlib/System/MulticastDelegate.cs
Expand Up @@ -162,6 +162,7 @@ protected sealed override Delegate CombineImpl (Delegate follow)
clone = clone.prev;
}

clone.SetMulticastInvoke ();
clone.prev = (MulticastDelegate)this.Clone ();

for (clone = clone.prev, orig = this.prev; orig != null; orig = orig.prev) {
Expand Down
30 changes: 30 additions & 0 deletions mcs/class/corlib/Test/System/MulticastDelegate.cs
Expand Up @@ -98,5 +98,35 @@ public void TestCombineRemove()
res = del1( ref val );
Assert.AreEqual("abbcbbd", val , "#A05");
}

[Test] //Bug #12536
public void TestCombineBothDirections ()
{
MyDelegate dela = new MyDelegate( MethodA );
MyDelegate delb = new MyDelegate( MethodB );
MyDelegate delc = new MyDelegate( MethodC );
MyDelegate deld = new MyDelegate( MethodD );

string val;
char res;

MyDelegate a = dela + delb;
val = "";
res = a (ref val);
Assert.AreEqual ("ab", val, "#1");
Assert.AreEqual ('b', res, "#2");

MyDelegate b = delc + deld;
val = "";
res = b (ref val);
Assert.AreEqual ("cd", val, "#3");
Assert.AreEqual ('d', res, "#4");

MyDelegate c = a + b;
val = "";
res = c (ref val);
Assert.AreEqual ("abcd", val, "#5");
Assert.AreEqual ('d', res, "#6");
}
}
}

0 comments on commit c9b90f8

Please sign in to comment.