This commit is contained in:
nub31
2026-02-27 22:20:32 +01:00
parent e512650440
commit 73ecbf8e9b
10 changed files with 163 additions and 90 deletions

View File

@@ -46,7 +46,9 @@ public class Generator
if (!moduleGraph.TryResolveIdentifier(function.Module, function.Name.Ident, true, out var info))
throw new UnreachableException($"Module graph does not have info about the function {function.Module}::{function.Name.Ident}. This should have been caught earlier");
if (info.Kind == Module.DefinitionKind.Internal)
if (info.Source == Module.DefinitionSource.Imported || info.Extern)
writer.Write("extern ");
else if (info.Source == Module.DefinitionSource.Internal && !info.Extern && !info.Exported)
writer.Write("static ");
var parameters = function.Parameters.Select(x => CType(x.Type, x.Name.Ident));
@@ -85,15 +87,10 @@ public class Generator
{
foreach (var (name, info) in module.GetIdentifiers())
{
switch (info.Kind)
{
case Module.DefinitionKind.External:
writer.Write("extern ");
break;
case Module.DefinitionKind.Internal:
writer.Write("static ");
break;
}
if (info.Source == Module.DefinitionSource.Imported || info.Extern)
writer.Write("extern ");
else if (info.Source == Module.DefinitionSource.Internal && !info.Extern && !info.Exported)
writer.Write("static ");
if (info.Type is NubTypeFunc fn)
writer.WriteLine($"{CType(fn.ReturnType, info.MangledName)}({string.Join(", ", fn.Parameters.Select(p => CType(p)))});");
@@ -122,7 +119,7 @@ public class Generator
writer.WriteLine("{");
using (writer.Indent())
{
writer.WriteLine("const char *data;");
writer.WriteLine("char *data;");
writer.WriteLine("size_t length;");
}
writer.WriteLine("};");
@@ -366,7 +363,9 @@ public class Generator
TypedNodeExpressionStringLiteral expression => $"({CType(expression.Type)}){{ \"{expression.Value.Value}\", {expression.Value.Value.Length} }}",
TypedNodeExpressionStructLiteral expression => EmitExpressionStructLiteral(expression),
TypedNodeExpressionEnumLiteral expression => EmitExpressionEnumLiteral(expression),
TypedNodeExpressionMemberAccess expression => EmitExpressionMemberAccess(expression),
TypedNodeExpressionStructMemberAccess expression => EmitExpressionMemberAccess(expression),
TypedNodeExpressionStringLength expression => EmitExpressionStringLength(expression),
TypedNodeExpressionStringPointer expression => EmitExpressionStringPointer(expression),
TypedNodeExpressionLocalIdent expression => expression.Name,
TypedNodeExpressionGlobalIdent expression => EmitNodeExpressionGlobalIdent(expression),
TypedNodeExpressionFuncCall expression => EmitExpressionFuncCall(expression),
@@ -442,12 +441,24 @@ public class Generator
return $"({CType(expression.Type)}){{ .tag = {tag}, .{enumVariantType.Variant} = {value} }}";
}
private string EmitExpressionMemberAccess(TypedNodeExpressionMemberAccess expression)
private string EmitExpressionMemberAccess(TypedNodeExpressionStructMemberAccess expression)
{
var target = EmitExpression(expression.Target);
return $"{target}.{expression.Name.Ident}";
}
private string EmitExpressionStringLength(TypedNodeExpressionStringLength expression)
{
var target = EmitExpression(expression.Target);
return $"{target}.length";
}
private string EmitExpressionStringPointer(TypedNodeExpressionStringPointer expression)
{
var target = EmitExpression(expression.Target);
return $"{target}.data";
}
private string EmitNodeExpressionGlobalIdent(TypedNodeExpressionGlobalIdent expression)
{
if (!moduleGraph.TryResolveIdentifier(expression.Module, expression.Name, true, out var info))