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:
+38
-85
@@ -2249,92 +2249,45 @@ mrb_ary_to_a(mrb_state *mrb, mrb_value self)
|
||||
}
|
||||
|
||||
/* ---------------------------*/
|
||||
#define ARRAY_ROM_MT_SIZE 36
|
||||
static struct {
|
||||
union mrb_mt_ptr vals[ARRAY_ROM_MT_SIZE];
|
||||
mrb_sym keys[ARRAY_ROM_MT_SIZE];
|
||||
} array_rom_data = {
|
||||
.vals = {
|
||||
{ .func = mrb_ary_plus },
|
||||
{ .func = mrb_ary_times },
|
||||
{ .func = mrb_ary_push_m },
|
||||
{ .func = mrb_ary_aget },
|
||||
{ .func = mrb_ary_aset },
|
||||
{ .func = mrb_ary_clear },
|
||||
{ .func = mrb_ary_cmp },
|
||||
{ .func = mrb_ary_concat_m },
|
||||
{ .func = mrb_ary_delete },
|
||||
{ .func = mrb_ary_delete_at },
|
||||
{ .func = mrb_ary_empty_p },
|
||||
{ .func = mrb_ary_eq },
|
||||
{ .func = mrb_ary_eql },
|
||||
{ .func = mrb_ary_first },
|
||||
{ .func = mrb_ary_index_m },
|
||||
{ .func = mrb_ary_init },
|
||||
{ .func = mrb_ary_replace_m },
|
||||
{ .func = mrb_ary_join_m },
|
||||
{ .func = mrb_ary_last },
|
||||
{ .func = mrb_ary_size },
|
||||
{ .func = mrb_ary_pop },
|
||||
{ .func = mrb_ary_push_m },
|
||||
{ .func = mrb_ary_replace_m },
|
||||
{ .func = mrb_ary_reverse },
|
||||
{ .func = mrb_ary_reverse_bang },
|
||||
{ .func = mrb_ary_rindex_m },
|
||||
{ .func = mrb_ary_shift_m },
|
||||
{ .func = mrb_ary_size },
|
||||
{ .func = mrb_ary_aget },
|
||||
{ .func = mrb_ary_unshift_m },
|
||||
{ .func = mrb_ary_to_a },
|
||||
{ .func = mrb_ary_to_a },
|
||||
{ .func = mrb_ary_to_s },
|
||||
{ .func = mrb_ary_to_s },
|
||||
{ .func = mrb_ary_sort_bang },
|
||||
{ .func = mrb_ary_svalue },
|
||||
},
|
||||
.keys = {
|
||||
MRB_MT_KEY(MRB_OPSYM(add), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_OPSYM(mul), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_OPSYM(lshift), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_OPSYM(aref), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_OPSYM(aset), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(clear), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_OPSYM(cmp), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(concat), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(delete), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(delete_at), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_Q(empty), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_OPSYM(eq), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_Q(eql), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(first), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(index), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(initialize), MRB_MT_FUNC|MRB_MT_PRIVATE),
|
||||
MRB_MT_KEY(MRB_SYM(initialize_copy), MRB_MT_FUNC|MRB_MT_PRIVATE),
|
||||
MRB_MT_KEY(MRB_SYM(join), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(last), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(length), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(pop), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(push), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(replace), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(reverse), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_B(reverse), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(rindex), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(shift), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(size), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(slice), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(unshift), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(to_a), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(entries), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(to_s), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(inspect), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_B(sort), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(__svalue), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
}
|
||||
};
|
||||
static mrb_mt_tbl array_rom_mt = {
|
||||
ARRAY_ROM_MT_SIZE, ARRAY_ROM_MT_SIZE,
|
||||
(union mrb_mt_ptr*)&array_rom_data, NULL
|
||||
static mrb_mt_entry array_rom_entries[] = {
|
||||
MRB_MT_ENTRY(mrb_ary_plus, MRB_OPSYM(add), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_times, MRB_OPSYM(mul), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_push_m, MRB_OPSYM(lshift), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_aget, MRB_OPSYM(aref), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_aset, MRB_OPSYM(aset), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_clear, MRB_SYM(clear), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_ary_cmp, MRB_OPSYM(cmp), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_concat_m, MRB_SYM(concat), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_delete, MRB_SYM(delete), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_delete_at, MRB_SYM(delete_at), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_empty_p, MRB_SYM_Q(empty), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_ary_eq, MRB_OPSYM(eq), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_eql, MRB_SYM_Q(eql), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_first, MRB_SYM(first), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_index_m, MRB_SYM(index), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_init, MRB_SYM(initialize), MRB_MT_FUNC|MRB_MT_PRIVATE),
|
||||
MRB_MT_ENTRY(mrb_ary_replace_m, MRB_SYM(initialize_copy), MRB_MT_FUNC|MRB_MT_PRIVATE),
|
||||
MRB_MT_ENTRY(mrb_ary_join_m, MRB_SYM(join), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_last, MRB_SYM(last), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_size, MRB_SYM(length), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_ary_pop, MRB_SYM(pop), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_ary_push_m, MRB_SYM(push), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_replace_m, MRB_SYM(replace), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_reverse, MRB_SYM(reverse), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_ary_reverse_bang, MRB_SYM_B(reverse), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_ary_rindex_m, MRB_SYM(rindex), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_shift_m, MRB_SYM(shift), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_size, MRB_SYM(size), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_ary_aget, MRB_SYM(slice), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_unshift_m, MRB_SYM(unshift), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_ary_to_a, MRB_SYM(to_a), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_ary_to_a, MRB_SYM(entries), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_ary_to_s, MRB_SYM(to_s), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_ary_to_s, MRB_SYM(inspect), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_ary_sort_bang, MRB_SYM_B(sort), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_ary_svalue, MRB_SYM(__svalue), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
};
|
||||
static mrb_mt_tbl array_rom_mt = MRB_MT_ROM_TAB(array_rom_entries);
|
||||
|
||||
void
|
||||
mrb_init_array(mrb_state *mrb)
|
||||
|
||||
Reference in New Issue
Block a user