Emit integers

This commit is contained in:
Alexander Luzgarev 2020-07-20 13:44:52 +02:00
parent 3bc8ef0d7d
commit 52198147e2
6 changed files with 59 additions and 17 deletions

View File

@ -462,11 +462,19 @@ namespace Parser.Binding
throw new NotImplementedException();
}
private BoundNumberDoubleLiteralExpression BindNumberLiteralExpression(NumberLiteralExpressionSyntaxNode node)
private BoundNumberLiteralExpression BindNumberLiteralExpression(NumberLiteralExpressionSyntaxNode node)
{
var value = (double)node.Number.Value!;
var intValue = (int)Math.Round(value);
if (intValue == value)
{
return NumberIntLiteral(node, intValue);
}
else
{
return NumberDoubleLiteral(node, value);
}
}
private BoundExpression BindParenthesizedExpression(ParenthesizedExpressionSyntaxNode node)
{

View File

@ -44,7 +44,8 @@
LambdaExpression,
MemberAccessExpression,
NamedFunctionHandleExpression,
NumberLiteralExpression,
NumberDoubleLiteralExpression,
NumberIntLiteralExpression,
ParenthesizedExpression,
StringLiteralExpression,
TypedFunctionCallExpression,

View File

@ -515,7 +515,14 @@ namespace Parser.Binding
public override TypeSymbol Type => throw new System.NotImplementedException();
}
public class BoundNumberDoubleLiteralExpression : BoundExpression
public abstract class BoundNumberLiteralExpression : BoundExpression
{
protected BoundNumberLiteralExpression(SyntaxNode syntax) : base(syntax)
{
}
}
public class BoundNumberDoubleLiteralExpression : BoundNumberLiteralExpression
{
public BoundNumberDoubleLiteralExpression(SyntaxNode syntax, double value)
: base(syntax)
@ -524,12 +531,12 @@ namespace Parser.Binding
}
public double Value { get; }
public override BoundNodeKind Kind => BoundNodeKind.NumberLiteralExpression;
public override BoundNodeKind Kind => BoundNodeKind.NumberDoubleLiteralExpression;
public override TypeSymbol Type => TypeSymbol.Double;
}
public class BoundNumberIntLiteralExpression : BoundExpression
public class BoundNumberIntLiteralExpression : BoundNumberLiteralExpression
{
public BoundNumberIntLiteralExpression(SyntaxNode syntax, int value)
: base(syntax)
@ -537,8 +544,8 @@ namespace Parser.Binding
Value = value;
}
public double Value { get; }
public override BoundNodeKind Kind => BoundNodeKind.NumberLiteralExpression;
public int Value { get; }
public override BoundNodeKind Kind => BoundNodeKind.NumberIntLiteralExpression;
public override TypeSymbol Type => TypeSymbol.Int;
}

View File

@ -245,8 +245,10 @@ namespace Parser.Binding
RewriteMemberAccessExpression((BoundMemberAccessExpression)node),
BoundNodeKind.NamedFunctionHandleExpression =>
RewriteNamedFunctionHandleExpression((BoundNamedFunctionHandleExpression)node),
BoundNodeKind.NumberLiteralExpression =>
RewriteNumberLiteralExpression((BoundNumberDoubleLiteralExpression)node),
BoundNodeKind.NumberDoubleLiteralExpression =>
RewriteNumberDoubleLiteralExpression((BoundNumberDoubleLiteralExpression)node),
BoundNodeKind.NumberIntLiteralExpression =>
RewriteNumberIntLiteralExpression((BoundNumberIntLiteralExpression)node),
BoundNodeKind.StringLiteralExpression =>
RewriteStringLiteralExpression((BoundStringLiteralExpression)node),
BoundNodeKind.TypedVariableExpression =>
@ -287,7 +289,12 @@ namespace Parser.Binding
return node;
}
public virtual BoundExpression RewriteNumberLiteralExpression(BoundNumberDoubleLiteralExpression node)
public virtual BoundExpression RewriteNumberDoubleLiteralExpression(BoundNumberDoubleLiteralExpression node)
{
return node;
}
public virtual BoundExpression RewriteNumberIntLiteralExpression(BoundNumberIntLiteralExpression node)
{
return node;
}

View File

@ -540,8 +540,11 @@ namespace Parser.Emitting
case BoundNodeKind.IdentifierNameExpression:
EmitIdentifierNameExpression((BoundIdentifierNameExpression)node, ilProcessor);
break;
case BoundNodeKind.NumberLiteralExpression:
EmitNumberLiteralExpression((BoundNumberDoubleLiteralExpression)node, ilProcessor);
case BoundNodeKind.NumberDoubleLiteralExpression:
EmitNumberDoubleLiteralExpression((BoundNumberDoubleLiteralExpression)node, ilProcessor);
break;
case BoundNodeKind.NumberIntLiteralExpression:
EmitNumberIntLiteralExpression((BoundNumberIntLiteralExpression)node, ilProcessor);
break;
case BoundNodeKind.StringLiteralExpression:
EmitStringLiteralExpression((BoundStringLiteralExpression)node, ilProcessor);
@ -566,6 +569,10 @@ namespace Parser.Emitting
{
ilProcessor.Emit(OpCodes.Call, _doubleToMObject);
}
if ((fromType, toType) == (TypeSymbol.Int, TypeSymbol.MObject))
{
ilProcessor.Emit(OpCodes.Call, _intToMObject);
}
else if ((fromType, toType) == (TypeSymbol.String, TypeSymbol.MObject))
{
ilProcessor.Emit(OpCodes.Call, _stringToMObject);
@ -633,11 +640,16 @@ namespace Parser.Emitting
ilProcessor.Emit(OpCodes.Callvirt, _getItemFromDictionary);
}
private void EmitNumberLiteralExpression(BoundNumberDoubleLiteralExpression node, ILProcessor ilProcessor)
private void EmitNumberDoubleLiteralExpression(BoundNumberDoubleLiteralExpression node, ILProcessor ilProcessor)
{
ilProcessor.Emit(OpCodes.Ldc_R8, node.Value);
}
private void EmitNumberIntLiteralExpression(BoundNumberIntLiteralExpression node, ILProcessor ilProcessor)
{
ilProcessor.Emit(OpCodes.Ldc_I4, node.Value);
}
private void EmitStringLiteralExpression(BoundStringLiteralExpression node, ILProcessor ilProcessor)
{
ilProcessor.Emit(OpCodes.Ldstr, node.Value);

View File

@ -250,8 +250,10 @@ namespace Parser
EvaluateMemberAccess((BoundMemberAccessExpression)node),
BoundNodeKind.NamedFunctionHandleExpression =>
EvaluateNamedFunctionHandleExpression((BoundNamedFunctionHandleExpression)node),
BoundNodeKind.NumberLiteralExpression =>
EvaluateNumberLiteralExpression((BoundNumberDoubleLiteralExpression)node),
BoundNodeKind.NumberDoubleLiteralExpression =>
EvaluateNumberDoubleLiteralExpression((BoundNumberDoubleLiteralExpression)node),
BoundNodeKind.NumberIntLiteralExpression =>
EvaluateNumberIntLiteralExpression((BoundNumberIntLiteralExpression)node),
BoundNodeKind.StringLiteralExpression =>
EvaluateStringLiteralExpression((BoundStringLiteralExpression)node),
BoundNodeKind.UnaryOperationExpression =>
@ -420,7 +422,12 @@ namespace Parser
};
}
private MObject? EvaluateNumberLiteralExpression(BoundNumberDoubleLiteralExpression node)
private MObject? EvaluateNumberDoubleLiteralExpression(BoundNumberDoubleLiteralExpression node)
{
return MObject.CreateDoubleNumber(node.Value);
}
private MObject? EvaluateNumberIntLiteralExpression(BoundNumberIntLiteralExpression node)
{
return MObject.CreateDoubleNumber(node.Value);
}