Skip to content

Commit 29e068a

Browse files
committed
Fix line/file info in error messages not correctly displayed for #43
1 parent d6b2396 commit 29e068a

File tree

1 file changed

+52
-5
lines changed

1 file changed

+52
-5
lines changed

gui/src/gui_frame.cpp

+52-5
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,49 @@ std::string frame::get_adjusted_script_name(const std::string& sScriptName)
10001000
return sAdjustedName;
10011001
}
10021002

1003+
std::string hijack_sol_error_line(std::string sOriginalMessage, const std::string& sFile, uint uiLineNbr)
1004+
{
1005+
auto uiPos1 = sOriginalMessage.find("[string \"" + sFile);
1006+
if (uiPos1 == std::string::npos)
1007+
return sOriginalMessage;
1008+
1009+
auto uiPos2 = sOriginalMessage.find_first_of('"', uiPos1 + 9);
1010+
if (uiPos2 == std::string::npos)
1011+
return sOriginalMessage;
1012+
1013+
sOriginalMessage.erase(uiPos1, uiPos2 - uiPos1 + 2);
1014+
sOriginalMessage.insert(uiPos1, sFile);
1015+
1016+
auto uiPos3 = sOriginalMessage.find_first_of(':', uiPos1 + sFile.size());
1017+
if (uiPos3 == std::string::npos)
1018+
return sOriginalMessage;
1019+
1020+
auto uiPos4 = sOriginalMessage.find_first_of(':', uiPos3 + 1);
1021+
if (uiPos4 == std::string::npos)
1022+
return sOriginalMessage;
1023+
1024+
uint uiOffset = utils::string_to_uint(sOriginalMessage.substr(uiPos3 + 1, uiPos4 - uiPos3 - 1));
1025+
sOriginalMessage.erase(uiPos3 + 1, uiPos4 - uiPos3 - 1);
1026+
sOriginalMessage.insert(uiPos3 + 1, utils::to_string(uiLineNbr + uiOffset));
1027+
1028+
return sOriginalMessage;
1029+
}
1030+
1031+
std::string hijack_sol_error_message(std::string sOriginalMessage, const std::string& sFile, uint uiLineNbr)
1032+
{
1033+
std::string sNewError;
1034+
std::string sLine;
1035+
for (auto sLine : utils::cut(sOriginalMessage, "\n"))
1036+
{
1037+
if (!sNewError.empty())
1038+
sNewError += '\n';
1039+
1040+
sNewError += hijack_sol_error_line(sLine, sFile, uiLineNbr);
1041+
}
1042+
1043+
return sNewError;
1044+
}
1045+
10031046
void frame::define_script(const std::string& sScriptName, const std::string& sContent, const std::string& sFile, uint uiLineNbr)
10041047
{
10051048
std::map<std::string, handler>::iterator iterH = lDefinedHandlerList_.find(sScriptName);
@@ -1015,15 +1058,14 @@ void frame::define_script(const std::string& sScriptName, const std::string& sCo
10151058
// Actually register the function
10161059
try
10171060
{
1018-
pManager_->get_lua().script(sStr, sol::script_default_on_error);
1061+
pManager_->get_lua().script(sStr, sol::script_default_on_error, sFile);
10191062
lDefinedScriptList_[sScriptName] = sContent;
10201063
lXMLScriptInfoList_[sScriptName].sFile = sFile;
10211064
lXMLScriptInfoList_[sScriptName].uiLineNbr = uiLineNbr;
10221065
}
10231066
catch (const sol::error& mError)
10241067
{
1025-
// TODO: show file/line number from lXMLScriptInfoList_
1026-
std::string sError = mError.what();
1068+
std::string sError = hijack_sol_error_message(mError.what(), sFile, uiLineNbr);
10271069
gui::out << gui::error << sError << std::endl;
10281070

10291071
event mEvent("LUA_ERROR");
@@ -1302,6 +1344,12 @@ void frame::on_script(const std::string& sScriptName, event* pEvent)
13021344
return;
13031345
}
13041346

1347+
// Copy info, in case frame is deleted
1348+
script_info mScriptInfo;
1349+
std::map<std::string, script_info>::iterator iterInfo = lXMLScriptInfoList_.find(sScriptName);
1350+
if (iterInfo != lXMLScriptInfoList_.end())
1351+
mScriptInfo = iterInfo->second;
1352+
13051353
auto mResult = mCallback(mSelf, sol::as_args(lArgs));
13061354
// WARNING: after this point, the frame (this) may be deleted.
13071355
// Do not use any member variable or member function directly.
@@ -1310,8 +1358,7 @@ void frame::on_script(const std::string& sScriptName, event* pEvent)
13101358
{
13111359
sol::error mError = mResult;
13121360

1313-
// TODO: show file/line number from lXMLScriptInfoList_
1314-
std::string sError = mError.what();
1361+
std::string sError = hijack_sol_error_message(mError.what(), mScriptInfo.sFile, mScriptInfo.uiLineNbr);
13151362

13161363
gui::out << gui::error << sError << std::endl;
13171364

0 commit comments

Comments
 (0)