WIP: dev #1
@@ -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<string, string>();
|
||||
@@ -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;
|
||||
@@ -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++}";
|
||||
}
|
||||
|
||||
@@ -21,9 +21,9 @@ func main(): i32 {
|
||||
{
|
||||
core::println("quit")
|
||||
}
|
||||
Say message
|
||||
Say msg
|
||||
{
|
||||
core::println(message)
|
||||
core::println(msg)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user