diff --git a/samples/Fibonacci.Loop/Fibonacci.Loop.tdl b/samples/Fibonacci.Loop/Fibonacci.Loop.tdl index 35d9491..0800e79 100644 --- a/samples/Fibonacci.Loop/Fibonacci.Loop.tdl +++ b/samples/Fibonacci.Loop/Fibonacci.Loop.tdl @@ -13,8 +13,7 @@ int fibonacci(int i) { let a = 1; let b = 1; - while i > 2 { - --i + while i-- > 2 { const c = a + b; a = b; b = c; diff --git a/samples/Fibonacci.Loop/Fibonacci.Loop.tdlproj b/samples/Fibonacci.Loop/Fibonacci.Loop.tdlproj index a69c6ed..dd4b568 100644 --- a/samples/Fibonacci.Loop/Fibonacci.Loop.tdlproj +++ b/samples/Fibonacci.Loop/Fibonacci.Loop.tdlproj @@ -1,6 +1,6 @@ Exe - net6.0 + net8.0 diff --git a/src/Todl.Compiler.Tests/TestUtils.cs b/src/Todl.Compiler.Tests/TestUtils.cs index 10e840b..0c42891 100644 --- a/src/Todl.Compiler.Tests/TestUtils.cs +++ b/src/Todl.Compiler.Tests/TestUtils.cs @@ -52,11 +52,11 @@ internal static TBoundMember BindMember( internal static void EmitExpressionAndVerify(string input, params TestInstruction[] expectedInstructions) { - var boundExpression = BindExpression(input); - boundExpression.GetDiagnostics().Should().BeEmpty(); + var boundExpressionStatement = BindStatement(input); + boundExpressionStatement.GetDiagnostics().Should().BeEmpty(); var emitter = new TestEmitter(); - emitter.EmitExpression(boundExpression); + emitter.EmitStatement(boundExpressionStatement); emitter.Emit(); emitter.ILProcessor.Body.Instructions.ShouldHaveExactInstructionSequence(expectedInstructions); diff --git a/src/Todl.Compiler/CodeGeneration/Emitter.Expressions.cs b/src/Todl.Compiler/CodeGeneration/Emitter.Expressions.cs index ffd6eeb..6feb468 100644 --- a/src/Todl.Compiler/CodeGeneration/Emitter.Expressions.cs +++ b/src/Todl.Compiler/CodeGeneration/Emitter.Expressions.cs @@ -20,7 +20,7 @@ internal partial class InstructionEmitter && m.GetParameters().Length == 2 && m.GetParameters()[0].ParameterType.Equals(typeof(string))); - public void EmitExpression(BoundExpression boundExpression, bool emitSideEffect = false) + public void EmitExpression(BoundExpression boundExpression) { switch (boundExpression) { @@ -37,7 +37,7 @@ public void EmitExpression(BoundExpression boundExpression, bool emitSideEffect EmitTodlFunctionCallExpression(boundTodlFunctionCallExpression); return; case BoundUnaryExpression boundUnaryExpression: - EmitUnaryExpression(boundUnaryExpression, emitSideEffect); + EmitUnaryExpression(boundUnaryExpression, true); return; case BoundBinaryExpression boundBinaryExpression: EmitBinaryExpression(boundBinaryExpression); @@ -274,7 +274,7 @@ private void EmitTodlFunctionCallExpression(BoundTodlFunctionCallExpression boun { foreach (var argument in boundTodlFunctionCallExpression.BoundArguments.Values) { - EmitExpression(argument, true); + EmitExpression(argument); } var methodReference = ResolveMethodReference(boundTodlFunctionCallExpression); @@ -418,7 +418,7 @@ private void EmitStore(BoundExpression left, Action assignmentAction) if (left is BoundMemberAccessExpression boundMemberAccessExpression && !boundMemberAccessExpression.IsStatic) { - EmitExpression(boundMemberAccessExpression.BoundBaseExpression, true); + EmitExpression(boundMemberAccessExpression.BoundBaseExpression); } assignmentAction(); @@ -489,7 +489,7 @@ private void EmitAssignmentExpression(BoundAssignmentExpression boundAssignmentE { EmitStore(boundAssignmentExpression.Left, () => { - EmitExpression(boundAssignmentExpression.Right, true); + EmitExpression(boundAssignmentExpression.Right); switch (boundAssignmentExpression.Operator.BoundAssignmentOperatorKind) { diff --git a/src/Todl.Compiler/CodeGeneration/Emitter.Statements.cs b/src/Todl.Compiler/CodeGeneration/Emitter.Statements.cs index ea4f51d..9473dd7 100644 --- a/src/Todl.Compiler/CodeGeneration/Emitter.Statements.cs +++ b/src/Todl.Compiler/CodeGeneration/Emitter.Statements.cs @@ -19,7 +19,7 @@ public void EmitStatement(BoundStatement boundStatement) EmitReturnStatement(boundReturnStatement); return; case BoundExpressionStatement boundExpressionStatement: - EmitExpression(boundExpressionStatement.Expression); + EmitExpressionStatement(boundExpressionStatement); return; case BoundConditionalStatement boundConditionalStatement: EmitConditionalStatement(boundConditionalStatement); @@ -35,6 +35,18 @@ public void EmitStatement(BoundStatement boundStatement) } } + private void EmitExpressionStatement(BoundExpressionStatement boundExpressionStatement) + { + // standalone a++ shouldn't trigger side effect + if (boundExpressionStatement.Expression is BoundUnaryExpression boundUnaryExpression) + { + EmitUnaryExpression(boundUnaryExpression, false); + return; + } + + EmitExpression(boundExpressionStatement.Expression); + } + private void EmitBlockStatement(BoundBlockStatement boundBlockStatement) { foreach (var statement in boundBlockStatement.Statements) @@ -84,7 +96,7 @@ private void EmitVariableDeclarationStatement(BoundVariableDeclarationStatement if (boundVariableDeclarationStatement.InitializerExpression is not null) { - EmitExpression(boundVariableDeclarationStatement.InitializerExpression, true); + EmitExpression(boundVariableDeclarationStatement.InitializerExpression); EmitLocalStore(variableDefinition); } }