summaryrefslogtreecommitdiffstats
path: root/base/port.h
diff options
context:
space:
mode:
Diffstat (limited to 'base/port.h')
-rw-r--r--base/port.h25
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_