From 5745df4d7ee9189afdc7aca56104f40730bb5bcd Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Tue, 28 May 2019 18:13:34 +0300 Subject: [PATCH] - fixed crash on message output during decorate parsing Script position is now initialized at the very beginning of decorate parsing process Script position no longer contains uninitialized file name https://forum.zdoom.org/viewtopic.php?t=64836 --- src/scripting/decorate/thingdef_parse.cpp | 1 + src/utility/sc_man.cpp | 7 +++++++ src/utility/sc_man.h | 2 ++ 3 files changed, 10 insertions(+) diff --git a/src/scripting/decorate/thingdef_parse.cpp b/src/scripting/decorate/thingdef_parse.cpp index 6bc8074f32..a762c89810 100644 --- a/src/scripting/decorate/thingdef_parse.cpp +++ b/src/scripting/decorate/thingdef_parse.cpp @@ -1148,6 +1148,7 @@ static void ParseActor(FScanner &sc, PNamespace *ns) bag.Namespace = ns; bag.Version = { 2, 0, 0 }; bag.fromDecorate = true; + bag.ScriptPosition = sc; info = ParseActorHeader(sc, &bag); sc.MustGetToken('{'); while (sc.MustGetAnyToken(), sc.TokenType != '}') diff --git a/src/utility/sc_man.cpp b/src/utility/sc_man.cpp index 7c2aa460ad..b98316d014 100644 --- a/src/utility/sc_man.cpp +++ b/src/utility/sc_man.cpp @@ -1173,6 +1173,13 @@ FScriptPosition &FScriptPosition::operator=(const FScriptPosition &other) return *this; } +FScriptPosition &FScriptPosition::operator=(FScanner &sc) +{ + FileName = sc.ScriptName; + ScriptLine = sc.GetMessageLine(); + return *this; +} + //========================================================================== // // FScriptPosition::Message diff --git a/src/utility/sc_man.h b/src/utility/sc_man.h index 054579b61e..bf119827c6 100644 --- a/src/utility/sc_man.h +++ b/src/utility/sc_man.h @@ -169,12 +169,14 @@ struct FScriptPosition FScriptPosition() { + FileName = NAME_None; ScriptLine=0; } FScriptPosition(const FScriptPosition &other); FScriptPosition(FString fname, int line); FScriptPosition(FScanner &sc); FScriptPosition &operator=(const FScriptPosition &other); + FScriptPosition &operator=(FScanner &sc); void Message(int severity, const char *message,...) const GCCPRINTF(3,4); static void ResetErrorCounter() {