@@ -590,6 +590,17 @@ public override void DestroyGenericArgumentState (IJavaPeerable value, ref JniVa
590590 }
591591
592592 public override Expression CreateParameterFromManagedExpression ( JniValueMarshalerContext context , ParameterExpression sourceValue , ParameterAttributes synchronize )
593+ {
594+ var r = CreateIntermediaryExpressionFromManagedExpression ( context , sourceValue ) ;
595+
596+ var h = Expression . Variable ( typeof ( IntPtr ) , sourceValue + "_handle" ) ;
597+ context . LocalVariables . Add ( h ) ;
598+ context . CreationStatements . Add ( Expression . Assign ( h , Expression . Property ( r , "Handle" ) ) ) ;
599+
600+ return h ;
601+ }
602+
603+ Expression CreateIntermediaryExpressionFromManagedExpression ( JniValueMarshalerContext context , ParameterExpression sourceValue )
593604 {
594605 var r = Expression . Variable ( typeof ( JniObjectReference ) , sourceValue . Name + "_ref" ) ;
595606 context . LocalVariables . Add ( r ) ;
@@ -598,19 +609,19 @@ public override Expression CreateParameterFromManagedExpression (JniValueMarshal
598609 test : Expression . Equal ( Expression . Constant ( null ) , sourceValue ) ,
599610 ifTrue : Expression . Assign ( r , Expression . New ( typeof ( JniObjectReference ) ) ) ,
600611 ifFalse : Expression . Assign ( r , Expression . Property ( sourceValue , "PeerReference" ) ) ) ) ;
601- context . CleanupStatements . Add ( DisposeObjectReference ( r ) ) ;
602612
603- var h = Expression . Variable ( typeof ( IntPtr ) , sourceValue + "_handle" ) ;
604- context . LocalVariables . Add ( h ) ;
605- context . CreationStatements . Add ( Expression . Assign ( h , Expression . Property ( r , "Handle" ) ) ) ;
606- return h ;
613+ if ( typeof ( IJavaPeerable ) . GetTypeInfo ( ) . IsAssignableFrom ( sourceValue . Type . GetTypeInfo ( ) ) ) {
614+ context . CleanupStatements . Add ( Expression . IfThen (
615+ test : Expression . NotEqual ( Expression . Constant ( null ) , sourceValue ) ,
616+ ifTrue : Expression . Call ( sourceValue , typeof ( IJavaPeerable ) . GetTypeInfo ( ) . GetDeclaredMethod ( "DisposeUnlessReferenced" ) ) ) ) ;
617+ }
618+
619+ return r ;
607620 }
608621
609622 public override Expression CreateReturnValueFromManagedExpression ( JniValueMarshalerContext context , ParameterExpression sourceValue )
610623 {
611- CreateParameterFromManagedExpression ( context , sourceValue , 0 ) ;
612- var r = context . LocalVariables [ sourceValue + "_ref" ] ;
613- return ReturnObjectReferenceToJni ( context , sourceValue . Name , r ) ;
624+ return ReturnObjectReferenceToJni ( context , sourceValue . Name , CreateIntermediaryExpressionFromManagedExpression ( context , sourceValue ) ) ;
614625 }
615626
616627 public override Expression CreateParameterToManagedExpression ( JniValueMarshalerContext context , ParameterExpression sourceValue , ParameterAttributes synchronize , Type targetType )
0 commit comments