public override void Emit (EmitContext ec)
{
MethodSpec m;
int [] words = decimal.GetBits (Value);
int power = (words [3] >> 16) & 0xff;
if (power == 0) {
if (Value <= int.MaxValue && Value >= int.MinValue) {
m = ec.Module.PredefinedMembers.DecimalCtorInt.Resolve (loc);
if (m == null) {
return;
}
ec.EmitInt ((int) Value);
ec.Emit (OpCodes.Newobj, m);
return;
}
if (Value <= long.MaxValue && Value >= long.MinValue) {
m = ec.Module.PredefinedMembers.DecimalCtorLong.Resolve (loc);
if (m == null) {
return;
}
ec.EmitLong ((long) Value);
ec.Emit (OpCodes.Newobj, m);
return;
}
}
ec.EmitInt (words [0]);
ec.EmitInt (words [1]);
ec.EmitInt (words [2]);
// sign
ec.EmitInt (words [3] >> 31);
// power
ec.EmitInt (power);
m = ec.Module.PredefinedMembers.DecimalCtor.Resolve (loc);
if (m != null) {
ec.Emit (OpCodes.Newobj, m);
}
}