From ae2dc3f217ba9f181471f39a7e5ce72a28b27c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?= Date: Tue, 27 Aug 2019 11:16:52 +0900 Subject: rb_define_hooked_variable now free from ANYARGS After 5e86b005c0f2ef30df2f9906c7e2f3abefe286a2, I now think ANYARGS is dangerous and should be extinct. This commit uses rb_gvar_getter_t / rb_gvar_setter_t for rb_define_hooked_variable / rb_define_virtual_variable which revealed lots of function prototype inconsistencies. Some of them were literally decades old, going back to dda5dc00cff334cac373096d444a0fd59e716124. --- eval.c | 4 ++-- include/ruby/intern.h | 2 +- include/ruby/ruby.h | 30 ++++++++++++++---------------- io.c | 14 +++++++++++++- load.c | 13 ++++++++++--- process.c | 16 ++++++++++++++-- re.c | 26 ++++++++++++++++---------- ruby.c | 12 +++++------- safe.c | 4 ++-- variable.c | 33 +++++++++++++++++---------------- 10 files changed, 94 insertions(+), 60 deletions(-) diff --git a/eval.c b/eval.c index 9997d288a3..c2f15fb95f 100644 --- a/eval.c +++ b/eval.c @@ -1816,7 +1816,7 @@ get_errinfo(void) } static VALUE -errinfo_getter(ID id) +errinfo_getter(ID id, VALUE *_) { return get_errinfo(); } @@ -1851,7 +1851,7 @@ rb_set_errinfo(VALUE err) } static VALUE -errat_getter(ID id) +errat_getter(ID id, VALUE *_) { VALUE err = get_errinfo(); if (!NIL_P(err)) { diff --git a/include/ruby/intern.h b/include/ruby/intern.h index c5a7f052db..aaf73a1544 100644 --- a/include/ruby/intern.h +++ b/include/ruby/intern.h @@ -801,7 +801,7 @@ VALUE rb_str_replace(VALUE, VALUE); VALUE rb_str_inspect(VALUE); VALUE rb_str_dump(VALUE); VALUE rb_str_split(VALUE, const char*); -void rb_str_setter(VALUE, ID, VALUE*); +rb_gvar_setter_t rb_str_setter; VALUE rb_str_intern(VALUE); VALUE rb_sym_to_s(VALUE); long rb_str_strlen(VALUE); diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index 86406ca50e..e15e3e60ef 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -1776,29 +1776,27 @@ void rb_include_module(VALUE,VALUE); void rb_extend_object(VALUE,VALUE); void rb_prepend_module(VALUE,VALUE); -struct rb_global_variable; - -typedef VALUE rb_gvar_getter_t(ID id, void *data, struct rb_global_variable *gvar); -typedef void rb_gvar_setter_t(VALUE val, ID id, void *data, struct rb_global_variable *gvar); +typedef VALUE rb_gvar_getter_t(ID id, VALUE *data); +typedef void rb_gvar_setter_t(VALUE val, ID id, VALUE *data); typedef void rb_gvar_marker_t(VALUE *var); -VALUE rb_gvar_undef_getter(ID id, void *data, struct rb_global_variable *gvar); -void rb_gvar_undef_setter(VALUE val, ID id, void *data, struct rb_global_variable *gvar); -void rb_gvar_undef_marker(VALUE *var); +rb_gvar_getter_t rb_gvar_undef_getter; +rb_gvar_setter_t rb_gvar_undef_setter; +rb_gvar_marker_t rb_gvar_undef_marker; -VALUE rb_gvar_val_getter(ID id, void *data, struct rb_global_variable *gvar); -void rb_gvar_val_setter(VALUE val, ID id, void *data, struct rb_global_variable *gvar); -void rb_gvar_val_marker(VALUE *var); +rb_gvar_getter_t rb_gvar_val_getter; +rb_gvar_setter_t rb_gvar_val_setter; +rb_gvar_marker_t rb_gvar_val_marker; -VALUE rb_gvar_var_getter(ID id, void *data, struct rb_global_variable *gvar); -void rb_gvar_var_setter(VALUE val, ID id, void *data, struct rb_global_variable *gvar); -void rb_gvar_var_marker(VALUE *var); +rb_gvar_getter_t rb_gvar_var_getter; +rb_gvar_setter_t rb_gvar_var_setter; +rb_gvar_marker_t rb_gvar_var_marker; -NORETURN(void rb_gvar_readonly_setter(VALUE val, ID id, void *data, struct rb_global_variable *gvar)); +NORETURN(rb_gvar_setter_t rb_gvar_readonly_setter); void rb_define_variable(const char*,VALUE*); -void rb_define_virtual_variable(const char*,VALUE(*)(ANYARGS),void(*)(ANYARGS)); -void rb_define_hooked_variable(const char*,VALUE*,VALUE(*)(ANYARGS),void(*)(ANYARGS)); +void rb_define_virtual_variable(const char*,rb_gvar_getter_t*,rb_gvar_setter_t*); +void rb_define_hooked_variable(const char*,VALUE*,rb_gvar_getter_t*,rb_gvar_setter_t*); void rb_define_readonly_variable(const char*,const VALUE*); void rb_define_const(VALUE,const char*,VALUE); void rb_define_global_const(const char*,VALUE); diff --git a/io.c b/io.c index 1b37723b26..2f9df89d6a 100644 --- a/io.c +++ b/io.c @@ -12986,6 +12986,18 @@ rb_readwrite_syserr_fail(enum rb_io_wait_readwrite writable, int n, const char * } } +static VALUE +get_$LAST_READ_LINE(ID _x, VALUE *_y) +{ + return rb_lastline_get(); +} + +static void +set_$LAST_READ_LINE(VALUE val, ID _x, VALUE *_y) +{ + rb_lastline_set(val); +} + /* * Document-class: IOError * @@ -13259,7 +13271,7 @@ Init_IO(void) rb_define_hooked_variable("$-0", &rb_rs, 0, rb_str_setter); rb_define_hooked_variable("$\\", &rb_output_rs, 0, rb_str_setter); - rb_define_virtual_variable("$_", rb_lastline_get, rb_lastline_set); + rb_define_virtual_variable("$_", get_$LAST_READ_LINE, set_$LAST_READ_LINE); rb_define_method(rb_cIO, "initialize_copy", rb_io_init_copy, 1); rb_define_method(rb_cIO, "reopen", rb_io_reopen, -1); diff --git a/load.c b/load.c index 6ebe8e5982..bc7abf1521 100644 --- a/load.c +++ b/load.c @@ -143,8 +143,9 @@ rb_get_expanded_load_path(void) } static VALUE -load_path_getter(ID id, rb_vm_t *vm) +load_path_getter(ID id, VALUE * p) { + rb_vm_t *vm = (void *)p; return vm->load_path; } @@ -154,6 +155,12 @@ get_loaded_features(void) return GET_VM()->loaded_features; } +static VALUE +get_$LOADED_FEATURES(ID _x, VALUE *_y) +{ + return get_loaded_features(); +} + static void reset_loaded_features_snapshot(void) { @@ -1258,8 +1265,8 @@ Init_load(void) vm->load_path_check_cache = 0; rb_define_singleton_method(vm->load_path, "resolve_feature_path", rb_resolve_feature_path, 1); - rb_define_virtual_variable("$\"", get_loaded_features, 0); - rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0); + rb_define_virtual_variable("$\"", get_$LOADED_FEATURES, 0); + rb_define_virtual_variable("$LOADED_FEATURES", get_$LOADED_FEATURES, 0); vm->loaded_features = rb_ary_new(); vm->loaded_features_snapshot = rb_ary_tmp_new(0); vm->loaded_features_index = st_init_numtable(); diff --git a/process.c b/process.c index 8cd42db802..dad090712c 100644 --- a/process.c +++ b/process.c @@ -8038,6 +8038,18 @@ rb_clock_getres(int argc, VALUE *argv) } } +static VALUE +get_$CHILD_STATUS(ID _x, VALUE *_y) +{ + return rb_last_status_get(); +} + +static VALUE +get_$PROCESS_ID(ID _x, VALUE *_y) +{ + return get_pid(); +} + VALUE rb_mProcess; static VALUE rb_mProcUID; static VALUE rb_mProcGID; @@ -8054,8 +8066,8 @@ InitVM_process(void) { #undef rb_intern #define rb_intern(str) rb_intern_const(str) - rb_define_virtual_variable("$?", rb_last_status_get, 0); - rb_define_virtual_variable("$$", get_pid, 0); + rb_define_virtual_variable("$?", get_$CHILD_STATUS, 0); + rb_define_virtual_variable("$$", get_$PROCESS_ID, 0); rb_define_global_function("exec", rb_f_exec, -1); rb_define_global_function("fork", rb_f_fork, 0); rb_define_global_function("exit!", rb_f_exit_bang, -1); diff --git a/re.c b/re.c index 6fd4fde7f8..f4aad1e044 100644 --- a/re.c +++ b/re.c @@ -1824,25 +1824,25 @@ rb_reg_match_last(VALUE match) } static VALUE -last_match_getter(void) +last_match_getter(ID _x, VALUE *_y) { return rb_reg_last_match(rb_backref_get()); } static VALUE -prematch_getter(void) +prematch_getter(ID _x, VALUE *_y) { return rb_reg_match_pre(rb_backref_get()); } static VALUE -postmatch_getter(void) +postmatch_getter(ID _x, VALUE *_y) { return rb_reg_match_post(rb_backref_get()); } static VALUE -last_paren_match_getter(void) +last_paren_match_getter(ID _x, VALUE *_y) { return rb_reg_match_last(rb_backref_get()); } @@ -3919,27 +3919,27 @@ rb_reg_regsub(VALUE str, VALUE src, struct re_registers *regs, VALUE regexp) } static VALUE -kcode_getter(void) +kcode_getter(ID _x, VALUE *_y) { rb_warn("variable $KCODE is no longer effective"); return Qnil; } static void -kcode_setter(VALUE val, ID id) +kcode_setter(VALUE val, ID id, VALUE *_) { rb_warn("variable $KCODE is no longer effective; ignored"); } static VALUE -ignorecase_getter(void) +ignorecase_getter(ID _x, VALUE *_y) { rb_warn("variable $= is no longer effective"); return Qfalse; } static void -ignorecase_setter(VALUE val, ID id) +ignorecase_setter(VALUE val, ID id, VALUE *_) { rb_warn("variable $= is no longer effective; ignored"); } @@ -3954,8 +3954,14 @@ match_getter(void) return match; } +static VALUE +get_$LAST_MATCH_INFO(ID _x, VALUE *_y) +{ + return match_getter(); +} + static void -match_setter(VALUE val) +match_setter(VALUE val, ID _x, VALUE *_y) { if (!NIL_P(val)) { Check_Type(val, T_MATCH); @@ -4042,7 +4048,7 @@ Init_Regexp(void) onig_set_warn_func(re_warn); onig_set_verb_warn_func(re_warn); - rb_define_virtual_variable("$~", match_getter, match_setter); + rb_define_virtual_variable("$~", get_$LAST_MATCH_INFO, match_setter); rb_define_virtual_variable("$&", last_match_getter, 0); rb_define_virtual_variable("$`", prematch_getter, 0); rb_define_virtual_variable("$'", postmatch_getter, 0); diff --git a/ruby.c b/ruby.c index 2610cf2387..57c95fa4ae 100644 --- a/ruby.c +++ b/ruby.c @@ -1446,13 +1446,13 @@ VALUE rb_argv0; VALUE rb_e_script; static VALUE -false_value(void) +false_value(ID _x, VALUE *_y) { return Qfalse; } static VALUE -true_value(void) +true_value(ID _x, VALUE *_y) { return Qtrue; } @@ -2230,7 +2230,7 @@ ruby_setproctitle(VALUE title) } static void -set_arg0(VALUE val, ID id) +set_arg0(VALUE val, ID id, VALUE *_) { if (origarg.argv == 0) rb_raise(rb_eRuntimeError, "$0 not initialized"); @@ -2304,16 +2304,14 @@ forbid_setid(const char *s, const ruby_cmdline_options_t *opt) } static void -verbose_setter(VALUE val, ID id, void *data) +verbose_setter(VALUE val, ID id, VALUE *variable) { - VALUE *variable = data; *variable = RTEST(val) ? Qtrue : val; } static VALUE -opt_W_getter(ID id, void *data) +opt_W_getter(ID id, VALUE *variable) { - VALUE *variable = data; switch (*variable) { case Qnil: return INT2FIX(0); diff --git a/safe.c b/safe.c index 68ec59689f..9c668e3842 100644 --- a/safe.c +++ b/safe.c @@ -66,13 +66,13 @@ rb_set_safe_level(int level) } static VALUE -safe_getter(void) +safe_getter(ID _x, VALUE *_y) { return INT2NUM(rb_safe_level()); } static void -safe_setter(VALUE val) +safe_setter(VALUE val, ID _x, VALUE *_y) { int level = NUM2INT(val); rb_set_safe_level(level); diff --git a/variable.c b/variable.c index 3db3e3d5ef..bc79dd6cc3 100644 --- a/variable.c +++ b/variable.c @@ -309,7 +309,7 @@ struct trace_var { struct rb_global_variable { int counter; int block_trace; - void *data; + VALUE *data; rb_gvar_getter_t *getter; rb_gvar_setter_t *setter; rb_gvar_marker_t *marker; @@ -354,7 +354,7 @@ rb_global_entry(ID id) } VALUE -rb_gvar_undef_getter(ID id, void *data, struct rb_global_variable *var) +rb_gvar_undef_getter(ID id, VALUE *_) { rb_warning("global variable `%"PRIsVALUE"' not initialized", QUOTE_ID(id)); @@ -362,8 +362,9 @@ rb_gvar_undef_getter(ID id, void *data, struct rb_global_variable *var) } void -rb_gvar_undef_setter(VALUE val, ID id, void *d, struct rb_global_variable *var) +rb_gvar_undef_setter(VALUE val, ID id, VALUE *_) { + struct rb_global_variable *var = rb_global_entry(id)->var; var->getter = rb_gvar_val_getter; var->setter = rb_gvar_val_setter; var->marker = rb_gvar_val_marker; @@ -377,14 +378,15 @@ rb_gvar_undef_marker(VALUE *var) } VALUE -rb_gvar_val_getter(ID id, void *data, struct rb_global_variable *var) +rb_gvar_val_getter(ID id, VALUE *data) { return (VALUE)data; } void -rb_gvar_val_setter(VALUE val, ID id, void *data, struct rb_global_variable *var) +rb_gvar_val_setter(VALUE val, ID id, VALUE *_) { + struct rb_global_variable *var = rb_global_entry(id)->var; var->data = (void*)val; } @@ -396,17 +398,16 @@ rb_gvar_val_marker(VALUE *var) } VALUE -rb_gvar_var_getter(ID id, void *data, struct rb_global_variable *gvar) +rb_gvar_var_getter(ID id, VALUE *var) { - VALUE *var = data; if (!var) return Qnil; return *var; } void -rb_gvar_var_setter(VALUE val, ID id, void *data, struct rb_global_variable *g) +rb_gvar_var_setter(VALUE val, ID id, VALUE *data) { - *(VALUE *)data = val; + *data = val; } void @@ -416,7 +417,7 @@ rb_gvar_var_marker(VALUE *var) } void -rb_gvar_readonly_setter(VALUE v, ID id, void *d, struct rb_global_variable *g) +rb_gvar_readonly_setter(VALUE v, ID id, VALUE *_) { rb_name_error(id, "%"PRIsVALUE" is a read-only variable", QUOTE_ID(id)); } @@ -487,8 +488,8 @@ void rb_define_hooked_variable( const char *name, VALUE *var, - VALUE (*getter)(ANYARGS), - void (*setter)(ANYARGS)) + rb_gvar_getter_t *getter, + rb_gvar_setter_t *setter) { volatile VALUE tmp = var ? *var : Qnil; ID id = global_id(name); @@ -517,8 +518,8 @@ rb_define_readonly_variable(const char *name, const VALUE *var) void rb_define_virtual_variable( const char *name, - VALUE (*getter)(ANYARGS), - void (*setter)(ANYARGS)) + rb_gvar_getter_t *getter, + rb_gvar_setter_t *setter) { if (!getter) getter = rb_gvar_val_getter; if (!setter) setter = rb_gvar_readonly_setter; @@ -662,7 +663,7 @@ MJIT_FUNC_EXPORTED VALUE rb_gvar_get(struct rb_global_entry *entry) { struct rb_global_variable *var = entry->var; - return (*var->getter)(entry->id, var->data, var); + return (*var->getter)(entry->id, var->data); } struct trace_data { @@ -699,7 +700,7 @@ rb_gvar_set(struct rb_global_entry *entry, VALUE val) struct trace_data trace; struct rb_global_variable *var = entry->var; - (*var->setter)(val, entry->id, var->data, var); + (*var->setter)(val, entry->id, var->data); if (var->trace && !var->block_trace) { var->block_trace = 1; -- cgit v1.2.3