[前][次][番号順一覧][スレッド一覧]

ruby-changes:58221

From: Nobuyoshi <ko1@a...>
Date: Sat, 12 Oct 2019 17:51:01 +0900 (JST)
Subject: [ruby-changes:58221] 710bc00379 (master): Moved RB_METHOD_DEFINITION_DECL to intern.h

https://git.ruby-lang.org/ruby.git/commit/?id=710bc00379

From 710bc003791b90adf3970e137c69f283c88234cd Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@r...>
Date: Sat, 12 Oct 2019 17:21:05 +0900
Subject: Moved RB_METHOD_DEFINITION_DECL to intern.h

This macro is used here before defined in ruby.h.

diff --git a/ext/-test-/cxxanyargs/cxxanyargs.cpp b/ext/-test-/cxxanyargs/cxxanyargs.cpp
index 9a1fb02..efe35fa 100644
--- a/ext/-test-/cxxanyargs/cxxanyargs.cpp
+++ b/ext/-test-/cxxanyargs/cxxanyargs.cpp
@@ -387,6 +387,206 @@ namespace test_rb_define_method { https://github.com/ruby/ruby/blob/trunk/ext/-test-/cxxanyargs/cxxanyargs.cpp#L387
     }
 }
 
+namespace test_rb_define_module_function {
+    static VALUE
+    m1(VALUE, VALUE)
+    {
+        return Qnil;
+    }
+
+    static VALUE
+    m2(VALUE, VALUE, VALUE)
+    {
+        return Qnil;
+    }
+
+    static VALUE
+    ma(VALUE, VALUE)
+    {
+        return Qnil;
+    }
+
+    static VALUE
+    mv(int, VALUE*, VALUE)
+    {
+        return Qnil;
+    }
+
+    VALUE
+    test(VALUE self)
+    {
+        // No cast
+        rb_define_module_function(self, "m1", m1, 1);
+        rb_define_module_function(self, "m2", m2, 2);
+        rb_define_module_function(self, "ma", ma, -2);
+        rb_define_module_function(self, "mv", mv, -1);
+
+        // Cast by RUBY_METHOD_FUNC
+        rb_define_module_function(self, "m1", RUBY_METHOD_FUNC(m1), 1);
+        rb_define_module_function(self, "m2", RUBY_METHOD_FUNC(m2), 2);
+        rb_define_module_function(self, "ma", RUBY_METHOD_FUNC(ma), -2);
+        rb_define_module_function(self, "mv", RUBY_METHOD_FUNC(mv), -1);
+
+        // Explicit cast instead of RUBY_METHOD_FUNC
+        rb_define_module_function(self, "m1", (VALUE (*)(...))(m1), 1);
+        rb_define_module_function(self, "m2", (VALUE (*)(...))(m2), 2);
+        rb_define_module_function(self, "ma", (VALUE (*)(...))(ma), -2);
+        rb_define_module_function(self, "mv", (VALUE (*)(...))(mv), -1);
+
+        return self;
+    }
+}
+
+namespace test_rb_define_singleton_method {
+    static VALUE
+    m1(VALUE, VALUE)
+    {
+        return Qnil;
+    }
+
+    static VALUE
+    m2(VALUE, VALUE, VALUE)
+    {
+        return Qnil;
+    }
+
+    static VALUE
+    ma(VALUE, VALUE)
+    {
+        return Qnil;
+    }
+
+    static VALUE
+    mv(int, VALUE*, VALUE)
+    {
+        return Qnil;
+    }
+
+    VALUE
+    test(VALUE self)
+    {
+        // No cast
+        rb_define_singleton_method(self, "m1", m1, 1);
+        rb_define_singleton_method(self, "m2", m2, 2);
+        rb_define_singleton_method(self, "ma", ma, -2);
+        rb_define_singleton_method(self, "mv", mv, -1);
+
+        // Cast by RUBY_METHOD_FUNC
+        rb_define_singleton_method(self, "m1", RUBY_METHOD_FUNC(m1), 1);
+        rb_define_singleton_method(self, "m2", RUBY_METHOD_FUNC(m2), 2);
+        rb_define_singleton_method(self, "ma", RUBY_METHOD_FUNC(ma), -2);
+        rb_define_singleton_method(self, "mv", RUBY_METHOD_FUNC(mv), -1);
+
+        // Explicit cast instead of RUBY_METHOD_FUNC
+        rb_define_singleton_method(self, "m1", (VALUE (*)(...))(m1), 1);
+        rb_define_singleton_method(self, "m2", (VALUE (*)(...))(m2), 2);
+        rb_define_singleton_method(self, "ma", (VALUE (*)(...))(ma), -2);
+        rb_define_singleton_method(self, "mv", (VALUE (*)(...))(mv), -1);
+
+        return self;
+    }
+}
+
+namespace test_rb_define_protected_method {
+    static VALUE
+    m1(VALUE, VALUE)
+    {
+        return Qnil;
+    }
+
+    static VALUE
+    m2(VALUE, VALUE, VALUE)
+    {
+        return Qnil;
+    }
+
+    static VALUE
+    ma(VALUE, VALUE)
+    {
+        return Qnil;
+    }
+
+    static VALUE
+    mv(int, VALUE*, VALUE)
+    {
+        return Qnil;
+    }
+
+    VALUE
+    test(VALUE self)
+    {
+        // No cast
+        rb_define_protected_method(self, "m1", m1, 1);
+        rb_define_protected_method(self, "m2", m2, 2);
+        rb_define_protected_method(self, "ma", ma, -2);
+        rb_define_protected_method(self, "mv", mv, -1);
+
+        // Cast by RUBY_METHOD_FUNC
+        rb_define_protected_method(self, "m1", RUBY_METHOD_FUNC(m1), 1);
+        rb_define_protected_method(self, "m2", RUBY_METHOD_FUNC(m2), 2);
+        rb_define_protected_method(self, "ma", RUBY_METHOD_FUNC(ma), -2);
+        rb_define_protected_method(self, "mv", RUBY_METHOD_FUNC(mv), -1);
+
+        // Explicit cast instead of RUBY_METHOD_FUNC
+        rb_define_protected_method(self, "m1", (VALUE (*)(...))(m1), 1);
+        rb_define_protected_method(self, "m2", (VALUE (*)(...))(m2), 2);
+        rb_define_protected_method(self, "ma", (VALUE (*)(...))(ma), -2);
+        rb_define_protected_method(self, "mv", (VALUE (*)(...))(mv), -1);
+
+        return self;
+    }
+}
+
+namespace test_rb_define_private_method {
+    static VALUE
+    m1(VALUE, VALUE)
+    {
+        return Qnil;
+    }
+
+    static VALUE
+    m2(VALUE, VALUE, VALUE)
+    {
+        return Qnil;
+    }
+
+    static VALUE
+    ma(VALUE, VALUE)
+    {
+        return Qnil;
+    }
+
+    static VALUE
+    mv(int, VALUE*, VALUE)
+    {
+        return Qnil;
+    }
+
+    VALUE
+    test(VALUE self)
+    {
+        // No cast
+        rb_define_private_method(self, "m1", m1, 1);
+        rb_define_private_method(self, "m2", m2, 2);
+        rb_define_private_method(self, "ma", ma, -2);
+        rb_define_private_method(self, "mv", mv, -1);
+
+        // Cast by RUBY_METHOD_FUNC
+        rb_define_private_method(self, "m1", RUBY_METHOD_FUNC(m1), 1);
+        rb_define_private_method(self, "m2", RUBY_METHOD_FUNC(m2), 2);
+        rb_define_private_method(self, "ma", RUBY_METHOD_FUNC(ma), -2);
+        rb_define_private_method(self, "mv", RUBY_METHOD_FUNC(mv), -1);
+
+        // Explicit cast instead of RUBY_METHOD_FUNC
+        rb_define_private_method(self, "m1", (VALUE (*)(...))(m1), 1);
+        rb_define_private_method(self, "m2", (VALUE (*)(...))(m2), 2);
+        rb_define_private_method(self, "ma", (VALUE (*)(...))(ma), -2);
+        rb_define_private_method(self, "mv", (VALUE (*)(...))(mv), -1);
+
+        return self;
+    }
+}
+
 extern "C" void
 Init_cxxanyargs(void)
 {
@@ -412,4 +612,8 @@ Init_cxxanyargs(void) https://github.com/ruby/ruby/blob/trunk/ext/-test-/cxxanyargs/cxxanyargs.cpp#L612
     test(rb_hash_foreach);
     test(rb_ivar_foreach);
     test(rb_define_method);
+    test(rb_define_module_function);
+    test(rb_define_singleton_method);
+    test(rb_define_protected_method);
+    test(rb_define_private_method);
 }
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index d6b0a05..b6e9cd9 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -1023,6 +1023,89 @@ RUBY_SYMBOL_EXPORT_END https://github.com/ruby/ruby/blob/trunk/include/ruby/intern.h#L1023
 { /* satisfy cc-mode */
 #endif
 }  /* extern "C" { */
+extern "C++" {
+#endif
+
+#if defined(HAVE_BUILTIN___BUILTIN_TYPES_COMPATIBLE_P)
+# define rb_f_notimplement_p(f) __builtin_types_compatible_p(__typeof__(f),__typeof__(rb_f_notimplement))
+#else
+# define rb_f_notimplement_p(f) 0
+#endif
+
+#if defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P) && !defined(_WIN32) && !defined(__CYGWIN__)
+#if defined(__has_attribute) && __has_attribute(transparent_union) && __has_attribute(unused) && __has_attribute(weakref) && __has_attribute(nonnull)
+#define RB_METHOD_DEFINITION_DECL_C(def,nonnull,defname,decl,vars,funcargs) \
+    __attribute__((__unused__,__weakref__(#def),__nonnull__ nonnull))static void defname(RB_UNWRAP_MACRO decl,VALUE(*func)funcargs,int arity);
+#endif
+#endif
+
+#if defined(RB_METHOD_DEFINITION_DECL_C) || defined(__cplusplus)
+#ifndef RB_METHOD_DEFINITION_DECL_C
+#define RB_METHOD_DEFINITION_DECL_C(def,nonnull,defname,decl,vars,funcargs) \
+    static inline void defname(RB_UNWRAP_MACRO decl,VALUE(*func)funcargs,int arity) \
+    { \
+        def(RB_UNWRAP_MACRO vars,(VALUE(*)(ANYARGS))(func),arity); \
+    }
+#endif
+
+#define RB_UNWRAP_MACRO(...) __VA_ARGS__
+
+#ifdef __cplusplus
+#define RB_METHOD_DEFINITION_DECL_CXX_BEGIN(def) template <int Arity> struct def##_tmpl {};
+#define RB_METHOD_DEFINITION_DECL_CXX(def,defname,decl,vars,funcargs,arity) \
+    template <> struct def##_tmpl<arity> { \
+        static void define(RB_UNWRAP_MACRO decl, VALUE (*func)funcargs) {::defname(RB_UNWRAP_MACRO vars, func, arity);} \
+        static void define(RB_UNWRAP_MACRO decl, VALUE (*func)(...)) {::defname(RB_UNWRAP_MACRO vars, reinterpret_cast<VALUE(*)funcargs>(func), arity);} \
+    };
+#else
+#define RB_METHOD_DEFINITION_DECL_CXX_BEGIN(def) /* nothing */
+#define RB_METHOD_DEFINITION_DECL_CXX(def,defname,decl,vars,funcargs,arity) /* nothing */
+#endif
+#define RB_METHOD_DEFINITION_DECL_1(def,nonnull,defname,arity,decl,vars,funcargs) \
+    RB_METHOD_DEFINITION_DECL_C(def,nonnull,defname,decl,vars,funcargs) \
+    RB_METHOD_DEFINITION_DECL_CXX(def,defname,decl,vars,funcargs,arity)
+
+#define RB_METHOD_DEFINITION_DECL(def,nonnull,decl,vars) \
+RB_METHOD_DEFINITION_DECL_CXX_BEGIN(def) \
+RB_METHOD_DEFINITION_DECL_1(def,nonnull,def##0 ,0 ,decl,vars,(VALUE)) \
+RB_METHOD_DEFINITION_DECL_1(def,nonnull,def##1 ,1 ,decl,vars,(VALUE,VALUE)) \
+RB_METHOD_DEFINITION_DECL_1(def,nonnull,def##2 ,2 ,decl,vars,(VALUE,VALUE,VALUE)) \
+RB_METHOD_DEFINITION_DECL_1(def,nonnull,def##3 ,3 ,decl,vars,(VALUE,VALUE,VALUE,VALUE)) \
+RB_METHOD_DEFINITION_DECL_1(def,nonnull,def##4 ,4 ,decl,vars,(VALUE,VALUE,VALUE,VALUE,VALUE)) \
+RB_METHOD_DEFINITION_DECL_1(def,nonnull,def##5 ,5 ,decl,vars,(VALUE,VALUE,VALUE,VALUE,VALUE,VALUE)) \
+RB_METHOD_DEFINITION_DECL_1(def,nonnull,def##6 ,6 ,decl,vars,(VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE)) \
+RB_METHOD_DEFINITION_DECL_1(def,nonnull,def##7 ,7 ,decl,vars,(VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE)) \
+RB_METHOD_DEFINITION_DECL_1(def,nonnull,def##8 ,8 ,decl,vars,(VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE)) \
+RB_METHOD_DEFINITION_DECL_1(def,nonnull,def##9 ,9 ,decl,vars,(VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,V (... truncated)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]