Flee
This commit is contained in:
84
ExpressionElements/Literals/Integral/Int32.cs
Normal file
84
ExpressionElements/Literals/Integral/Int32.cs
Normal file
@@ -0,0 +1,84 @@
|
||||
using System.Globalization;
|
||||
using Flee.ExpressionElements.Base.Literals;
|
||||
|
||||
using Flee.InternalTypes;
|
||||
|
||||
|
||||
namespace Flee.ExpressionElements.Literals.Integral
|
||||
{
|
||||
internal class Int32LiteralElement : IntegralLiteralElement
|
||||
{
|
||||
private Int32 _myValue;
|
||||
private const string MinValue = "2147483648";
|
||||
private readonly bool _myIsMinValue;
|
||||
public Int32LiteralElement(Int32 value)
|
||||
{
|
||||
_myValue = value;
|
||||
}
|
||||
|
||||
private Int32LiteralElement()
|
||||
{
|
||||
_myIsMinValue = true;
|
||||
}
|
||||
|
||||
public static Int32LiteralElement TryCreate(string image, bool isHex, bool negated)
|
||||
{
|
||||
if (negated == true & image == MinValue)
|
||||
{
|
||||
return new Int32LiteralElement();
|
||||
}
|
||||
else if (isHex == true)
|
||||
{
|
||||
Int32 value = default(Int32);
|
||||
|
||||
// Since Int32.TryParse will succeed for a string like 0xFFFFFFFF we have to do some special handling
|
||||
if (Int32.TryParse(image, NumberStyles.AllowHexSpecifier, null, out value) == false)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else if (value >= 0 & value <= Int32.MaxValue)
|
||||
{
|
||||
return new Int32LiteralElement(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Int32 value = default(Int32);
|
||||
|
||||
if (Int32.TryParse(image,out value) == true)
|
||||
{
|
||||
return new Int32LiteralElement(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Negate()
|
||||
{
|
||||
if (_myIsMinValue == true)
|
||||
{
|
||||
_myValue = Int32.MinValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
_myValue = -_myValue;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Emit(FleeILGenerator ilg, IServiceProvider services)
|
||||
{
|
||||
EmitLoad(_myValue, ilg);
|
||||
}
|
||||
|
||||
public override System.Type ResultType => typeof(Int32);
|
||||
|
||||
public int Value => _myValue;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user