diff --git a/compiler/Generator.cs b/compiler/Generator.cs index 372f258..fc4bc5b 100644 --- a/compiler/Generator.cs +++ b/compiler/Generator.cs @@ -167,6 +167,9 @@ public class Generator static inline void string_rc_dec(struct nub_core_string *string) { + if (string == NULL) + return; + if (string->flags & FLAG_STRING_LITERAL) return; @@ -362,10 +365,8 @@ public class Generator if (statement.Value != null) { var value = EmitExpression(statement.Value); - var variableName = TmpName(); - writer.WriteLine($"{CType(statement.Value.Type, variableName)} = {value};"); EmitCleanupAllScopes(); - writer.WriteLine($"return {variableName};"); + writer.WriteLine($"return {value};"); } else { @@ -481,7 +482,7 @@ public class Generator private string EmitExpression(TypedNodeExpression node) { - var value = node switch + return node switch { TypedNodeExpressionBinary expression => EmitExpressionBinary(expression), TypedNodeExpressionUnary expression => EmitExpressionUnary(expression), @@ -498,10 +499,6 @@ public class Generator TypedNodeExpressionFuncCall expression => EmitExpressionFuncCall(expression), _ => throw new ArgumentOutOfRangeException(nameof(node), node, null) }; - - var tmp = TmpName(); - writer.WriteLine($"{CType(node.Type, tmp)} = {value};"); - return tmp; } private string EmitExpressionBinary(TypedNodeExpressionBinary expression) @@ -509,15 +506,16 @@ public class Generator var left = EmitExpression(expression.Left); var right = EmitExpression(expression.Right); + var name = Tmp(); + if (expression.Operation == TypedNodeExpressionBinary.Op.Add && expression.Left.Type is NubTypeString && expression.Right.Type is NubTypeString) { - var name = TmpName(); scopes.Peek().DeconstructableNames.Add((name, expression.Type)); writer.WriteLine($"{CType(NubTypeString.Instance, name)} = string_concat({left}, {right});"); return name; } - return expression.Operation switch + var op = expression.Operation switch { TypedNodeExpressionBinary.Op.Add => $"({left} + {right})", TypedNodeExpressionBinary.Op.Subtract => $"({left} - {right})", @@ -536,30 +534,40 @@ public class Generator TypedNodeExpressionBinary.Op.LogicalOr => $"({left} || {right})", _ => throw new ArgumentOutOfRangeException() }; + + writer.WriteLine($"{CType(expression.Type, name)} = {op};"); + + return name; } private string EmitExpressionUnary(TypedNodeExpressionUnary expression) { var target = EmitExpression(expression.Target); - return expression.Operation switch + var name = Tmp(); + + var op = expression.Operation switch { TypedNodeExpressionUnary.Op.Negate => $"(-{target})", TypedNodeExpressionUnary.Op.Invert => $"(!{target})", _ => throw new ArgumentOutOfRangeException() }; + + writer.WriteLine($"{CType(expression.Type, name)} = {op};"); + + return name; } private string EmitExpressionStringLiteral(TypedNodeExpressionStringLiteral expression) { - var name = TmpName(); + var name = Tmp(); referencedStringLiterals.Add(name, expression.Value.Value); return $"&{name}"; } private string EmitExpressionStructLiteral(TypedNodeExpressionStructLiteral expression) { - var name = TmpName(); + var name = Tmp(); scopes.Peek().DeconstructableNames.Add((name, expression.Type)); var initializerValues = new Dictionary(); @@ -580,7 +588,7 @@ public class Generator private string EmitExpressionEnumLiteral(TypedNodeExpressionEnumLiteral expression) { - var name = TmpName(); + var name = Tmp(); scopes.Peek().DeconstructableNames.Add((name, expression.Type)); var enumVariantType = (NubTypeEnumVariant)expression.Type; @@ -591,7 +599,7 @@ public class Generator var enumInfo = (Module.TypeInfoEnum)info; var tag = enumInfo.Variants.ToList().FindIndex(x => x.Name == enumVariantType.Variant); - string? value = null; + string? value = null; if (expression.Value != null) { value = EmitExpression(expression.Value); @@ -638,7 +646,10 @@ public class Generator { var name = EmitExpression(expression.Target); var parameterValues = expression.Parameters.Select(EmitExpression).ToList(); - return $"{name}({string.Join(", ", parameterValues)})"; + + var tmp = Tmp(); + writer.WriteLine($"{CType(expression.Type, tmp)} = {name}({string.Join(", ", parameterValues)});"); + return tmp; } public string CType(NubType node, string? varName = null) @@ -667,7 +678,7 @@ public class Generator return $"struct {NameMangler.Mangle("anonymous", "struct", type)}{(varName != null ? $" {varName}" : "")}"; } - private string TmpName() + private string Tmp() { return $"_tmp{tmpNameIndex++}"; } diff --git a/examples/program/main.nub b/examples/program/main.nub index f78f57c..0c14aee 100644 --- a/examples/program/main.nub +++ b/examples/program/main.nub @@ -21,9 +21,9 @@ func main(): i32 { { core::println("quit") } - Say message + Say msg { - core::println(message) + core::println(msg) } }