From b66212e6d6aa9b88a0654ac007c3a4056e80b5e4 Mon Sep 17 00:00:00 2001 From: Sylvie <35663410+Rangi42@users.noreply.github.com> Date: Sat, 24 Feb 2024 20:23:25 -0500 Subject: [PATCH] Fix fstack traces for macro nodes (#1318) Since the lexer rewrite, MACRO nodes' fstack traces have not included their parent REPT nodes' names. --- src/asm/fstack.cpp | 28 ++++++------------- test/asm/rept-macro-fstack-trace.asm | 41 ++++++++++++++++++++++++++++ test/asm/rept-macro-fstack-trace.err | 40 +++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 20 deletions(-) create mode 100644 test/asm/rept-macro-fstack-trace.asm create mode 100644 test/asm/rept-macro-fstack-trace.err diff --git a/src/asm/fstack.cpp b/src/asm/fstack.cpp index f9ee636b..e3b9108f 100644 --- a/src/asm/fstack.cpp +++ b/src/asm/fstack.cpp @@ -385,22 +385,6 @@ void fstk_RunMacro(char const *macroName, struct MacroArgs *args) } contextStack->macroArgs = macro_GetCurrentArgs(); - // Compute total length of this node's name: :: - size_t reptNameLen = 0; - struct FileStackNode const *node = macro->src; - - if (node->type == NODE_REPT) { - struct FileStackReptNode const *reptNode = (struct FileStackReptNode const *)node; - - // 4294967295 = 2^32 - 1, aka UINT32_MAX - reptNameLen += reptNode->iters->size() * strlen("::REPT~4294967295"); - // Look for next named node - do { - node = node->parent; - } while (node->type == NODE_REPT); - } - - struct FileStackNamedNode const *baseNode = (struct FileStackNamedNode const *)node; struct FileStackNamedNode *fileInfo = (struct FileStackNamedNode *)malloc(sizeof(*fileInfo)); if (fileInfo) @@ -412,10 +396,14 @@ void fstk_RunMacro(char const *macroName, struct MacroArgs *args) fileInfo->node.type = NODE_MACRO; // Print the name... - fileInfo->name->reserve(baseNode->name->length() + reptNameLen + 2 + strlen(macro->name)); - fileInfo->name->append(*baseNode->name); - if (node->type == NODE_REPT) { - struct FileStackReptNode const *reptNode = (struct FileStackReptNode const *)node; + for (struct FileStackNode const *node = macro->src; node; node = node->parent) { + if (node->type != NODE_REPT) { + fileInfo->name->append(*((struct FileStackNamedNode const *)node)->name); + break; + } + } + if (macro->src->type == NODE_REPT) { + struct FileStackReptNode const *reptNode = (struct FileStackReptNode const *)macro->src; for (uint32_t i = reptNode->iters->size(); i--; ) { char buf[sizeof("::REPT~4294967295")]; // UINT32_MAX diff --git a/test/asm/rept-macro-fstack-trace.asm b/test/asm/rept-macro-fstack-trace.asm new file mode 100644 index 00000000..df01a75b --- /dev/null +++ b/test/asm/rept-macro-fstack-trace.asm @@ -0,0 +1,41 @@ +MACRO outer + DEF it = 1 + DEF n = 0 + REPT 4 + IF n % 2 == 0 + IF DEF(inner) + PURGE inner + ENDC + DEF s EQUS "\nMACRO inner\nREPT 2\nREPT 2\nWARN \"round \{d:it\}\"\nDEF it += 1\nENDR\nENDR\nENDM" + s + PURGE s + ENDC + inner + DEF n += 1 + ENDR +ENDM +REPT 1 + outer +ENDR + +MACRO foo + REPT 1 + REPT 1 + WARN "round {d:it}" + DEF it += 1 + ENDR + ENDR +ENDM +REPT 1 + REPT 1 + MACRO bar + REPT 2 + REPT 2 + foo + ENDR + ENDR + ENDM + bar + ENDR +ENDR + diff --git a/test/asm/rept-macro-fstack-trace.err b/test/asm/rept-macro-fstack-trace.err new file mode 100644 index 00000000..4ff62a74 --- /dev/null +++ b/test/asm/rept-macro-fstack-trace.err @@ -0,0 +1,40 @@ +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~1(20) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~1(12) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~1::REPT~1(13): [-Wuser] + round 1 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~1(20) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~1(12) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~1::REPT~2(13): [-Wuser] + round 2 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~1(20) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~2(12) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~2::REPT~1(13): [-Wuser] + round 3 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~1(20) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~2(12) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~2::REPT~2(13): [-Wuser] + round 4 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~2(13) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~1(12) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~1::REPT~1(13): [-Wuser] + round 5 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~2(13) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~1(12) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~1::REPT~2(13): [-Wuser] + round 6 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~2(13) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~2(12) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~2::REPT~1(13): [-Wuser] + round 7 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~2(13) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~2(12) -> rept-macro-fstack-trace.asm::outer::REPT~1::inner::REPT~2::REPT~2(13): [-Wuser] + round 8 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~3(20) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~1(12) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~1::REPT~1(13): [-Wuser] + round 9 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~3(20) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~1(12) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~1::REPT~2(13): [-Wuser] + round 10 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~3(20) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~2(12) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~2::REPT~1(13): [-Wuser] + round 11 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~3(20) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~2(12) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~2::REPT~2(13): [-Wuser] + round 12 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~4(13) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~1(12) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~1::REPT~1(13): [-Wuser] + round 13 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~4(13) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~1(12) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~1::REPT~2(13): [-Wuser] + round 14 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~4(13) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~2(12) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~2::REPT~1(13): [-Wuser] + round 15 +warning: rept-macro-fstack-trace.asm(17) -> rept-macro-fstack-trace.asm::REPT~1(18) -> rept-macro-fstack-trace.asm::outer(4) -> rept-macro-fstack-trace.asm::outer::REPT~4(13) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner(11) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~2(12) -> rept-macro-fstack-trace.asm::outer::REPT~3::inner::REPT~2::REPT~2(13): [-Wuser] + round 16 +warning: rept-macro-fstack-trace.asm(29) -> rept-macro-fstack-trace.asm::REPT~1(30) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1(38) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1::bar(32) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1::bar::REPT~1(33) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1::bar::REPT~1::REPT~1(34) -> rept-macro-fstack-trace.asm::foo(22) -> rept-macro-fstack-trace.asm::foo::REPT~1(23) -> rept-macro-fstack-trace.asm::foo::REPT~1::REPT~1(24): [-Wuser] + round 17 +warning: rept-macro-fstack-trace.asm(29) -> rept-macro-fstack-trace.asm::REPT~1(30) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1(38) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1::bar(32) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1::bar::REPT~1(33) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1::bar::REPT~1::REPT~2(34) -> rept-macro-fstack-trace.asm::foo(22) -> rept-macro-fstack-trace.asm::foo::REPT~1(23) -> rept-macro-fstack-trace.asm::foo::REPT~1::REPT~1(24): [-Wuser] + round 18 +warning: rept-macro-fstack-trace.asm(29) -> rept-macro-fstack-trace.asm::REPT~1(30) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1(38) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1::bar(32) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1::bar::REPT~2(33) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1::bar::REPT~2::REPT~1(34) -> rept-macro-fstack-trace.asm::foo(22) -> rept-macro-fstack-trace.asm::foo::REPT~1(23) -> rept-macro-fstack-trace.asm::foo::REPT~1::REPT~1(24): [-Wuser] + round 19 +warning: rept-macro-fstack-trace.asm(29) -> rept-macro-fstack-trace.asm::REPT~1(30) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1(38) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1::bar(32) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1::bar::REPT~2(33) -> rept-macro-fstack-trace.asm::REPT~1::REPT~1::bar::REPT~2::REPT~2(34) -> rept-macro-fstack-trace.asm::foo(22) -> rept-macro-fstack-trace.asm::foo::REPT~1(23) -> rept-macro-fstack-trace.asm::foo::REPT~1::REPT~1(24): [-Wuser] + round 20