From 2a6457b5b7d67378528235cee7b9cb93fed00204 Mon Sep 17 00:00:00 2001 From: "Urabe, Shyouhei" Date: Thu, 11 Oct 2018 11:47:49 +0900 Subject: add rb_funcallv_with_cc() Why not cache the method entry at each caller site. The void** is in fact a method entry, but this struct is hidden from ruby.h so intentionally left opaque. --- include/ruby/ruby.h | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'include/ruby/ruby.h') diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index 53d4eabc0a..67ef3f4df2 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -1892,6 +1892,10 @@ VALUE rb_funcallv_public(VALUE, ID, int, const VALUE*); #define rb_funcall3 rb_funcallv_public VALUE rb_funcall_passing_block(VALUE, ID, int, const VALUE*); VALUE rb_funcall_with_block(VALUE, ID, int, const VALUE*, VALUE); +#if GCC_VERSION_SINCE(3, 3, 0) +__attribute__((__nonnull__ (1))) /* TODO: should check using configure */ +#endif +VALUE rb_funcallv_with_cc(void**, VALUE, ID, int, const VALUE*); int rb_scan_args(int, const VALUE*, const char*, ...); VALUE rb_call_super(int, const VALUE*); VALUE rb_current_receiver(void); @@ -2607,10 +2611,19 @@ __extension__({ \ const VALUE rb_funcall_args[] = {__VA_ARGS__}; \ const int rb_funcall_nargs = \ (int)(sizeof(rb_funcall_args) / sizeof(VALUE)); \ - rb_funcallv(recv, mid, \ + static void *rb_funcall_opaque_cc = NULL; \ + rb_funcallv_with_cc(&rb_funcall_opaque_cc, \ + recv, mid, \ rb_varargs_argc_check(rb_funcall_argc, rb_funcall_nargs), \ rb_funcall_nargs ? rb_funcall_args : NULL); \ }) + +# define rb_funcallv(recv, mid, argc, argv) \ +__extension__({ \ + static void *rb_funcallv_opaque_cc = NULL; \ + rb_funcallv_with_cc(&rb_funcallv_opaque_cc, \ + recv, mid, argc,argv); \ + }) #endif #ifndef RUBY_DONT_SUBST -- cgit v1.2.3