From 10ff6d91a5dd57c6f0550d5ca4430a16277c4dd9 Mon Sep 17 00:00:00 2001 From: MESYETI Date: Wed, 29 Jan 2025 12:31:33 +0000 Subject: [PATCH] fix missing constants in stack checker --- source/app.d | 4 +--- source/compiler.d | 1 - source/stackCheck.d | 23 +++++++++++++++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/source/app.d b/source/app.d index 3695071..feeabe1 100644 --- a/source/app.d +++ b/source/app.d @@ -417,9 +417,7 @@ int main(string[] args) { if (!noStackCheck) stackChecker.Evaluate(nodes); } catch (StackCheckerError) { - if (stackCheckerFunctions) { - stackChecker.DumpFunctions(); - } + stderr.writeln("Error occured during stack checker stage"); return 1; } diff --git a/source/compiler.d b/source/compiler.d index 364d130..92410a0 100644 --- a/source/compiler.d +++ b/source/compiler.d @@ -178,7 +178,6 @@ class CompilerBackend { } NewConst(format("%s.sizeOf", node.name), offset); - writeln(node.name); types ~= Type(node.name, offset, true, entries); } diff --git a/source/stackCheck.d b/source/stackCheck.d index 105ef0d..2bd4df5 100644 --- a/source/stackCheck.d +++ b/source/stackCheck.d @@ -396,6 +396,26 @@ class StackChecker { foreach (ref member ; structure) { identifiers ~= format("%s.%s", node.name, member); } + + identifiers ~= format("%s.sizeOf", node.name); + } + + void EvaluateEnum(EnumNode node) { + identifiers ~= format("%s.sizeOf", node.name); + identifiers ~= format("%s.min", node.name); + identifiers ~= format("%s.max", node.name); + + foreach (ref value ; node.names) { + identifiers ~= format("%s.%s", node.name, value); + } + } + + void EvaluateUnion(UnionNode node) { + identifiers ~= format("%s.sizeOf", node.name); + } + + void EvaluateAlias(AliasNode node) { + identifiers ~= format("%s.sizeOf", node.to); } void EvaluateUnsafe(UnsafeNode node) { @@ -437,6 +457,9 @@ class StackChecker { case NodeType.Set: Pop(node, 1); break; case NodeType.TryCatch: EvaluateTryCatch(cast(TryCatchNode) node); break; case NodeType.Struct: EvaluateStruct(cast(StructNode) node); break; + case NodeType.Enum: EvaluateEnum(cast(EnumNode) node); break; + case NodeType.Union: EvaluateUnion(cast(UnionNode) node); break; + case NodeType.Alias: EvaluateAlias(cast(AliasNode) node); break; case NodeType.Unsafe: EvaluateUnsafe(cast(UnsafeNode) node); break; default: break; }