@@ -200,17 +200,33 @@ public void StatefulMarshalling()
200200 var obj = CreateWrapper < StatefulMarshalling , IStatefulMarshalling > ( ) ;
201201 var data = new StatefulType ( ) { i = 42 } ;
202202
203+ int preCallFreeCount = StatefulTypeMarshaller . FreeCount ;
203204 obj . Method ( data ) ;
204205 Assert . Equal ( 42 , data . i ) ;
206+ Assert . Equal ( preCallFreeCount + 2 , StatefulTypeMarshaller . FreeCount ) ;
207+
208+ preCallFreeCount = StatefulTypeMarshaller . FreeCount ;
205209 obj . MethodIn ( in data ) ;
206210 Assert . Equal ( 42 , data . i ) ;
211+ Assert . Equal ( preCallFreeCount + 2 , StatefulTypeMarshaller . FreeCount ) ;
212+
207213 var oldData = data ;
214+ preCallFreeCount = StatefulTypeMarshaller . FreeCount ;
208215 obj . MethodRef ( ref data ) ;
216+ Assert . Equal ( preCallFreeCount + 2 , StatefulTypeMarshaller . FreeCount ) ;
209217 Assert . True ( oldData == data ) ; // We want reference equality here
218+
219+ preCallFreeCount = StatefulTypeMarshaller . FreeCount ;
210220 obj . MethodOut ( out data ) ;
221+ Assert . Equal ( preCallFreeCount + 2 , StatefulTypeMarshaller . FreeCount ) ;
211222 Assert . Equal ( 1 , data . i ) ;
223+
224+ preCallFreeCount = StatefulTypeMarshaller . FreeCount ;
212225 Assert . Equal ( 1 , obj . Return ( ) . i ) ;
226+ Assert . Equal ( preCallFreeCount + 2 , StatefulTypeMarshaller . FreeCount ) ;
227+ preCallFreeCount = StatefulTypeMarshaller . FreeCount ;
213228 Assert . Equal ( 1 , obj . ReturnPreserveSig ( ) . i ) ;
229+ Assert . Equal ( preCallFreeCount + 2 , StatefulTypeMarshaller . FreeCount ) ;
214230 }
215231
216232 [ Fact ]
@@ -219,16 +235,67 @@ public void StatelessCallerAllocatedBufferMarshalling()
219235 var obj = CreateWrapper < StatelessCallerAllocatedBufferMarshalling , IStatelessCallerAllocatedBufferMarshalling > ( ) ;
220236 var data = new StatelessCallerAllocatedBufferType ( ) { I = 42 } ;
221237
238+ // ManagedToUnmanagedIn should use Caller Allocated Buffer and not allocate
239+ StatelessCallerAllocatedBufferTypeMarshaller . DisableAllocations ( ) ;
240+
241+ var numFreeCalls = StatelessCallerAllocatedBufferTypeMarshaller . FreeCount ;
222242 obj . Method ( data ) ;
243+ Assert . Equal ( 1 + numFreeCalls , StatelessCallerAllocatedBufferTypeMarshaller . FreeCount ) ;
223244 Assert . Equal ( 42 , data . I ) ;
245+
246+ numFreeCalls = StatelessCallerAllocatedBufferTypeMarshaller . FreeCount ;
224247 obj . MethodIn ( in data ) ;
248+ Assert . Equal ( 1 + numFreeCalls , StatelessCallerAllocatedBufferTypeMarshaller . FreeCount ) ;
225249 Assert . Equal ( 42 , data . I ) ;
250+
251+ // Other marshal modes will allocate
252+ StatelessCallerAllocatedBufferTypeMarshaller . EnableAllocations ( ) ;
253+
254+ numFreeCalls = StatelessCallerAllocatedBufferTypeMarshaller . FreeCount ;
226255 obj . MethodRef ( ref data ) ;
256+ Assert . Equal ( 2 + numFreeCalls , StatelessCallerAllocatedBufferTypeMarshaller . FreeCount ) ;
257+ StatelessCallerAllocatedBufferTypeMarshaller . AssertAllPointersFreed ( ) ;
227258 Assert . Equal ( 200 , data . I ) ;
259+
260+ numFreeCalls = StatelessCallerAllocatedBufferTypeMarshaller . FreeCount ;
228261 obj . MethodOut ( out data ) ;
262+ Assert . Equal ( 1 + numFreeCalls , StatelessCallerAllocatedBufferTypeMarshaller . FreeCount ) ;
263+ StatelessCallerAllocatedBufferTypeMarshaller . AssertAllPointersFreed ( ) ;
229264 Assert . Equal ( 20 , data . I ) ;
265+
266+ numFreeCalls = StatelessCallerAllocatedBufferTypeMarshaller . FreeCount ;
230267 Assert . Equal ( 201 , obj . Return ( ) . I ) ;
268+ Assert . Equal ( 1 + numFreeCalls , StatelessCallerAllocatedBufferTypeMarshaller . FreeCount ) ;
269+
270+ numFreeCalls = StatelessCallerAllocatedBufferTypeMarshaller . FreeCount ;
231271 Assert . Equal ( 202 , obj . ReturnPreserveSig ( ) . I ) ;
272+ Assert . Equal ( 1 + numFreeCalls , StatelessCallerAllocatedBufferTypeMarshaller . FreeCount ) ;
273+ }
274+
275+ [ Fact ]
276+ public void StatefulPinnedMarshalling ( )
277+ {
278+ var obj = CreateWrapper < StatefulPinnedMarshalling , IStatefulPinnedMarshalling > ( ) ;
279+ var data = new StatefulPinnedType ( ) { I = 4 } ;
280+
281+ StatefulPinnedTypeMarshaller . ManagedToUnmanagedIn . DisableNonPinnedPath ( ) ;
282+
283+ obj . Method ( data ) ;
284+ Assert . Equal ( 4 , data . I ) ;
285+
286+ obj . MethodIn ( in data ) ;
287+ Assert . Equal ( 4 , data . I ) ;
288+
289+ StatefulPinnedTypeMarshaller . ManagedToUnmanagedIn . EnableNonPinnedPath ( ) ;
290+
291+ obj . MethodOut ( out data ) ;
292+ Assert . Equal ( 102 , data . I ) ;
293+
294+ obj . MethodRef ( ref data ) ;
295+ Assert . Equal ( 103 , data . I ) ;
296+
297+ data = obj . Return ( ) ;
298+ Assert . Equal ( 104 , data . I ) ;
232299 }
233300
234301 [ Fact ]
0 commit comments