Skip to content

Commit 8842290

Browse files
committed
fix unboxing of value types in generated delegate code
1 parent 9dfb7eb commit 8842290

4 files changed

Lines changed: 26 additions & 1 deletion

File tree

pythonnet/src/runtime/delegatemanager.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ private static Type GetDispatcher(Type dtype) {
147147
if (method.ReturnType == voidtype) {
148148
il.Emit(OpCodes.Pop);
149149
}
150+
else if (method.ReturnType.IsValueType) {
151+
il.Emit(OpCodes.Unbox_Any, method.ReturnType);
152+
}
150153

151154
il.Emit(OpCodes.Ret);
152155

pythonnet/src/runtime/delegateobject.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) {
9696
if (d == null) {
9797
return Exceptions.RaiseTypeError("invalid argument");
9898
}
99-
10099
return self.binder.Invoke(ob, args, kw);
101100
}
102101

pythonnet/src/testing/delegatetest.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ namespace Python.Test {
2020

2121
public delegate DelegateTest ObjectDelegate();
2222
public delegate string StringDelegate();
23+
public delegate bool BoolDelegate();
2324

2425

2526
public class DelegateTest {
@@ -31,6 +32,7 @@ public class DelegateTest {
3132

3233
public StringDelegate stringDelegate;
3334
public ObjectDelegate objectDelegate;
35+
public BoolDelegate boolDelegate;
3436

3537
public DelegateTest() {
3638

@@ -52,6 +54,11 @@ public DelegateTest CallObjectDelegate(ObjectDelegate d) {
5254
return d();
5355
}
5456

57+
public bool CallBoolDelegate(BoolDelegate d) {
58+
return d();
59+
}
60+
61+
5562
}
5663

5764

pythonnet/src/tests/test_delegate.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from Python.Test import DelegateTest, PublicDelegate
1111
from Python.Test import StringDelegate, ObjectDelegate
12+
from Python.Test import BoolDelegate
1213
import sys, os, string, unittest, types
1314
import Python.Test as Test
1415
import System
@@ -299,6 +300,21 @@ def sayhello():
299300
self.failUnless(ob.stringDelegate == d)
300301

301302

303+
def testBoolDelegate(self):
304+
"""Test boolean delegate."""
305+
306+
def always_so_negative():
307+
return 0
308+
309+
d = BoolDelegate(always_so_negative)
310+
ob = DelegateTest()
311+
ob.CallBoolDelegate(d)
312+
313+
314+
self.failUnless(not d())
315+
316+
self.failUnless(not ob.CallBoolDelegate(d))
317+
302318
# test async delegates
303319

304320
# test multicast delegates

0 commit comments

Comments
 (0)