From 8958e29187683194ee9d4e0775caf47884331585 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Thu, 2 Apr 2020 20:14:52 +0200 Subject: [PATCH] reset errorhandler context --- apps/openmw/mwscript/scriptmanagerimp.cpp | 2 +- components/compiler/streamerrorhandler.cpp | 17 ++++++++++++++++- components/compiler/streamerrorhandler.hpp | 13 ++++++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwscript/scriptmanagerimp.cpp b/apps/openmw/mwscript/scriptmanagerimp.cpp index 0dcf34afb3..c63beeec3f 100644 --- a/apps/openmw/mwscript/scriptmanagerimp.cpp +++ b/apps/openmw/mwscript/scriptmanagerimp.cpp @@ -171,7 +171,7 @@ namespace MWScript { Compiler::Locals locals; - mErrorHandler.setContext(name2 + "[local variables]"); + Compiler::ContextRestore restore = mErrorHandler.setContext(name2 + "[local variables]", true); std::istringstream stream (script->mScriptText); Compiler::QuickFileParser parser (mErrorHandler, mCompilerContext, locals); diff --git a/components/compiler/streamerrorhandler.cpp b/components/compiler/streamerrorhandler.cpp index b5a3a8c9fa..2528b53798 100644 --- a/components/compiler/streamerrorhandler.cpp +++ b/components/compiler/streamerrorhandler.cpp @@ -56,10 +56,25 @@ namespace Compiler Log(logLevel) << text.str(); } - void StreamErrorHandler::setContext(const std::string &context) + ContextRestore StreamErrorHandler::setContext(const std::string &context, bool restore) { + if (!restore) + { + mContext = context; + return {nullptr, {}}; + } + ContextRestore restorer(this, mContext); mContext = context; + return restorer; } StreamErrorHandler::StreamErrorHandler() {} + + ContextRestore::ContextRestore(StreamErrorHandler* handler, const std::string& context) : mHandler(handler), mContext(context) {} + + ContextRestore::~ContextRestore() + { + if(mHandler) + mHandler->setContext(mContext); + } } diff --git a/components/compiler/streamerrorhandler.hpp b/components/compiler/streamerrorhandler.hpp index e203a6ef71..2b4aeda50f 100644 --- a/components/compiler/streamerrorhandler.hpp +++ b/components/compiler/streamerrorhandler.hpp @@ -7,6 +7,7 @@ namespace Compiler { + class ContextRestore; /// \brief Error handler implementation: Write errors into logging stream class StreamErrorHandler : public ErrorHandler @@ -26,13 +27,23 @@ namespace Compiler public: - void setContext(const std::string& context); + ContextRestore setContext(const std::string& context, bool restore = false); // constructors StreamErrorHandler (); ///< constructor }; + + class ContextRestore + { + StreamErrorHandler* mHandler; + const std::string mContext; + public: + ContextRestore (StreamErrorHandler* handler, const std::string& context); + + ~ContextRestore(); + }; } #endif