mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
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 <noreply@anthropic.com>
This commit is contained in:
@@ -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:**
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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))
|
||||
|
||||
+1
-3
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user