[mono-vb] Patch for mbas for ByRef parameters from a DLL

Bernie Solomon bernard@ugsolutions.com
Wed, 28 Jul 2004 10:37:33 -0700

This is a multi-part message in MIME format.

Content-Type: text/plain;
Content-Transfer-Encoding: 7bit

I attach a patch so that you can call methods in a referenced DLL that take
reference parameters and things compile. To do this I have made
ReflectionParameters return similar data to InternalParameters for ByRef
parameters - and also use them when GetFullParameters doesn't return
anything (presumably currently you can't call a method with optional
parameters in a different DLL).

Since I haven't done anything inside mbas before I may not have done this in
the right way. But if it is OK I can commit this.

Presumably a test case might be good but I am not quite sure where to add

Bernie Solomon

Content-Type: text/plain;
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;

Index: expression.cs=0A=
RCS file: /cvs/public/mcs/mbas/expression.cs,v=0A=
retrieving revision 1.53=0A=
diff -u -p -r1.53 expression.cs=0A=
--- expression.cs	22 Jul 2004 05:30:20 -0000	1.53=0A=
+++ expression.cs	28 Jul 2004 16:26:36 -0000=0A=
@@ -3651,6 +3651,7 @@ namespace Mono.MonoBASIC {=0A=
 					else {=0A=
 						param_type =3D pd.ParameterType (i);=0A=
+						Parameter.Modifier mod;=0A=
 						if (ps !=3D null) {=0A=
 							Parameter p =3D (Parameter) ps.FixedParameters[i];=0A=
 							bool IsDelegate =3D TypeManager.IsDelegateType (param_type);=0A=
@@ -3680,11 +3681,14 @@ namespace Mono.MonoBASIC {=0A=
 									return false;=0A=
-							if ((p.ModFlags & Parameter.Modifier.REF) !=3D 0) {=0A=
-								a =3D new Argument (a.Expr, Argument.AType.Ref);=0A=
-								if (!a.Resolve(ec,Location.Null))=0A=
-									return false;=0A=
-							}=0A=
+							mod =3D p.ModFlags;=0A=
+						} else=0A=
+							mod =3D pd.ParameterModifier (i);=0A=
+						if ((mod & Parameter.Modifier.REF) !=3D 0) {=0A=
+							a =3D new Argument (a.Expr, Argument.AType.Ref);=0A=
+							if (!a.Resolve(ec,Location.Null))=0A=
+								return false;=0A=
 					}	=0A=
@@ -3757,6 +3761,9 @@ namespace Mono.MonoBASIC {=0A=
 				if ((p !=3D null) && ((p.ModFlags & Parameter.Modifier.REF) !=3D =
0)) {=0A=
 					a.ArgType =3D Argument.AType.Ref;=0A=
 					a.Resolve(ec, Location.Null);=0A=
+				} else if ((pd.ParameterModifier (i) & Parameter.Modifier.REF) !=3D =
0) {=0A=
+					a.ArgType =3D Argument.AType.Ref;=0A=
+					a.Resolve(ec, Location.Null);=0A=
 				}	=0A=
 				int n =3D pd_count - arg_count;=0A=
@@ -3972,7 +3979,6 @@ namespace Mono.MonoBASIC {=0A=
 				if (pd.ParameterModifier (j) =3D=3D Parameter.Modifier.PARAMS &&=0A=
 					parameter_type =3D TypeManager.TypeToCoreType =
(parameter_type.GetElementType ());=0A=
 				if (a.Type !=3D parameter_type){=0A=
 					Expression conv;=0A=
Index: support.cs=0A=
RCS file: /cvs/public/mcs/mbas/support.cs,v=0A=
retrieving revision 1.8=0A=
diff -u -p -r1.8 support.cs=0A=
--- support.cs	10 Nov 2003 20:56:33 -0000	1.8=0A=
+++ support.cs	28 Jul 2004 16:26:36 -0000=0A=
@@ -57,8 +57,12 @@ namespace Mono.MonoBASIC {=0A=
 				if (pos >=3D pi.Length)=0A=
 					return null;=0A=
-				else=0A=
-					return pi [pos].ParameterType;=0A=
+				else {=0A=
+					Type pt =3D pi [pos].ParameterType;=0A=
+                              		if (pt.IsByRef)=0A=
+						pt =3D pt.GetElementType();=0A=
+					return pt;=0A=
+				}=0A=
 		public string ParameterName (int pos)=0A=
@@ -98,7 +102,7 @@ namespace Mono.MonoBASIC {=0A=
 			Type t =3D pi [pos].ParameterType;=0A=
 			if (t.IsByRef)=0A=
-				return Parameter.Modifier.ISBYREF;=0A=
+				return Parameter.Modifier.ISBYREF | Parameter.Modifier.REF;=0A=
 			return Parameter.Modifier.NONE;=0A=