Files
Luke Gruber 4eed7d64ea Don't call Ruby code in rb_method_definition_eq
During method aliasing, we check if the methods `a` and `b` are equal
before aliasing. If they are equal, we don't need to alias. That check
was running Ruby code with the VM lock held when the first method was a
bmethod, which is not good and can cause incorrect behavior. Now, we call
`rb_proc_eq` directly. This means an override of `Proc#==` will not be
called to check if 2 methods are equal and will instead use the definition
of Proc equality at VM startup. `Method#==` and `UnboundMethod==` will
also not call into `Proc#==` now for bmethods. This is probably better behavior
even without the VM lock fix because `Method#hash` never called `Proc#hash` when
the method was a bmethod, it used `rb_hash_proc` directly.

Fixes [Bug #22398]
2026-10-02 09:35:13 -04:00

35 lines
1.5 KiB
C

#ifndef INTERNAL_PROC_H /*-*-C-*-vi:se ft=c:*/
#define INTERNAL_PROC_H
/**
* @author Ruby developers <ruby-core@ruby-lang.org>
* @copyright This file is a part of the programming language Ruby.
* Permission is hereby granted, to either redistribute and/or
* modify this file, provided that the conditions mentioned in the
* file COPYING are met. Consult the file for details.
* @brief Internal header for Proc.
*/
#include "ruby/ruby.h" /* for rb_block_call_func_t */
#include "ruby/st.h" /* for st_index_t */
struct rb_block; /* in vm_core.h */
struct rb_code_location_struct; /* in rubyparser.h */
struct rb_iseq_struct; /* in vm_core.h */
/* proc.c */
VALUE rb_proc_location(VALUE self);
st_index_t rb_hash_proc(st_index_t hash, VALUE proc);
VALUE rb_proc_eq(VALUE self, VALUE other);
int rb_block_pair_yield_optimizable(void);
int rb_block_arity(void);
int rb_block_min_max_arity(int *max);
VALUE rb_block_to_s(VALUE self, const struct rb_block *block, const char *additional_info);
VALUE rb_callable_receiver(VALUE);
VALUE rb_source_range_new(VALUE path, VALUE absolute_path,
const struct rb_code_location_struct *location);
VALUE rb_func_proc_dup(VALUE src_obj);
VALUE rb_func_lambda_new(rb_block_call_func_t func, VALUE val, int min_argc, int max_argc);
VALUE rb_iseq_location(const struct rb_iseq_struct *iseq);
VALUE rb_sym_to_proc(VALUE sym);
#endif /* INTERNAL_PROC_H */