From 52198147e2616bb86ea912af87d48d238356a260 Mon Sep 17 00:00:00 2001 From: Alexander Luzgarev Date: Mon, 20 Jul 2020 13:44:52 +0200 Subject: [PATCH] Emit integers --- Parser/Binding/Binder.cs | 12 ++++++++++-- Parser/Binding/BoundNodeKind.cs | 3 ++- Parser/Binding/BoundRoot.cs | 17 ++++++++++++----- Parser/Binding/BoundTreeRewriter.cs | 13 ++++++++++--- Parser/Emitting/Emitter.cs | 18 +++++++++++++++--- Parser/Evaluator.cs | 13 ++++++++++--- 6 files changed, 59 insertions(+), 17 deletions(-) diff --git a/Parser/Binding/Binder.cs b/Parser/Binding/Binder.cs index c84550b..354562c 100644 --- a/Parser/Binding/Binder.cs +++ b/Parser/Binding/Binder.cs @@ -462,10 +462,18 @@ namespace Parser.Binding throw new NotImplementedException(); } - private BoundNumberDoubleLiteralExpression BindNumberLiteralExpression(NumberLiteralExpressionSyntaxNode node) + private BoundNumberLiteralExpression BindNumberLiteralExpression(NumberLiteralExpressionSyntaxNode node) { var value = (double)node.Number.Value!; - return NumberDoubleLiteral(node, value); + var intValue = (int)Math.Round(value); + if (intValue == value) + { + return NumberIntLiteral(node, intValue); + } + else + { + return NumberDoubleLiteral(node, value); + } } private BoundExpression BindParenthesizedExpression(ParenthesizedExpressionSyntaxNode node) diff --git a/Parser/Binding/BoundNodeKind.cs b/Parser/Binding/BoundNodeKind.cs index 19a0963..dec18e0 100644 --- a/Parser/Binding/BoundNodeKind.cs +++ b/Parser/Binding/BoundNodeKind.cs @@ -44,7 +44,8 @@ LambdaExpression, MemberAccessExpression, NamedFunctionHandleExpression, - NumberLiteralExpression, + NumberDoubleLiteralExpression, + NumberIntLiteralExpression, ParenthesizedExpression, StringLiteralExpression, TypedFunctionCallExpression, diff --git a/Parser/Binding/BoundRoot.cs b/Parser/Binding/BoundRoot.cs index e4a2a17..041abb9 100644 --- a/Parser/Binding/BoundRoot.cs +++ b/Parser/Binding/BoundRoot.cs @@ -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; } diff --git a/Parser/Binding/BoundTreeRewriter.cs b/Parser/Binding/BoundTreeRewriter.cs index 42de105..2074331 100644 --- a/Parser/Binding/BoundTreeRewriter.cs +++ b/Parser/Binding/BoundTreeRewriter.cs @@ -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; } diff --git a/Parser/Emitting/Emitter.cs b/Parser/Emitting/Emitter.cs index 51941b7..57b2c59 100644 --- a/Parser/Emitting/Emitter.cs +++ b/Parser/Emitting/Emitter.cs @@ -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); diff --git a/Parser/Evaluator.cs b/Parser/Evaluator.cs index 160d175..a563051 100644 --- a/Parser/Evaluator.cs +++ b/Parser/Evaluator.cs @@ -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); }