...
This commit is contained in:
@@ -467,7 +467,7 @@ public class QBEGenerator
|
||||
|
||||
private void EmitBlock(BlockNode block, Scope? scope = null)
|
||||
{
|
||||
scope ??= Scope.SubScope();
|
||||
scope ??= new Scope();
|
||||
_scopes.Push(scope);
|
||||
|
||||
foreach (var statement in block.Statements)
|
||||
@@ -1295,12 +1295,6 @@ public class QBEGenerator
|
||||
return new NubStructType(definition.Module, definition.Name, fieldTypes, functionTypes);
|
||||
}
|
||||
|
||||
private NubFuncType TypeOfFunc(FuncSignatureNode signature)
|
||||
{
|
||||
var parameters = signature.Parameters.Select(x => x.Type).ToList();
|
||||
return new NubFuncType(parameters, signature.ReturnType);
|
||||
}
|
||||
|
||||
private string TmpName()
|
||||
{
|
||||
return $"%.t{++_tmpIndex}";
|
||||
@@ -1342,16 +1336,10 @@ public class QBEGenerator
|
||||
}
|
||||
}
|
||||
|
||||
// todo(nub31): Parent is not used when getting variables and deferred statements
|
||||
public class Scope(Scope? parent = null)
|
||||
public class Scope
|
||||
{
|
||||
public readonly Stack<StatementNode> DeferredStatements = [];
|
||||
public readonly Stack<Variable> Variables = [];
|
||||
|
||||
public Scope SubScope()
|
||||
{
|
||||
return new Scope(this);
|
||||
}
|
||||
}
|
||||
|
||||
public record Variable(string Name, NubType Type);
|
||||
|
||||
@@ -38,6 +38,4 @@ public record ModuleStruct(bool Exported, string Name, List<ModuleStructField> F
|
||||
|
||||
public record ModuleFunctionParameter(string Name, TypeSyntax Type);
|
||||
|
||||
public record ModuleFunction(bool Exported, string Name, string? ExternSymbol, List<ModuleFunctionParameter> Parameters, TypeSyntax ReturnType);
|
||||
|
||||
public record ModuleTemplateStruct(bool Exported, string? Name);
|
||||
public record ModuleFunction(bool Exported, string Name, string? ExternSymbol, List<ModuleFunctionParameter> Parameters, TypeSyntax ReturnType);
|
||||
@@ -70,19 +70,18 @@ public sealed class TypeChecker
|
||||
}
|
||||
}
|
||||
|
||||
private Scope BeginScope(bool root)
|
||||
private void BeginScope(bool root)
|
||||
{
|
||||
var scope = root
|
||||
? _globalScope.SubScope()
|
||||
: _scopes.Peek().SubScope();
|
||||
|
||||
_scopes.Push(scope);
|
||||
return scope;
|
||||
}
|
||||
|
||||
private Scope EndScope()
|
||||
private void EndScope()
|
||||
{
|
||||
return _scopes.Pop();
|
||||
_scopes.Pop();
|
||||
}
|
||||
|
||||
private StructNode CheckStructDefinition(StructSyntax node)
|
||||
@@ -841,13 +840,24 @@ public sealed class TypeChecker
|
||||
|
||||
private bool AlwaysReturns(StatementNode statement)
|
||||
{
|
||||
return statement switch
|
||||
switch (statement)
|
||||
{
|
||||
ReturnNode => true,
|
||||
BlockNode block => block.Statements.Count != 0 && AlwaysReturns(block.Statements.Last()),
|
||||
IfNode ifNode => AlwaysReturns(ifNode.Body) && ifNode.Else.TryGetValue(out var elseStatement) ? elseStatement.Match(AlwaysReturns, AlwaysReturns) : true,
|
||||
_ => false
|
||||
};
|
||||
case ReturnNode:
|
||||
return true;
|
||||
case BlockNode block:
|
||||
return block.Statements.Count != 0 && AlwaysReturns(block.Statements.Last());
|
||||
case IfNode ifNode:
|
||||
{
|
||||
if (!AlwaysReturns(ifNode.Body))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return !ifNode.Else.TryGetValue(out var elseStatement) || elseStatement.Match(AlwaysReturns, AlwaysReturns);
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private NubType ResolveType(TypeSyntax type)
|
||||
|
||||
Reference in New Issue
Block a user