From f7ffe9dbdeb2bebb4c9155fc391f0bab198bfb51 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 27 Sep 2021 14:47:52 +0900 Subject: [PATCH] Introduce `RBIMPL_NONNULL_ARG` macro Runtime assertion for the argument declared as non-null. This macro does nothing if `RBIMPL_ATTR_NONNULL` is effective, otherwise asserts that the argument is non-null. --- enumerator.c | 8 +++----- gc.c | 9 +-------- include/ruby/internal/attr/nonnull.h | 2 ++ 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/enumerator.c b/enumerator.c index f359ab7bad..be469ee38b 100644 --- a/enumerator.c +++ b/enumerator.c @@ -3446,11 +3446,9 @@ rb_arithmetic_sequence_extract(VALUE obj, rb_arithmetic_sequence_components_t *c VALUE rb_arithmetic_sequence_beg_len_step(VALUE obj, long *begp, long *lenp, long *stepp, long len, int err) { -#if !RBIMPL_HAS_ATTRIBUTE(nonnull) - RUBY_ASSERT(begp != NULL); - RUBY_ASSERT(lenp != NULL); - RUBY_ASSERT(stepp != NULL); -#endif + RBIMPL_NONNULL_ARG(begp); + RBIMPL_NONNULL_ARG(lenp); + RBIMPL_NONNULL_ARG(stepp); rb_arithmetic_sequence_components_t aseq; if (!rb_arithmetic_sequence_extract(obj, &aseq)) { diff --git a/gc.c b/gc.c index 40c035fcd2..cdee81dd05 100644 --- a/gc.c +++ b/gc.c @@ -2767,21 +2767,14 @@ rb_data_object_zalloc(VALUE klass, size_t size, RUBY_DATA_FUNC dmark, RUBY_DATA_ return obj; } -COMPILER_WARNING_PUSH -#if __has_warning("-Wnonnull-compare") || GCC_VERSION_SINCE(6, 1, 0) -COMPILER_WARNING_IGNORED(-Wnonnull-compare) -#endif - VALUE rb_data_typed_object_wrap(VALUE klass, void *datap, const rb_data_type_t *type) { - RUBY_ASSERT_ALWAYS(type); + RBIMPL_NONNULL_ARG(type); if (klass) rb_data_object_check(klass); return newobj_of(klass, T_DATA, (VALUE)type, (VALUE)1, (VALUE)datap, type->flags & RUBY_FL_WB_PROTECTED, sizeof(RVALUE)); } -COMPILER_WARNING_POP - VALUE rb_data_typed_object_zalloc(VALUE klass, size_t size, const rb_data_type_t *type) { diff --git a/include/ruby/internal/attr/nonnull.h b/include/ruby/internal/attr/nonnull.h index 874f4236c0..778d5be208 100644 --- a/include/ruby/internal/attr/nonnull.h +++ b/include/ruby/internal/attr/nonnull.h @@ -25,8 +25,10 @@ /** Wraps (or simulates) `__attribute__((nonnull))` */ #if RBIMPL_HAS_ATTRIBUTE(nonnull) # define RBIMPL_ATTR_NONNULL(list) __attribute__((__nonnull__ list)) +# define RBIMPL_NONNULL_ARG(arg) RBIMPL_ASSERT_NOTHING #else # define RBIMPL_ATTR_NONNULL(list) /* void */ +# define RBIMPL_NONNULL_ARG(arg) RUBY_ASSERT(arg) #endif #endif /* RBIMPL_ATTR_NONNULL_H */