diff options
Diffstat (limited to 'base/port.h')
-rw-r--r-- | base/port.h | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/base/port.h b/base/port.h index 12b2a90..885e526 100644 --- a/base/port.h +++ b/base/port.h @@ -27,9 +27,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#ifndef BASE_PORT_H__ -#define BASE_PORT_H__ +#ifndef BASE_PORT_H_ +#define BASE_PORT_H_ +#include <stdarg.h> #include "build/build_config.h" #ifdef COMPILER_MSVC @@ -56,4 +57,22 @@ #define GG_UINT32_C(x) (x ## U) #define GG_UINT64_C(x) GG_ULONGLONG(x) -#endif // BASE_PORT_H__ +namespace base { + +// It's possible for functions that use a va_list, such as StringPrintf, to +// invalidate the data in it upon use. The fix is to make a copy of the +// structure before using it and use that copy instead. va_copy is provided +// for this purpose. MSVC does not provide va_copy, so define an +// implementation here. It is not guaranteed that assignment is a copy, so the +// StringUtil.VariableArgsFunc unit test tests this capability. +inline void va_copy(va_list& a, va_list& b) { +#if defined(COMPILER_GCC) + ::va_copy(a, b); +#elif defined(COMPILER_MSVC) + a = b; +#endif +} + +} // namespace base + +#endif // BASE_PORT_H_ |