aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-10-29 12:12:07 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-10-29 16:38:15 +0900
commitad4da86669454dee86844b3e0a3ecf9177084db3 (patch)
tree466fc690489c37fe46c1a579848a9c00f4d8db74
parent9195ed18cacb0d448c818d2a80db105d8b3cea3c (diff)
downloadruby-ad4da86669454dee86844b3e0a3ecf9177084db3.tar.gz
Check for nonnull attribute in configure
-rw-r--r--configure.ac5
-rw-r--r--include/ruby/defines.h3
-rw-r--r--internal.h8
3 files changed, 12 insertions, 4 deletions
diff --git a/configure.ac b/configure.ac
index 653f3bb651..67ce5f99d2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1495,6 +1495,11 @@ done
AS_IF([test "$rb_cv_func_exported" != no], [
AC_DEFINE_UNQUOTED(RUBY_FUNC_EXPORTED, [$rb_cv_func_exported extern])
])
+RUBY_DECL_ATTRIBUTE([__nonnull__(n)], [RUBY_FUNC_NONNULL(n,x)], [rb_cv_func_nonnull],
+ [], [function], [
+@%:@define x int conftest_attribute_check(void *p)
+@%:@define n 1
+])
RUBY_APPEND_OPTION(XCFLAGS, -DRUBY_EXPORT)
diff --git a/include/ruby/defines.h b/include/ruby/defines.h
index 0d95209b02..8603ade340 100644
--- a/include/ruby/defines.h
+++ b/include/ruby/defines.h
@@ -464,6 +464,9 @@ void rb_sparc_flush_register_windows(void);
#define RUBY_ALIAS_FUNCTION(prot, name, args) \
RUBY_ALIAS_FUNCTION_TYPE(VALUE, prot, name, args)
#endif
+#ifndef RUBY_FUNC_NONNULL
+#define RUBY_FUNC_NONNULL(n, x) x
+#endif
#ifndef UNALIGNED_WORD_ACCESS
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
diff --git a/internal.h b/internal.h
index c296a99b6e..5b9b9b62bc 100644
--- a/internal.h
+++ b/internal.h
@@ -2387,16 +2387,16 @@ struct rb_call_data {
struct rb_call_cache cc;
struct rb_call_info ci;
};
-VALUE rb_funcallv_with_cc(struct rb_call_data*, VALUE, ID, int, const VALUE*)
-#if (defined(__clang__) || GCC_VERSION_SINCE(3, 3, 0)) && defined(__OPTIMIZE__)
-__attribute__((__visibility__("default"), __nonnull__(1)))
+RUBY_FUNC_EXPORTED
+RUBY_FUNC_NONNULL(1, VALUE rb_funcallv_with_cc(struct rb_call_data*, VALUE, ID, int, const VALUE*));
+
+#ifdef __GNUC__
# define rb_funcallv(recv, mid, argc, argv) \
__extension__({ \
static struct rb_call_data rb_funcallv_data = { { 0, }, { 0, }, }; \
rb_funcallv_with_cc(&rb_funcallv_data, recv, mid, argc, argv); \
})
#endif
- ;
/* miniprelude.c, prelude.c */
void Init_prelude(void);