From 6f39ae85b73cd4d55c88b32735209e4462982ff6 Mon Sep 17 00:00:00 2001 From: bafto Date: Thu, 14 Nov 2024 16:08:28 +0100 Subject: [PATCH] fixed name shadowing --- CHANGELOG.md | 1 + lib/runtime/source/DDP/runtime.c | 5 +++++ lib/stdlib/Duden/Fehlerbehandlung.ddp | 3 ++- src/compiler/compiler.go | 8 ++++---- tests/testdata/kddp/name_shadowing/expected.txt | 3 +++ tests/testdata/kddp/name_shadowing/name_shadowing.ddp | 10 ++++++++++ 6 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 tests/testdata/kddp/name_shadowing/expected.txt create mode 100644 tests/testdata/kddp/name_shadowing/name_shadowing.ddp diff --git a/CHANGELOG.md b/CHANGELOG.md index d94568bb..3c96f3f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Der Changelog von DDP. Sortiert nach Release. ## In Entwicklung +- [Fix] Man kann eine Variable, die eine andere überschreibt jetzt mit dieser initialisieren - [Added] Man kann jetzt (auch rekursiv) alle Module aus einem Ordner einbinden - [Fix] Vorwärts Deklarationen geben nun keinen "undefined reference" Fehler mehr, wenn man sie einbindet diff --git a/lib/runtime/source/DDP/runtime.c b/lib/runtime/source/DDP/runtime.c index e8dbde05..bebbe07e 100644 --- a/lib/runtime/source/DDP/runtime.c +++ b/lib/runtime/source/DDP/runtime.c @@ -16,6 +16,7 @@ // mainly for debugging void SignalHandler(int signal) { if (signal == SIGSEGV) { + DDP_DBGLOG("caught SIGSEGV"); ddp_end_runtime(); ddp_runtime_error(1, "Segmentation fault\n"); } @@ -35,6 +36,10 @@ static void handle_args(int argc, char **argv) { // initialize runtime stuff void ddp_init_runtime(int argc, char **argv) { +#ifdef DDP_DEBUG + setvbuf(stdout, NULL, _IONBF, 0); // disable buffering for stdout +#endif // DDP_DEBUG + DDP_DBGLOG("init_runtime"); #ifdef DDPOS_WINDOWS // the locales behaviour seems to change from time to time on windows diff --git a/lib/stdlib/Duden/Fehlerbehandlung.ddp b/lib/stdlib/Duden/Fehlerbehandlung.ddp index 76937362..c3a33200 100644 --- a/lib/stdlib/Duden/Fehlerbehandlung.ddp +++ b/lib/stdlib/Duden/Fehlerbehandlung.ddp @@ -45,7 +45,8 @@ Die öffentliche Funktion Loesche_Fehler gibt nichts zurück, ist extern sichtba Speichere falsch in Fehlermeldung_Valide. Und kann so benutzt werden: "Lösche den letzten Fehler" oder - "lösche den letzten Fehler" + "lösche den letzten Fehler" oder + "Diese Funktion könnte einen Fehler melden" [ Wenn es einen Fehler gab, wird dieser zurückgegeben und gelöscht diff --git a/src/compiler/compiler.go b/src/compiler/compiler.go index a7cdab0b..5b040a71 100644 --- a/src/compiler/compiler.go +++ b/src/compiler/compiler.go @@ -480,8 +480,6 @@ func (c *compiler) VisitVarDecl(d *ast.VarDecl) ast.VisitResult { varLocation = c.NewAlloca(Typ.IrType()) } - Var := c.scp.addVar(d.Name(), varLocation, Typ, false) - // adds the variable initializer to the function fun addInitializer := func() { initVal, initTyp, isTemp := c.evaluate(d.InitVal) // evaluate the initial value @@ -496,7 +494,7 @@ func (c *compiler) VisitVarDecl(d *ast.VarDecl) ast.VisitResult { initVal, initTyp, isTemp = c.castNonAnyToAny(initVal, initTyp, isTemp, vtable) } - c.claimOrCopy(Var, initVal, Typ, isTemp) + c.claimOrCopy(varLocation, initVal, Typ, isTemp) } if c.scp.enclosing == nil { // module_init @@ -512,7 +510,7 @@ func (c *compiler) VisitVarDecl(d *ast.VarDecl) ast.VisitResult { c.moduleInitFunc, c.moduleInitCbb = c.cf, c.cbb c.cf, c.cbb = c.moduleDisposeFunc, c.moduleDisposeFunc.Blocks[0] - c.freeNonPrimitive(Var, Typ) // free the variable in module_dispose + c.freeNonPrimitive(varLocation, Typ) // free the variable in module_dispose c.cf, c.cbb = cf, cbb } @@ -522,6 +520,8 @@ func (c *compiler) VisitVarDecl(d *ast.VarDecl) ast.VisitResult { if c.cf != nil && c.cbb != nil { // ddp_main addInitializer() } + + c.scp.addVar(d.Name(), varLocation, Typ, false) return ast.VisitRecurse } diff --git a/tests/testdata/kddp/name_shadowing/expected.txt b/tests/testdata/kddp/name_shadowing/expected.txt new file mode 100644 index 00000000..03a5b569 --- /dev/null +++ b/tests/testdata/kddp/name_shadowing/expected.txt @@ -0,0 +1,3 @@ +hallo +hi +hallo diff --git a/tests/testdata/kddp/name_shadowing/name_shadowing.ddp b/tests/testdata/kddp/name_shadowing/name_shadowing.ddp new file mode 100644 index 00000000..81541969 --- /dev/null +++ b/tests/testdata/kddp/name_shadowing/name_shadowing.ddp @@ -0,0 +1,10 @@ +Binde "Duden/Ausgabe" ein. + +Der Text t ist "hallo". +: + Der Text t ist t. + Schreibe t auf eine Zeile. + Speichere "hi" in t. + Schreibe t auf eine Zeile. + +Schreibe t auf eine Zeile. \ No newline at end of file