From bb8f16c858fe6a379b2af1f781e904ecbf5cd44b Mon Sep 17 00:00:00 2001 From: ketmar Date: Thu, 5 Oct 2023 16:41:25 +0000 Subject: [PATCH] UrForth: fixed data stack trashing by condition compilation expression parser FossilOrigin-Name: 95e6878794d592bad16e80d9b03af843ceaba9a6a42e4cba2741501aa05285b3 --- src/urforth.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/urforth.c b/src/urforth.c index c086634..cad1498 100644 --- a/src/urforth.c +++ b/src/urforth.c @@ -380,7 +380,7 @@ static void ufoErrorMsgV (const char *fmt, va_list ap) { vfprintf(stderr, fmt, ap); va_end(ap); fputc('\n', stderr); - fflush(stderr); + fflush(NULL); } @@ -391,12 +391,15 @@ static void ufoErrorMsgV (const char *fmt, va_list ap) { //========================================================================== static void ufoStackTrace (void) { // dump data stack (top 16) + if (!ufoLastEmitWasCR) { printf("\n"); ufoLastEmitWasCR = 1; } + fflush(NULL); + fprintf(stderr, "***UFO STACK DEPTH: %u\n", ufoSP); uint32_t xsp = ufoSP; if (xsp > 16) xsp = 16; for (uint32_t sp = 0; sp < xsp; ++sp) { fprintf(stderr, " %2u: 0x%08x %d\n", sp, - ufoDStack[xsp - sp - 1], (int32_t)ufoDStack[xsp - sp - 1]); + ufoDStack[xsp - sp - 1], (int32_t)ufoDStack[xsp - sp - 1]); } //if (ufoSP != 0) fputc('\n', stderr); @@ -420,7 +423,7 @@ static void ufoStackTrace (void) { } } - fflush(stderr); + fflush(NULL); } @@ -2239,6 +2242,7 @@ static void ufoParseNameToTempBuf (void) { static void ufoParseNameToTempBufEmptyOk (void) { UFCALL(PARSE_NAME); if (ufoPeek() == 0) { + ufo2Drop(); // drop zero-length string ufoTempCharBuf[0] = 0; } else { if (ufoPeek() > UFO_MAX_WORD_LENGTH) ufoFatal("word name too long"); @@ -5005,6 +5009,10 @@ UFWORD(DUMP_STACK) { } } +// BACKTRACE +UFWORD(UFO_BACKTRACE) { + ufoStackTrace(); +} // UFO-FATAL // ( addr count ) @@ -6251,6 +6259,7 @@ static void ufoInitCommon (void) { (void)ufoCreateVocSetOnlyDefs("DEBUG", NULL); UFWORDX("DUMP-STACK", DUMP_STACK); + UFWORDX("BACKTRACE", UFO_BACKTRACE); //ufoDefaultVocFlags |= UFW_FLAG_VOC_HIDDEN; UFWORDX("DECOMPILE", UFO_DECOMPILE_INTERNAL); UFWORDX("BP", UFO_BP); -- 2.11.4.GIT