Author: sudha
Date: 2005-05-10 05:16:48 -0400 (Tue, 10 May 2005)
New Revision: 44320
Modified:
trunk/mcs/mbas/ChangeLog
trunk/mcs/mbas/assign.cs
trunk/mcs/mbas/expression.cs
trunk/mcs/mbas/statement.cs
Log:
* statement.cs, expression.cs, assign.cs :
Patch to allow latebinding expressions to be specified as ByRef arguments
Modified: trunk/mcs/mbas/ChangeLog
===================================================================
--- trunk/mcs/mbas/ChangeLog 2005-05-10 08:44:49 UTC (rev 44319)
+++ trunk/mcs/mbas/ChangeLog 2005-05-10 09:16:48 UTC (rev 44320)
@@ -1,3 +1,7 @@
+2005-05-10 Satya Sudha K <[EMAIL PROTECTED]>
+ * statement.cs, expression.cs, assign.cs :
+ Patch to allow latebinding expressions to be specified as ByRef
arguments
+
2005-05-10 Raja R Harinath <[EMAIL PROTECTED]>
* driver.cs (InitializeRootContextAndOthersFromOptions):
Modified: trunk/mcs/mbas/assign.cs
===================================================================
--- trunk/mcs/mbas/assign.cs 2005-05-10 08:44:49 UTC (rev 44319)
+++ trunk/mcs/mbas/assign.cs 2005-05-10 09:16:48 UTC (rev 44320)
@@ -296,6 +296,8 @@
if (exprType == TypeManager.object_type) {
StatementSequence tmp = new
StatementSequence (ec.CurrentBlock, loc, lateBindingExpr,
arguments, false, true);
+ if (!tmp.ResolveArguments (ec))
+ return null;
tmp.GenerateLateBindingStatements ();
return tmp.Resolve (ec);
}
Modified: trunk/mcs/mbas/expression.cs
===================================================================
--- trunk/mcs/mbas/expression.cs 2005-05-10 08:44:49 UTC (rev 44319)
+++ trunk/mcs/mbas/expression.cs 2005-05-10 09:16:48 UTC (rev 44320)
@@ -4367,12 +4367,15 @@
if (temp == null) {
if (is_left_hand)
return null;
+
if (expr is MemberAccess) {
MemberAccess m = expr as MemberAccess;
if (m.Expr.Type ==
TypeManager.object_type) {
StatementSequence etmp = new
StatementSequence (ec.CurrentBlock,
loc, expr, Arguments,
is_retval_required, is_left_hand);
+ if (!etmp.ResolveArguments (ec))
+ return null;
etmp.GenerateLateBindingStatements();
this.is_latebinding = true;
return etmp.Resolve (ec);
@@ -4529,6 +4532,8 @@
StatementSequence etmp = new
StatementSequence (ec.CurrentBlock,
loc,
ia, Arguments,
true,
false);
+ if (!etmp.ResolveArguments (ec))
+ return null;
etmp.GenerateLateBindingStatements();
return etmp.Resolve (ec);
}
Modified: trunk/mcs/mbas/statement.cs
===================================================================
--- trunk/mcs/mbas/statement.cs 2005-05-10 08:44:49 UTC (rev 44319)
+++ trunk/mcs/mbas/statement.cs 2005-05-10 09:16:48 UTC (rev 44320)
@@ -3452,7 +3452,7 @@
public class StatementSequence : Expression {
Block stmtBlock;
- ArrayList args;
+ ArrayList args, originalArgs;
Expression expr;
bool isRetValRequired;
bool isLeftHandSide;
@@ -3473,6 +3473,14 @@
{
stmtBlock = new Block (parent);
args = a;
+ originalArgs = new ArrayList ();
+ if (args != null) {
+ for (int index = 0; index < a.Count; index ++) {
+ Argument argument = (Argument) args
[index];
+ originalArgs.Add (new Argument
(argument.Expr, argument.ArgType));
+ }
+ }
+
this.expr = expr;
stmtBlock.IsLateBindingRequired = true;
this.loc = loc;
@@ -3509,22 +3517,34 @@
return this;
}
+ public bool ResolveArguments (EmitContext ec) {
+
+ if (Arguments != null)
+ {
+ for (int index = 0; index < Arguments.Count;
index ++)
+ {
+ Argument a = (Argument) Arguments
[index];
+ if (a.ArgType == Argument.AType.NoArg)
+ a = new Argument
(Parser.DecomposeQI ("System.Reflection.Missing.Value", loc),
Argument.AType.Expression);
+ if (!a.Resolve (ec, loc))
+ return false;
+ Arguments [index] = a;
+ }
+ }
+ return true;
+ }
+
public void GenerateLateBindingStatements ()
{
int argCount = 0;
ArrayList arrayInitializers = new ArrayList ();
- ArrayList originalArgs = new ArrayList ();
if (args != null) {
//arrayInitializers = new ArrayList ();
argCount = args.Count;
for (int index = 0; index < args.Count; index
++) {
Argument a = (Argument) args [index];
Expression argument = a.Expr;
- if (a.ArgType == Argument.AType.NoArg) {
- argument = Parser.DecomposeQI
("System.Reflection.Missing.Value", loc);
- }
arrayInitializers.Add (argument);
- originalArgs.Add (argument);
}
}
@@ -3575,7 +3595,9 @@
bool isCopyBackRequired = false;
if (!isLeftHandSide) {
for (int i = 0; i < argCount; i++) {
- if (!(((Argument)args[i]).Expr is
Constant))
+ Argument origArg = (Argument)
originalArgs [i];
+ Expression origExpr = origArg.Expr;
+ if (!(origExpr is Constant ||
origArg.ArgType == Argument.AType.NoArg))
isCopyBackRequired = true;
}
}
@@ -3586,8 +3608,9 @@
rank_specifier.Add (new IntLiteral (argCount));
arrayInitializers = new ArrayList ();
for (int i = 0; i < argCount; i++) {
- Argument a = (Argument) args [i];
- if (a.Expr is Constant || a.ArgType ==
Argument.AType.NoArg)
+ Argument a = (Argument) originalArgs
[i];
+ Expression origExpr = a.Expr;
+ if (origExpr is Constant || a.ArgType
== Argument.AType.NoArg)
arrayInitializers.Add (new
BoolLiteral (false));
else
arrayInitializers.Add (new
BoolLiteral (true));
@@ -3617,18 +3640,19 @@
stmtBlock.AddStatement (new StatementExpression
((ExpressionStatement) inv_stmt, loc));
for (int i = 0; i< argCount; i ++) {
- Expression thisArg = (Expression) originalArgs
[i];
- if (((Argument) args [i]).ArgType ==
Argument.AType.NoArg)
+ Argument arg = (Argument) originalArgs [i];
+ Expression origExpr = (Expression) arg.Expr;
+ if (arg.ArgType == Argument.AType.NoArg)
continue;
- if (thisArg is Constant)
+ if (origExpr is Constant)
continue;
+
Expression intExpr = new IntLiteral (i);
ArrayList argsLocal = new ArrayList ();
argsLocal.Add (new Argument (intExpr,
Argument.AType.Expression));
Expression indexExpr = new Invocation (new
SimpleName (Block.lateBindingCopyBack, loc), argsLocal, loc);
- Expression varRef = (Expression) (originalArgs
[i]);
Expression value = new Invocation (new
SimpleName (Block.lateBindingArgs, loc), argsLocal, loc);
- assign_stmt = new Assign (varRef, value, loc);
+ assign_stmt = new Assign (origExpr, value,
loc);
Expression boolExpr = new Binary
(Binary.Operator.Inequality, indexExpr, new BoolLiteral (false), loc);
Statement ifStmt = new If (boolExpr, new
StatementExpression ((ExpressionStatement) assign_stmt, loc), loc);
stmtBlock.AddStatement (ifStmt);
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches