mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
class.c: refactor ROM method tables to array-of-structs layout
Replace the parallel-arrays (struct-of-arrays) ROM method table layout with an array-of-structs layout where each mrb_mt_entry bundles its function pointer and symbol key together. New MRB_MT_ENTRY() and MRB_MT_ROM_TAB() macros simplify ROM table definitions from a 3-part pattern (SIZE define + anonymous struct + mrb_mt_tbl) to a 2-part pattern (entries array + mrb_mt_tbl). Internal mt_* functions in class.c are simplified: single memmove/ memcpy operations replace paired key+value operations. Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1537,78 +1537,38 @@ ary_combination_next(mrb_state *mrb, mrb_value self)
|
||||
}
|
||||
|
||||
/* ---------------------------*/
|
||||
#define ARRAY_EXT_ROM_MT_SIZE 29
|
||||
static struct {
|
||||
union mrb_mt_ptr vals[ARRAY_EXT_ROM_MT_SIZE];
|
||||
mrb_sym keys[ARRAY_EXT_ROM_MT_SIZE];
|
||||
} array_ext_rom_data = {
|
||||
.vals = {
|
||||
{ .func = ary_assoc },
|
||||
{ .func = ary_at },
|
||||
{ .func = ary_rassoc },
|
||||
{ .func = ary_values_at },
|
||||
{ .func = ary_slice_bang },
|
||||
{ .func = ary_compact },
|
||||
{ .func = ary_compact_bang },
|
||||
{ .func = ary_rotate },
|
||||
{ .func = ary_rotate_bang },
|
||||
{ .func = ary_sub },
|
||||
{ .func = ary_difference },
|
||||
{ .func = ary_union },
|
||||
{ .func = ary_union_multi },
|
||||
{ .func = ary_intersection },
|
||||
{ .func = ary_intersection_multi },
|
||||
{ .func = ary_intersect_p },
|
||||
{ .func = ary_fill_parse_arg },
|
||||
{ .func = ary_fill_exec },
|
||||
{ .func = ary_uniq },
|
||||
{ .func = ary_uniq_bang },
|
||||
{ .func = ary_flatten },
|
||||
{ .func = ary_flatten_bang },
|
||||
{ .func = ary_normalize_index },
|
||||
{ .func = ary_fetch },
|
||||
{ .func = ary_insert },
|
||||
{ .func = ary_deconstruct },
|
||||
{ .func = ary_product_group },
|
||||
{ .func = ary_combination_init },
|
||||
{ .func = ary_combination_next },
|
||||
},
|
||||
.keys = {
|
||||
MRB_MT_KEY(MRB_SYM(assoc), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(at), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(rassoc), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(values_at), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_B(slice), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(compact), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_B(compact), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(rotate), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_B(rotate), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_OPSYM(sub), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(difference), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_OPSYM(or), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(union), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_OPSYM(and), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(intersection), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_Q(intersect), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(__fill_parse_arg), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(__fill_exec), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(__uniq), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_B(__uniq), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(flatten), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_B(flatten), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(__normalize_index), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(__fetch), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(insert), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(deconstruct), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(__product_group), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(__combination_init), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(__combination_next), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
}
|
||||
};
|
||||
static mrb_mt_tbl array_ext_rom_mt = {
|
||||
ARRAY_EXT_ROM_MT_SIZE, ARRAY_EXT_ROM_MT_SIZE,
|
||||
(union mrb_mt_ptr*)&array_ext_rom_data, NULL
|
||||
static mrb_mt_entry array_ext_rom_entries[] = {
|
||||
MRB_MT_ENTRY(ary_assoc, MRB_SYM(assoc), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_at, MRB_SYM(at), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_rassoc, MRB_SYM(rassoc), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_values_at, MRB_SYM(values_at), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_slice_bang, MRB_SYM_B(slice), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_compact, MRB_SYM(compact), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(ary_compact_bang, MRB_SYM_B(compact), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(ary_rotate, MRB_SYM(rotate), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_rotate_bang, MRB_SYM_B(rotate), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_sub, MRB_OPSYM(sub), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_difference, MRB_SYM(difference), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_union, MRB_OPSYM(or), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_union_multi, MRB_SYM(union), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_intersection, MRB_OPSYM(and), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_intersection_multi, MRB_SYM(intersection), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_intersect_p, MRB_SYM_Q(intersect), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_fill_parse_arg, MRB_SYM(__fill_parse_arg), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_fill_exec, MRB_SYM(__fill_exec), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_uniq, MRB_SYM(__uniq), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(ary_uniq_bang, MRB_SYM_B(__uniq), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(ary_flatten, MRB_SYM(flatten), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_flatten_bang, MRB_SYM_B(flatten), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_normalize_index, MRB_SYM(__normalize_index), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_fetch, MRB_SYM(__fetch), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_insert, MRB_SYM(insert), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_deconstruct, MRB_SYM(deconstruct), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(ary_product_group, MRB_SYM(__product_group), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_combination_init, MRB_SYM(__combination_init), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(ary_combination_next, MRB_SYM(__combination_next), MRB_MT_FUNC),
|
||||
};
|
||||
static mrb_mt_tbl array_ext_rom_mt = MRB_MT_ROM_TAB(array_ext_rom_entries);
|
||||
|
||||
void
|
||||
mrb_mruby_array_ext_gem_init(mrb_state* mrb)
|
||||
|
||||
Reference in New Issue
Block a user