public enum AType : byte {
Expression,
Ref,
- Out,
NoArg,
AddressOf
};
public AType ArgType;
public Expression Expr;
+ public string ParamName;
public Argument (Expression expr, AType type)
+ : this ("", expr, type)
{
+ }
+
+ public Argument (string paramName, Expression expr, AType type)
+ {
+ this.ParamName = paramName;
+ expr = Parser.SetValueRequiredFlag (expr);
+ if (type == AType.AddressOf)
+ expr = Parser.SetAddressOf (expr);
this.Expr = expr;
this.ArgType = type;
}
public Type Type {
get {
- if (ArgType == AType.Ref || ArgType == AType.Out)
+ if (ArgType == AType.Ref )
return TypeManager.LookupType (Expr.Type.ToString () + "&");
else
return Expr.Type;
public Parameter.Modifier GetParameterModifier ()
{
switch (ArgType) {
- case AType.Out:
- return Parameter.Modifier.OUT | Parameter.Modifier.ISBYREF;
-
case AType.Ref:
return Parameter.Modifier.REF | Parameter.Modifier.ISBYREF;
public static string FullDesc (Argument a)
{
- return (a.ArgType == AType.Ref ? "ref " :
- (a.ArgType == AType.Out ? "out " : "")) +
+ return (a.ArgType == AType.Ref ? "ref " : "") +
TypeManager.MonoBASIC_Name (a.Expr.Type);
}
Expr = Expr.ResolveLValue (ec, Expr);
} else */
- if (ArgType == AType.Out)
- Expr = Expr.ResolveLValue (ec, new EmptyExpression ());
- else if (ArgType == AType.AddressOf) {
+ if (ArgType == AType.AddressOf) {
Expression temp_expr = Expr;
if (temp_expr is SimpleName) {
public void Emit (EmitContext ec)
{
//
- // Ref and Out parameters need to have their addresses taken.
+ // Ref parameters need to have their addresses taken.
//
// ParameterReferences might already be references, so we want
// to pass just the value
//
- if (ArgType == AType.Ref || ArgType == AType.Out){
+ if (ArgType == AType.Ref ){
AddressOp mode = AddressOp.Store;
if (ArgType == AType.Ref)