@@ -1000,6 +1000,49 @@ std::string frame::get_adjusted_script_name(const std::string& sScriptName)
1000
1000
return sAdjustedName ;
1001
1001
}
1002
1002
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
+
1003
1046
void frame::define_script (const std::string& sScriptName , const std::string& sContent , const std::string& sFile , uint uiLineNbr)
1004
1047
{
1005
1048
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
1015
1058
// Actually register the function
1016
1059
try
1017
1060
{
1018
- pManager_->get_lua ().script (sStr , sol::script_default_on_error);
1061
+ pManager_->get_lua ().script (sStr , sol::script_default_on_error, sFile );
1019
1062
lDefinedScriptList_[sScriptName ] = sContent ;
1020
1063
lXMLScriptInfoList_[sScriptName ].sFile = sFile ;
1021
1064
lXMLScriptInfoList_[sScriptName ].uiLineNbr = uiLineNbr;
1022
1065
}
1023
1066
catch (const sol::error& mError )
1024
1067
{
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);
1027
1069
gui::out << gui::error << sError << std::endl;
1028
1070
1029
1071
event mEvent (" LUA_ERROR" );
@@ -1302,6 +1344,12 @@ void frame::on_script(const std::string& sScriptName, event* pEvent)
1302
1344
return ;
1303
1345
}
1304
1346
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
+
1305
1353
auto mResult = mCallback (mSelf , sol::as_args (lArgs));
1306
1354
// WARNING: after this point, the frame (this) may be deleted.
1307
1355
// Do not use any member variable or member function directly.
@@ -1310,8 +1358,7 @@ void frame::on_script(const std::string& sScriptName, event* pEvent)
1310
1358
{
1311
1359
sol::error mError = mResult ;
1312
1360
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 );
1315
1362
1316
1363
gui::out << gui::error << sError << std::endl;
1317
1364
0 commit comments