diff options
| author | 2015-08-15 11:16:14 +0100 | |
|---|---|---|
| committer | 2015-08-15 11:56:48 +0100 | |
| commit | b3a3533931e2355d34c5a76e86eb2506dd66b64a (patch) | |
| tree | cf5aab80fb19133b17939ceb3ce127ebc2e8ddff /src | |
| parent | Merge pull request #1507 from SolarAquarion/patch-1 (diff) | |
| download | KVIrc-b3a3533931e2355d34c5a76e86eb2506dd66b64a.tar.gz KVIrc-b3a3533931e2355d34c5a76e86eb2506dd66b64a.tar.bz2 KVIrc-b3a3533931e2355d34c5a76e86eb2506dd66b64a.zip | |
Get rid of kvi_va_start_by_reference.
If to use va_start with references, behavior is undefined.
So, KVIrc used asm magic instead, which relied on how compiler generates
code. As a result, KVIrc has been crashing on Windows when compiled for x86
using msvc2013.
Instead, pass the last parameter by value, and use standard va_start.
Diffstat (limited to 'src')
| -rw-r--r-- | src/kvilib/core/KviQString.cpp | 4 | ||||
| -rw-r--r-- | src/kvilib/core/KviQString.h | 2 | ||||
| -rw-r--r-- | src/kvilib/system/kvi_stdarg.h | 29 | ||||
| -rw-r--r-- | src/kvirc/kvs/KviKvsRunTimeCall.cpp | 8 | ||||
| -rw-r--r-- | src/kvirc/kvs/KviKvsRunTimeCall.h | 4 | ||||
| -rw-r--r-- | src/kvirc/kvs/KviKvsRunTimeContext.cpp | 16 | ||||
| -rw-r--r-- | src/kvirc/kvs/KviKvsRunTimeContext.h | 8 | ||||
| -rw-r--r-- | src/kvirc/kvs/parser/KviKvsParser.cpp | 8 | ||||
| -rw-r--r-- | src/kvirc/kvs/parser/KviKvsParser.h | 4 | ||||
| -rw-r--r-- | src/kvirc/ui/KviMessageBox.cpp | 12 | ||||
| -rw-r--r-- | src/kvirc/ui/KviMessageBox.h | 6 | ||||
| -rw-r--r-- | src/kvirc/ui/KviWindow.cpp | 8 | ||||
| -rw-r--r-- | src/kvirc/ui/KviWindow.h | 4 |
13 files changed, 42 insertions, 71 deletions
diff --git a/src/kvilib/core/KviQString.cpp b/src/kvilib/core/KviQString.cpp index e30f3bb3b..9ca940529 100644 --- a/src/kvilib/core/KviQString.cpp +++ b/src/kvilib/core/KviQString.cpp @@ -913,11 +913,11 @@ namespace KviQString //szSrc.squeeze(); } - void appendFormatted(QString & szSrc, const QString & szFmt, ...) + void appendFormatted(QString & szSrc, QString szFmt, ...) { QString szTmp; kvi_va_list list; - kvi_va_start_by_reference(list,szFmt); + kvi_va_start(list,szFmt); //print...with max 256 chars KviQString::vsprintf(szTmp,szFmt,list); kvi_va_end(list); diff --git a/src/kvilib/core/KviQString.h b/src/kvilib/core/KviQString.h index e3057a493..a03271c77 100644 --- a/src/kvilib/core/KviQString.h +++ b/src/kvilib/core/KviQString.h @@ -277,7 +277,7 @@ namespace KviQString * \param ... Format string parameters * \return void */ - extern KVILIB_API void appendFormatted(QString & szSrc, const QString & szFmt, ...); + extern KVILIB_API void appendFormatted(QString & szSrc, QString szFmt, ...); /** * \brief Appends the given number to the source string diff --git a/src/kvilib/system/kvi_stdarg.h b/src/kvilib/system/kvi_stdarg.h index 0b3ff4d56..0ecdebc2a 100644 --- a/src/kvilib/system/kvi_stdarg.h +++ b/src/kvilib/system/kvi_stdarg.h @@ -30,38 +30,9 @@ #define kvi_va_list va_list #define kvi_va_start va_start -// -// kvi_va_start_by_reference should be used when the last known argument -// is a reference type and not a pointer -// -// int SomeClass::sprintf(const QString &fmt,...) -// { -// kvi_va_list list; -// kvi_va_start_by_reference(list,fmt); -// ... -// } -// -// -#if defined(COMPILE_ON_WINDOWS) && defined(MINGW) - #define kvi_va_start_by_reference(__list,__arg) \ - { \ - int supercalifragilisticoespiralidoso=_INTSIZEOF(__arg); \ - __asm lea eax,__arg \ - __asm add eax,supercalifragilisticoespiralidoso \ - __asm mov __list,eax \ - } -#elif defined(__GNUC__) && !defined(__clang__) - // gcc doesn't use the second argument - // so we just fool it to avoid the warnings - #define kvi_va_start_by_reference(__list,__arg) va_start(__list,((const char *)(&(__arg)))) -#else - #define kvi_va_start_by_reference va_start -#endif - #define kvi_va_arg va_arg #define kvi_va_end va_end - #ifdef va_copy #define kvi_va_copy(a,b) va_copy(a,b) #elif defined(__va_copy) diff --git a/src/kvirc/kvs/KviKvsRunTimeCall.cpp b/src/kvirc/kvs/KviKvsRunTimeCall.cpp index 6ab929bf5..17b503cb0 100644 --- a/src/kvirc/kvs/KviKvsRunTimeCall.cpp +++ b/src/kvirc/kvs/KviKvsRunTimeCall.cpp @@ -25,18 +25,18 @@ #include "KviKvsRunTimeCall.h" -void KviKvsRunTimeCall::warning(const QString &szFmt,...) +void KviKvsRunTimeCall::warning(QString szFmt,...) { kvi_va_list va; - kvi_va_start_by_reference(va,szFmt); + kvi_va_start(va,szFmt); m_pContext->report(false,m_pContext->defaultReportLocation(),szFmt,va); kvi_va_end(va); } -bool KviKvsRunTimeCall::error(const QString &szFmt,...) +bool KviKvsRunTimeCall::error(QString szFmt,...) { kvi_va_list va; - kvi_va_start_by_reference(va,szFmt); + kvi_va_start(va,szFmt); m_pContext->report(true,m_pContext->defaultReportLocation(),szFmt,va); kvi_va_end(va); return false; diff --git a/src/kvirc/kvs/KviKvsRunTimeCall.h b/src/kvirc/kvs/KviKvsRunTimeCall.h index a0e4909f7..d4fe3f8aa 100644 --- a/src/kvirc/kvs/KviKvsRunTimeCall.h +++ b/src/kvirc/kvs/KviKvsRunTimeCall.h @@ -75,8 +75,8 @@ public: bool leaveBlockingSection(){ return m_pContext->leaveBlockingSection(); }; // forwarders for context: they ease the porting - void warning(const QString &szFmt,...); - bool error(const QString &szFmt,...); // this ALWAYS returns false + void warning(QString szFmt,...); + bool error(QString szFmt,...); // this ALWAYS returns false }; #endif //!_KVI_KVS_RUNTIMECALL_H_ diff --git a/src/kvirc/kvs/KviKvsRunTimeContext.cpp b/src/kvirc/kvs/KviKvsRunTimeContext.cpp index f0f2a593e..219878444 100644 --- a/src/kvirc/kvs/KviKvsRunTimeContext.cpp +++ b/src/kvirc/kvs/KviKvsRunTimeContext.cpp @@ -153,38 +153,38 @@ void KviKvsRunTimeContext::report(bool bError,KviKvsTreeNode * pNode,const QStri KviKvsReport::report(&rep,m_pWindow); } -void KviKvsRunTimeContext::error(KviKvsTreeNode * pNode,const QString &szMsgFmt,...) +void KviKvsRunTimeContext::error(KviKvsTreeNode * pNode,QString szMsgFmt,...) { m_bError = true; kvi_va_list va; - kvi_va_start_by_reference(va,szMsgFmt); + kvi_va_start(va,szMsgFmt); report(true,pNode,szMsgFmt,va); kvi_va_end(va); } -void KviKvsRunTimeContext::warning(KviKvsTreeNode * pNode,const QString &szMsgFmt,...) +void KviKvsRunTimeContext::warning(KviKvsTreeNode * pNode,QString szMsgFmt,...) { kvi_va_list va; - kvi_va_start_by_reference(va,szMsgFmt); + kvi_va_start(va,szMsgFmt); report(false,pNode,szMsgFmt,va); kvi_va_end(va); } -void KviKvsRunTimeContext::error(const QString &szMsgFmt,...) +void KviKvsRunTimeContext::error(QString szMsgFmt,...) { m_bError = true; kvi_va_list va; - kvi_va_start_by_reference(va,szMsgFmt); + kvi_va_start(va,szMsgFmt); report(true,m_pDefaultReportLocation,szMsgFmt,va); kvi_va_end(va); } -void KviKvsRunTimeContext::warning(const QString &szMsgFmt,...) +void KviKvsRunTimeContext::warning(QString szMsgFmt,...) { kvi_va_list va; - kvi_va_start_by_reference(va,szMsgFmt); + kvi_va_start(va,szMsgFmt); report(false,m_pDefaultReportLocation,szMsgFmt,va); kvi_va_end(va); } diff --git a/src/kvirc/kvs/KviKvsRunTimeContext.h b/src/kvirc/kvs/KviKvsRunTimeContext.h index 720117353..a70643be4 100644 --- a/src/kvirc/kvs/KviKvsRunTimeContext.h +++ b/src/kvirc/kvs/KviKvsRunTimeContext.h @@ -199,10 +199,10 @@ public: // was error(...) ever called ? bool error() const { return m_bError; }; - void error(KviKvsTreeNode * pNode,const QString &szMsgFmt,...); - void warning(KviKvsTreeNode * pNode,const QString &szMsgFmt,...); - void error(const QString &szMsgFmt,...); - void warning(const QString &szMsgFmt,...); + void error(KviKvsTreeNode * pNode,QString szMsgFmt,...); + void warning(KviKvsTreeNode * pNode,QString szMsgFmt,...); + void error(QString szMsgFmt,...); + void warning(QString szMsgFmt,...); void setDefaultReportLocation(KviKvsTreeNode * pNode); bool errorNoIrcContext(); bool warningNoIrcConnection(); diff --git a/src/kvirc/kvs/parser/KviKvsParser.cpp b/src/kvirc/kvs/parser/KviKvsParser.cpp index 824130415..cfc152897 100644 --- a/src/kvirc/kvs/parser/KviKvsParser.cpp +++ b/src/kvirc/kvs/parser/KviKvsParser.cpp @@ -113,20 +113,20 @@ void KviKvsParser::errorBadChar(const QChar * pLocation,char cExpected,const cha cExpected,szCommandName); } -void KviKvsParser::error(const QChar * pLocation,const QString &szMsgFmt,...) +void KviKvsParser::error(const QChar * pLocation,QString szMsgFmt,...) { m_bError = true; kvi_va_list va; - kvi_va_start_by_reference(va,szMsgFmt); + kvi_va_start(va,szMsgFmt); report(true,pLocation,szMsgFmt,va); kvi_va_end(va); } -void KviKvsParser::warning(const QChar * pLocation,const QString &szMsgFmt,...) +void KviKvsParser::warning(const QChar * pLocation,QString szMsgFmt,...) { kvi_va_list va; - kvi_va_start_by_reference(va,szMsgFmt); + kvi_va_start(va,szMsgFmt); report(false,pLocation,szMsgFmt,va); kvi_va_end(va); } diff --git a/src/kvirc/kvs/parser/KviKvsParser.h b/src/kvirc/kvs/parser/KviKvsParser.h index f92fa32cb..520d9c3e6 100644 --- a/src/kvirc/kvs/parser/KviKvsParser.h +++ b/src/kvirc/kvs/parser/KviKvsParser.h @@ -87,8 +87,8 @@ private: // parsing helpers // dedicated to parseSpecialCommandFor() : in KviKvsParser_specialCommands.cpp bool skipToEndOfForControlBlock(); // error handlers - void error(const QChar * pLocation,const QString &szMsgFmt,...); - void warning(const QChar * pLocation,const QString &szMsgFmt,...); + void error(const QChar * pLocation,QString szMsgFmt,...); + void warning(const QChar * pLocation,QString szMsgFmt,...); void errorBadChar(const QChar * pLocation,char cExpected,const char * szCommandName); protected: diff --git a/src/kvirc/ui/KviMessageBox.cpp b/src/kvirc/ui/KviMessageBox.cpp index b3d3e5e0e..2d9e93723 100644 --- a/src/kvirc/ui/KviMessageBox.cpp +++ b/src/kvirc/ui/KviMessageBox.cpp @@ -38,10 +38,10 @@ namespace KviMessageBox { - void warning(const QString &fmt,...) + void warning(QString fmt,...) { kvi_va_list list; - kvi_va_start_by_reference(list,fmt); + kvi_va_start(list,fmt); QString s; KviQString::vsprintf(s,fmt,list); kvi_va_end(list); @@ -52,10 +52,10 @@ namespace KviMessageBox #endif } - void information(const QString &fmt,...) + void information(QString fmt,...) { kvi_va_list list; - kvi_va_start_by_reference(list,fmt); + kvi_va_start(list,fmt); QString s; KviQString::vsprintf(s,fmt,list); kvi_va_end(list); @@ -66,10 +66,10 @@ namespace KviMessageBox #endif } - bool yesNo(const QString &caption,const QString &fmt,...) + bool yesNo(const QString &caption,QString fmt,...) { kvi_va_list list; - kvi_va_start_by_reference(list,fmt); + kvi_va_start(list,fmt); QString s; KviQString::vsprintf(s,fmt,list); kvi_va_end(list); diff --git a/src/kvirc/ui/KviMessageBox.h b/src/kvirc/ui/KviMessageBox.h index 0697841aa..523e01e76 100644 --- a/src/kvirc/ui/KviMessageBox.h +++ b/src/kvirc/ui/KviMessageBox.h @@ -46,9 +46,9 @@ class KviMessageBox : public KviTalMessageBox namespace KviMessageBox { - KVIRC_API void warning(const QString &fmt,...); - KVIRC_API void information(const QString &fmt,...); - KVIRC_API bool yesNo(const QString &caption,const QString &fmt,...); + KVIRC_API void warning(QString fmt,...); + KVIRC_API void information(QString fmt,...); + KVIRC_API bool yesNo(const QString &caption,QString fmt,...); } #endif //!_KVI_MSGBOX_H_ diff --git a/src/kvirc/ui/KviWindow.cpp b/src/kvirc/ui/KviWindow.cpp index 023335f21..306b63dce 100644 --- a/src/kvirc/ui/KviWindow.cpp +++ b/src/kvirc/ui/KviWindow.cpp @@ -1266,10 +1266,10 @@ void KviWindow::output(int iMsgType, const char * pcFormat, ...) internalOutput(m_pIrcView,iMsgType,(kvi_wchar_t *)pC); } -void KviWindow::output(int iMsgType, const QString & szFmt, ...) +void KviWindow::output(int iMsgType, QString szFmt, ...) { kvi_va_list l; - kvi_va_start_by_reference(l,szFmt); + kvi_va_start(l,szFmt); QString szBuf; KviQString::vsprintf(szBuf,szFmt,l); kvi_va_end(l); @@ -1310,10 +1310,10 @@ void KviWindow::output(int iMsgType, const QDateTime& datetime, const char * pcF internalOutput(m_pIrcView,iMsgType,(kvi_wchar_t *)pC,0,datetime); } -void KviWindow::output(int iMsgType, const QDateTime& datetime, const QString & szFmt, ...) +void KviWindow::output(int iMsgType, const QDateTime& datetime, QString szFmt, ...) { kvi_va_list l; - kvi_va_start_by_reference(l,szFmt); + kvi_va_start(l,szFmt); QString szBuf; KviQString::vsprintf(szBuf,szFmt,l); kvi_va_end(l); diff --git a/src/kvirc/ui/KviWindow.h b/src/kvirc/ui/KviWindow.h index dcdc4a281..deefb1d0c 100644 --- a/src/kvirc/ui/KviWindow.h +++ b/src/kvirc/ui/KviWindow.h @@ -377,10 +377,10 @@ public: // You *might* want to override these too.. but better don't touch them :D virtual void output(int iMsgType, const char * pcFormat, ...); virtual void output(int iMsgType, const kvi_wchar_t * pwFormat, ...); - virtual void output(int iMsgType, const QString & szFmt, ...); + virtual void output(int iMsgType, QString szFmt, ...); void output(int iMsgType, const QDateTime& datetime, const char * pcFormat, ...); void output(int iMsgType, const QDateTime& datetime, const kvi_wchar_t * pwFormat, ...); - void output(int iMsgType, const QDateTime& datetime, const QString & szFmt, ...); + void output(int iMsgType, const QDateTime& datetime, QString szFmt, ...); virtual void outputNoFmt(int iMsgType, const char * pcText, int iFlags = 0, const QDateTime& datetime = QDateTime()); virtual void outputNoFmt(int iMsgType, const kvi_wchar_t * pwText, int iFlags = 0, const QDateTime& datetime = QDateTime()){ internalOutput(m_pIrcView,iMsgType,pwText,iFlags,datetime); }; virtual void outputNoFmt(int iMsgType, const QString & szText, int iFlags = 0, const QDateTime& datetime = QDateTime()); // <-- iFlags are KviIrcView::AppendTextFlags |
