This commit is contained in:
nub31
2026-03-10 16:37:59 +01:00
parent 1a1dc1389d
commit 83255980d7
5 changed files with 150 additions and 14 deletions

View File

@@ -232,6 +232,20 @@ static inline string *string_from_cstr(char *cstr)
return result;
}
#define da_append(xs, x) \
do \
{ \
if ((xs)->count >= (xs)->capacity) \
{ \
if ((xs)->capacity == 0) (xs)->capacity = 256; \
else (xs)->capacity *= 2; \
(xs)->items = realloc((xs)->items, (xs)->capacity*sizeof(*(xs)->items)); \
} \
\
(xs)->items[(xs)->count++] = (x); \
} \
while (0)
"""
);
@@ -406,6 +420,9 @@ static inline string *string_from_cstr(char *cstr)
case TypedNodeStatementWhile statement:
EmitStatementWhile(statement);
break;
case TypedNodeStatementFor statement:
EmitStatementFor(statement);
break;
case TypedNodeStatementMatch statement:
EmitStatementMatch(statement);
break;
@@ -514,6 +531,21 @@ static inline string *string_from_cstr(char *cstr)
writer.WriteLine("}");
}
private void EmitStatementFor(TypedNodeStatementFor statement)
{
var index = Tmp();
var array = EmitExpression(statement.Array);
writer.WriteLine($"for (size_t {index} = 0; {index} < {array}.count; ++{index})");
writer.WriteLine("{");
using (writer.Indent())
{
var arrayType = (NubTypeArray)statement.Array.Type;
writer.WriteLine($"{CType(arrayType.ElementType, statement.VariableName.Ident)} = {array}.items[{index}];");
EmitStatement(statement.Body);
}
writer.WriteLine("}");
}
private void EmitStatementMatch(TypedNodeStatementMatch statement)
{
var target = EmitExpression(statement.Target);
@@ -565,6 +597,7 @@ static inline string *string_from_cstr(char *cstr)
TypedNodeExpressionStringLiteral expression => EmitExpressionStringLiteral(expression),
TypedNodeExpressionStructLiteral expression => EmitExpressionStructLiteral(expression),
TypedNodeExpressionEnumLiteral expression => EmitExpressionEnumLiteral(expression),
TypedNodeExpressionArrayLiteral expression => EmitNodeExpressionArrayLiteral(expression),
TypedNodeExpressionStringConstructor expression => EmitExpressionStringConstructor(expression),
TypedNodeExpressionStructMemberAccess expression => EmitExpressionMemberAccess(expression),
TypedNodeExpressionStringLength expression => EmitExpressionStringLength(expression),
@@ -588,7 +621,7 @@ static inline string *string_from_cstr(char *cstr)
if (expression.Operation == TypedNodeExpressionBinary.Op.Add && expression.Left.Type is NubTypeString && expression.Right.Type is NubTypeString)
{
scopes.Peek().DeconstructableNames.Add((name, expression.Type));
writer.WriteLine($"{CType(NubTypeString.Instance, name)} = nub_core_string_concat({left}, {right});");
writer.WriteLine($"{CType(NubTypeString.Instance, name)} = string_concat({left}, {right});");
return name;
}
@@ -693,12 +726,27 @@ static inline string *string_from_cstr(char *cstr)
return name;
}
private string EmitNodeExpressionArrayLiteral(TypedNodeExpressionArrayLiteral expression)
{
var name = Tmp();
writer.WriteLine($"{CType(expression.Type, name)} = {{0}};");
foreach (var value in expression.Values)
{
var valueName = EmitExpression(value);
writer.WriteLine($"da_append(&{name}, {valueName});");
}
return name;
}
private string EmitExpressionStringConstructor(TypedNodeExpressionStringConstructor expression)
{
var name = Tmp();
scopes.Peek().DeconstructableNames.Add((name, expression.Type));
var value = EmitExpression(expression.Value);
writer.WriteLine($"{CType(expression.Type, name)} = nub_core_string_from_cstr({value});");
writer.WriteLine($"{CType(expression.Type, name)} = string_from_cstr({value});");
return name;
}