Skip to content

Commit 779c18b

Browse files
committed
va_copy is a C99ism
Should provide appropriate fallback implementation. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62220 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent bb6c0f0 commit 779c18b

File tree

6 files changed

+73
-4
lines changed

6 files changed

+73
-4
lines changed

aclocal.m4

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ m4_include([tool/m4/ruby_check_setjmp.m4])
2525
m4_include([tool/m4/ruby_check_signedness.m4])
2626
m4_include([tool/m4/ruby_check_sizeof.m4])
2727
m4_include([tool/m4/ruby_check_sysconf.m4])
28+
m4_include([tool/m4/ruby_check_va_copy.m4])
2829
m4_include([tool/m4/ruby_cppoutfile.m4])
2930
m4_include([tool/m4/ruby_decl_attribute.m4])
3031
m4_include([tool/m4/ruby_default_arch.m4])

configure.ac

+20
Original file line numberDiff line numberDiff line change
@@ -1244,6 +1244,26 @@ AS_IF([test "$rb_cv_va_args_macro" = yes], [
12441244
AC_DEFINE(HAVE_VA_ARGS_MACRO)
12451245
])
12461246

1247+
AC_CACHE_CHECK([appropriate way to simulate va_copy], rb_cv_va_copy, [dnl
1248+
RUBY_CHECK_VA_COPY([va_copy], [va_copy((dst),(src))])
1249+
RUBY_CHECK_VA_COPY([VA_COPY macro], [VA_COPY((dst),(src))])
1250+
RUBY_CHECK_VA_COPY([__va_copy], [__va_copy((dst),(src))])
1251+
RUBY_CHECK_VA_COPY([__builtin_va_copy], [__builtin_va_copy((dst),(src))])
1252+
RUBY_CHECK_VA_COPY([va_copy via struct assignment],
1253+
[do (dst) = (src); while (0)])
1254+
RUBY_CHECK_VA_COPY([va_copy via pointer assignment],
1255+
[do *(dst) = *(src); while (0)])
1256+
RUBY_CHECK_VA_COPY([va_copy via memcpy],
1257+
[memcpy(&(dst), &(src), sizeof(va_list))])
1258+
])
1259+
if test "x$rb_cv_va_copy" = x; then
1260+
AC_ERROR([no way to simulate va_copy])
1261+
else
1262+
m4_pushdef([macro], AS_TR_CPP(HAVE_$1))
1263+
AC_DEFINE_UNQUOTED(macro($rb_cv_va_copy))
1264+
m4_popdef([macro])
1265+
fi
1266+
12471267
AC_CACHE_CHECK([for alignas() syntax], rb_cv_have_alignas, [
12481268
rb_cv_have_alignas=no
12491269
RUBY_WERROR_FLAG([

internal.h

+19
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,25 @@ extern "C" {
8585
# define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[1 - 2*!(expr)]
8686
#endif
8787

88+
#if defined(HAVE_VA_COPY)
89+
/* OK, nothing to do */
90+
#elif defined(HAVE_VA_COPY_MACRO)
91+
#define va_copy(dst, src) VA_COPY((dst), (src))
92+
#elif defined(HAVE___VA_COPY)
93+
#define va_copy(dst, src) __va_copy((dst), (src))
94+
#elif defined(HAVE___BUILTIN_VA_COPY)
95+
#define va_copy(dst, src) __builtin_va_copy((dst), (src))
96+
#elif defined(HAVE_VA_COPY_VIA_STRUCT_ASSIGNMENT)
97+
#define va_copy(dst, src) do (dst) = (src); while (0)
98+
#elif defined(HAVE_VA_COPY_VIA_POINTER_ASSIGNMENT)
99+
#define va_copy(dst, src) do *(dst) = *(src); while (0)
100+
#elif defined(HAVE_VA_COPY_VIA_MEMCPY)
101+
#include <string.h>
102+
#define va_copy(dst, src) memcpy(&(dst), &(src), sizeof(va_list))
103+
#else
104+
#error >>>> no way to simuate va_copy <<<<
105+
#endif
106+
88107
#define SIGNED_INTEGER_TYPE_P(int_type) (0 > ((int_type)0)-1)
89108
#define SIGNED_INTEGER_MAX(sint_type) \
90109
(sint_type) \

mjit.c

-4
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,6 @@ extern int rb_thread_create_mjit_thread(void (*child_hook)(void), void (*worker_
119119
typedef intptr_t pid_t;
120120
#endif
121121

122-
#ifndef va_copy
123-
#define va_copy(dest, src) ((dest) = (src))
124-
#endif
125-
126122
/* Atomically set function pointer if possible. */
127123
#ifdef _WIN32
128124
# ifdef InterlockedExchangePointer

tool/m4/ruby_check_va_copy.m4

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# -*- Autoconf -*-
2+
m4_define(RUBY_CHECK_VA_COPY, [
3+
if test "x$rb_cv_va_copy" = x; then
4+
AC_TRY_RUN(
5+
[#include <stdlib.h>
6+
#include <stdarg.h>
7+
#include <string.h>
8+
#define CONFTEST_VA_COPY(dst, src) $2
9+
void
10+
conftest(int n, ...)
11+
{
12+
va_list ap, ap2;
13+
int i;
14+
va_start(ap, n);
15+
CONFTEST_VA_COPY(ap2, ap);
16+
for (i = 0; i < n; i++) if ((int)va_arg(ap, int) != n - i - 1) abort();
17+
CONFTEST_VA_COPY(ap, ap2);
18+
for (i = 0; i < n; i++) if ((int)va_arg(ap, int) != n - i - 1) abort();
19+
va_end(ap);
20+
}
21+
int
22+
main()
23+
{
24+
conftest(10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
25+
exit(0);
26+
}],
27+
rb_cv_va_copy=[$1],
28+
rb_cv_va_copy="",
29+
rb_cv_va_copy="")dnl
30+
fi
31+
])dnl
32+
dnl

win32/Makefile.sub

+1
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,7 @@ $(CONFIG_H): $(MKFILES) $(srcdir)/win32/Makefile.sub $(win_srcdir)/Makefile.sub
618618
#define HAVE_PROTOTYPES 1
619619
#define TOKEN_PASTE(x,y) x##y
620620
#define HAVE_STDARG_PROTOTYPES 1
621+
#define HAVE_VA_COPY 1
621622
!if $(MSC_VER) > 1100
622623
#define NORETURN(x) __declspec(noreturn) x
623624
!endif

0 commit comments

Comments
 (0)