public override void Emit(EmitContext ec)
{
Expression argExp;
TypeSpec typeSpec;
switch (mg.Name)
{
case "Emit":
if (arguments.Count == 1)
{
ec.Emit(opcode);
}
break;
case "Load":
argExp = arguments [0].Expr;
if (argExp is BoxedCast)
{
argExp = ((BoxedCast)argExp).Child;
}
argExp.Emit(ec);
break;
case "LoadAddr":
argExp = arguments [0].Expr;
if (argExp is BoxedCast)
{
argExp = ((BoxedCast)argExp).Child;
}
var memloc = argExp as IMemoryLocation;
memloc.AddressOf(ec, AddressOp.Load | AddressOp.Store);
break;
case "LoadInd":
if ((bool)(arguments [1].Expr as BoolConstant).GetValue())
{
ec.Emit(OpCodes.Dup);
}
typeSpec = ((TypeOf)arguments [0].Expr).TypeArgument;
ec.EmitLoadFromPtr(typeSpec);
break;
case "Store":
argExp = arguments [0].Expr;
if (argExp is BoxedCast)
{
argExp = ((BoxedCast)argExp).Child;
}
var t = argExp as IAssignMethod;
t.EmitAssign(ec, _dummyExpr, (bool)(arguments [1].Expr as BoolConstant).GetValue(), false);
break;
case "StoreInd":
if ((bool)(arguments [1].Expr as BoolConstant).GetValue())
{
ec.Emit(OpCodes.Dup);
}
typeSpec = ((TypeOf)arguments [0].Expr).TypeArgument;
ec.EmitStoreFromPtr(typeSpec);
break;
}
}