foreach
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user