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

Reply via email to