From ada229d2b0db749499e4ef489da9791c30d44bac Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 20 Feb 2026 11:51:59 +0900 Subject: [PATCH] proc.h: remove MRB_METHOD_NOARG flag; derive from aspec The NOARG flag (bit 2) is now redundant since the full aspec is stored in bits 4+ of the flags field. Replace the dedicated bit check with aspec==0 check. Store aspec in define_method_id() for dynamically defined methods too. Co-authored-by: Claude --- doc/guides/rom-method-table.md | 23 ++++++++++------------- include/mruby/internal.h | 9 +++------ include/mruby/proc.h | 6 ++---- src/class.c | 4 +--- 4 files changed, 16 insertions(+), 26 deletions(-) diff --git a/doc/guides/rom-method-table.md b/doc/guides/rom-method-table.md index 34a62a508..2c9cef8da 100644 --- a/doc/guides/rom-method-table.md +++ b/doc/guides/rom-method-table.md @@ -132,15 +132,13 @@ typedef struct mrb_mt_tbl { ### Macros ```c -/* ROM table entry: MRB_MT_FUNC auto-set, MRB_MT_NOARG auto-derived from aspec==0 */ +/* ROM table entry: stores aspec in bits 4+, auto-sets MRB_MT_FUNC */ #define MRB_MT_ENTRY(fn, sym, aspec) \ - { { .func = (fn) }, (sym), \ - ((aspec) << 4) | MRB_MT_FUNC | (((aspec)==0)?MRB_MT_NOARG:0) } + { { .func = (fn) }, (sym), ((aspec) << 4) | MRB_MT_FUNC } /* ROM table entry for private methods */ #define MRB_MT_ENTRY_PRIVATE(fn, sym, aspec) \ - { { .func = (fn) }, (sym), \ - ((aspec) << 4) | MRB_MT_FUNC | MRB_MT_PRIVATE | (((aspec)==0)?MRB_MT_NOARG:0) } + { { .func = (fn) }, (sym), ((aspec) << 4) | MRB_MT_FUNC | MRB_MT_PRIVATE } /* Extract aspec from combined flags */ #define MRB_MT_ASPEC(flags) ((mrb_aspec)((flags) >> 4)) @@ -154,16 +152,15 @@ typedef struct mrb_mt_tbl { ### Flags (bits 0-3 of uint32_t) -| Flag | Value | Description | -| ----------------- | ----- | ---------------------------------------- | -| `MRB_MT_FUNC` | 8 | C function (auto-set by macros) | -| `MRB_MT_NOARG` | 4 | Method takes no arguments (auto-derived) | -| `MRB_MT_PUBLIC` | 0 | Public visibility (default) | -| `MRB_MT_PRIVATE` | 1 | Private visibility | +| Flag | Value | Description | +| ---------------- | ----- | ------------------------------- | +| `MRB_MT_FUNC` | 8 | C function (auto-set by macros) | +| `MRB_MT_PUBLIC` | 0 | Public visibility (default) | +| `MRB_MT_PRIVATE` | 1 | Private visibility | Bits 4-27 store the `mrb_aspec` argument specification (shifted left -by 4). Both `MRB_MT_FUNC` and `MRB_MT_NOARG` are set automatically -by the macros; `MRB_MT_NOARG` is derived from `aspec == 0` +by 4). `MRB_MT_FUNC` is set automatically by the macros. The no-arg +optimization is derived at runtime from `aspec == 0` (`MRB_ARGS_NONE()`). **How to write entries:** diff --git a/include/mruby/internal.h b/include/mruby/internal.h index 39cb10305..d9dd574ba 100644 --- a/include/mruby/internal.h +++ b/include/mruby/internal.h @@ -51,17 +51,14 @@ typedef struct mrb_mt_tbl { #define MRB_MT_READONLY_BIT (1 << 30) #define MRB_MT_FROZEN_BIT (1 << 29) #define MRB_MT_FUNC 8 /* MRB_METHOD_FUNC_FL */ -#define MRB_MT_NOARG 4 /* MRB_METHOD_NOARG_FL */ #define MRB_MT_PUBLIC 0 /* MRB_METHOD_PUBLIC_FL */ #define MRB_MT_PRIVATE 1 /* MRB_METHOD_PRIVATE_FL */ -/* ROM table entry: MRB_MT_FUNC auto-set, MRB_MT_NOARG auto-derived from aspec==0 */ +/* ROM table entry: stores aspec in bits 4+, auto-sets MRB_MT_FUNC */ #define MRB_MT_ENTRY(fn, sym, aspec) \ - { { .func = (fn) }, (sym), \ - ((aspec) << 4) | MRB_MT_FUNC | (((aspec)==0)?MRB_MT_NOARG:0) } + { { .func = (fn) }, (sym), ((aspec) << 4) | MRB_MT_FUNC } #define MRB_MT_ENTRY_PRIVATE(fn, sym, aspec) \ - { { .func = (fn) }, (sym), \ - ((aspec) << 4) | MRB_MT_FUNC | MRB_MT_PRIVATE | (((aspec)==0)?MRB_MT_NOARG:0) } + { { .func = (fn) }, (sym), ((aspec) << 4) | MRB_MT_FUNC | MRB_MT_PRIVATE } #define MRB_MT_ASPEC(flags) ((mrb_aspec)((flags) >> 4)) /* ROM table initializer from const entries array (auto-computes size). diff --git a/include/mruby/proc.h b/include/mruby/proc.h index 19d2aa9ef..029815332 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -97,7 +97,7 @@ struct RProc { } while (0) #define MRB_PROC_SCOPE 2048 #define MRB_PROC_SCOPE_P(p) (((p)->flags & MRB_PROC_SCOPE) != 0) -#define MRB_PROC_NOARG 4096 /* for MRB_PROC_CFUNC_FL, it would be something like MRB_ARGS_NONE() or MRB_METHOD_NOARG_FL */ +#define MRB_PROC_NOARG 4096 /* for MRB_PROC_CFUNC_FL, aspec == MRB_ARGS_NONE() */ #define MRB_PROC_NOARG_P(p) (((p)->flags & MRB_PROC_NOARG) != 0) #define MRB_PROC_ALIAS 8192 #define MRB_PROC_ALIAS_P(p) (((p)->flags & MRB_PROC_ALIAS) != 0) @@ -115,7 +115,6 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); #define mrb_cfunc_env_get(mrb, idx) mrb_proc_cfunc_env_get(mrb, idx) #define MRB_METHOD_FUNC_FL 8 -#define MRB_METHOD_NOARG_FL 4 #define MRB_METHOD_PUBLIC_FL 0 #define MRB_METHOD_PRIVATE_FL 1 #define MRB_METHOD_PROTECTED_FL 2 @@ -123,9 +122,8 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); #define MRB_METHOD_VISIBILITY_MASK 3 #define MRB_METHOD_FUNC_P(m) ((m).flags&MRB_METHOD_FUNC_FL) -#define MRB_METHOD_NOARG_P(m) (((m).flags&MRB_METHOD_NOARG_FL)?1:0) +#define MRB_METHOD_NOARG_P(m) ((m).flags>>4==0) #define MRB_METHOD_FUNC(m) ((m).as.func) -#define MRB_METHOD_NOARG_SET(m) do{(m).flags|=MRB_METHOD_NOARG_FL;}while(0) #define MRB_METHOD_FROM_FUNC(m,fn) do{(m).flags=MRB_METHOD_FUNC_FL;(m).as.func=(fn);}while(0) #define MRB_METHOD_FROM_PROC(m,pr) do{(m).flags=0;(m).as.proc=(pr);}while(0) #define MRB_METHOD_PROC_P(m) (!MRB_METHOD_FUNC_P(m)) diff --git a/src/class.c b/src/class.c index d6b14cc0d..379385ed6 100644 --- a/src/class.c +++ b/src/class.c @@ -1052,9 +1052,7 @@ define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, int ai = mrb_gc_arena_save(mrb); MRB_METHOD_FROM_FUNC(m, func); - if (aspec == MRB_ARGS_NONE()) { - MRB_METHOD_NOARG_SET(m); - } + m.flags |= (aspec << 4); MRB_METHOD_SET_VISIBILITY(m, vis); mrb_define_method_raw(mrb, c, mid, m); mrb_gc_arena_restore(mrb, ai);