summaryrefslogtreecommitdiff
path: root/ruby/src
diff options
context:
space:
mode:
Diffstat (limited to 'ruby/src')
-rw-r--r--ruby/src/IceRuby/Util.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/ruby/src/IceRuby/Util.cpp b/ruby/src/IceRuby/Util.cpp
index b5b070602a4..6afc83d87f3 100644
--- a/ruby/src/IceRuby/Util.cpp
+++ b/ruby/src/IceRuby/Util.cpp
@@ -448,7 +448,11 @@ IceRuby::contextToHash(const Ice::Context& ctx)
extern "C"
VALUE
-IceRuby_Util_hash_foreach_callback(VALUE val, VALUE arg, int, VALUE [])
+#ifdef RUBY_BLOCK_CALL_FUNC_TAKES_BLOCKARG // Defined Ruby >= 2.1
+IceRuby_Util_hash_foreach_callback(VALUE val, VALUE arg, int, const VALUE*, VALUE)
+#else
+IceRuby_Util_hash_foreach_callback(VALUE val, VALUE arg, int, VALUE*)
+#endif
{
VALUE key = rb_ary_entry(val, 0);
VALUE value = rb_ary_entry(val, 1);
@@ -465,13 +469,25 @@ IceRuby_Util_hash_foreach_callback(VALUE val, VALUE arg, int, VALUE [])
return val;
}
+extern "C"
+{
+
+// Defined Ruby >= 2.1. Ruby 2.7 enables RB_BLOCK_CALL_FUNC_STRICT by default
+#ifdef RB_BLOCK_CALL_FUNC_STRICT
+ typedef rb_block_call_func_t ICE_RUBY_HASH_FOREACH_CALLBACK;
+#else
+ typedef VALUE (*ICE_RUBY_HASH_FOREACH_CALLBACK)(...);
+#endif
+
+}
+
void
IceRuby::hashIterate(VALUE h, HashIterator& iter)
{
assert(TYPE(h) == T_HASH);
callRuby(::rb_block_call, h, rb_intern("each"), 0, static_cast<VALUE*>(0),
- reinterpret_cast<rb_block_call_func_t>(IceRuby_Util_hash_foreach_callback),
+ reinterpret_cast<ICE_RUBY_HASH_FOREACH_CALLBACK>(IceRuby_Util_hash_foreach_callback),
reinterpret_cast<VALUE>(&iter));
}