summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2024-10-10 11:29:57 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2024-10-10 11:29:57 +0900
commit6f6735898aefd73089247c625ce221350afb39b6 (patch)
tree45eaba6d7f12064ddaace6f310d90632530b0e5b
parent133bacc0dcf4261ac3ebe0de5f367c88a51ce2f0 (diff)
Cast via `uintptr_t` function pointer between object pointer
-rw-r--r--ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c7
-rw-r--r--vm_insnhelper.c6
2 files changed, 8 insertions, 5 deletions
diff --git a/ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c b/ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c
index a856319cfb..6cc07cc1f8 100644
--- a/ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c
+++ b/ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c
@@ -5,6 +5,7 @@ typedef VALUE(*target_func)(VALUE);
static target_func rst_any_method;
+#define resolve_func(file, name) (target_func)(uintptr_t)rb_ext_resolve_symbol(file, name)
VALUE
rsr_any_method(VALUE klass)
{
@@ -15,7 +16,7 @@ VALUE
rsr_try_resolve_fname(VALUE klass)
{
target_func rst_something_missing =
- (target_func) rb_ext_resolve_symbol("-test-/load/resolve_symbol_missing", "rst_any_method");
+ resolve_func("-test-/load/resolve_symbol_missing", "rst_any_method");
if (rst_something_missing == NULL) {
// This should be done in Init_*, so the error is LoadError
rb_raise(rb_eLoadError, "symbol not found: missing fname");
@@ -27,7 +28,7 @@ VALUE
rsr_try_resolve_sname(VALUE klass)
{
target_func rst_something_missing =
- (target_func)rb_ext_resolve_symbol("-test-/load/resolve_symbol_target", "rst_something_missing");
+ resolve_func("-test-/load/resolve_symbol_target", "rst_something_missing");
if (rst_something_missing == NULL) {
// This should be done in Init_*, so the error is LoadError
rb_raise(rb_eLoadError, "symbol not found: missing sname");
@@ -43,7 +44,7 @@ Init_resolve_symbol_resolver(void)
* If the module and methods are defined before raising LoadError, retrying `require "this.so"` will
* cause re-defining those methods (and will be warned).
*/
- rst_any_method = (target_func)rb_ext_resolve_symbol("-test-/load/resolve_symbol_target", "rst_any_method");
+ rst_any_method = resolve_func("-test-/load/resolve_symbol_target", "rst_any_method");
if (rst_any_method == NULL) {
rb_raise(rb_eLoadError, "resolve_symbol_target is not loaded");
}
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index d1c4d1ef46..6953322727 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -3023,7 +3023,8 @@ vm_call_single_noarg_leaf_builtin(rb_execution_context_t *ec, rb_control_frame_t
{
const struct rb_builtin_function *bf = calling->cc->aux_.bf;
cfp->sp -= (calling->argc + 1);
- return builtin_invoker0(ec, calling->recv, NULL, (rb_insn_func_t)bf->func_ptr);
+ rb_insn_func_t func_ptr = (rb_insn_func_t)(uintptr_t)bf->func_ptr;
+ return builtin_invoker0(ec, calling->recv, NULL, func_ptr);
}
VALUE rb_gen_method_name(VALUE owner, VALUE name); // in vm_backtrace.c
@@ -7325,7 +7326,8 @@ invoke_bf(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp, const struct
{
const bool canary_p = ISEQ_BODY(reg_cfp->iseq)->builtin_attrs & BUILTIN_ATTR_LEAF; // Verify an assumption of `Primitive.attr! :leaf`
SETUP_CANARY(canary_p);
- VALUE ret = (*lookup_builtin_invoker(bf->argc))(ec, reg_cfp->self, argv, (rb_insn_func_t)bf->func_ptr);
+ rb_insn_func_t func_ptr = (rb_insn_func_t)(uintptr_t)bf->func_ptr;
+ VALUE ret = (*lookup_builtin_invoker(bf->argc))(ec, reg_cfp->self, argv, func_ptr);
CHECK_CANARY(canary_p, BIN(invokebuiltin));
return ret;
}