aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Alexey Sokolov2015-08-15 11:16:14 +0100
committerGravatar Alexey Sokolov2015-08-15 11:56:48 +0100
commitb3a3533931e2355d34c5a76e86eb2506dd66b64a (patch)
treecf5aab80fb19133b17939ceb3ce127ebc2e8ddff /src
parentMerge pull request #1507 from SolarAquarion/patch-1 (diff)
downloadKVIrc-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.cpp4
-rw-r--r--src/kvilib/core/KviQString.h2
-rw-r--r--src/kvilib/system/kvi_stdarg.h29
-rw-r--r--src/kvirc/kvs/KviKvsRunTimeCall.cpp8
-rw-r--r--src/kvirc/kvs/KviKvsRunTimeCall.h4
-rw-r--r--src/kvirc/kvs/KviKvsRunTimeContext.cpp16
-rw-r--r--src/kvirc/kvs/KviKvsRunTimeContext.h8
-rw-r--r--src/kvirc/kvs/parser/KviKvsParser.cpp8
-rw-r--r--src/kvirc/kvs/parser/KviKvsParser.h4
-rw-r--r--src/kvirc/ui/KviMessageBox.cpp12
-rw-r--r--src/kvirc/ui/KviMessageBox.h6
-rw-r--r--src/kvirc/ui/KviWindow.cpp8
-rw-r--r--src/kvirc/ui/KviWindow.h4
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