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:
+48
-105
@@ -3508,112 +3508,55 @@ mrb_encoding(mrb_state *mrb, mrb_value self)
|
||||
}
|
||||
|
||||
/* ---------------------------*/
|
||||
#define STRING_ROM_MT_SIZE 46
|
||||
static struct {
|
||||
union mrb_mt_ptr vals[STRING_ROM_MT_SIZE];
|
||||
mrb_sym keys[STRING_ROM_MT_SIZE];
|
||||
} string_rom_data = {
|
||||
.vals = {
|
||||
{ .func = mrb_str_bytesize },
|
||||
{ .func = mrb_str_cmp_m },
|
||||
{ .func = mrb_str_equal_m },
|
||||
{ .func = mrb_str_plus_m },
|
||||
{ .func = mrb_str_times },
|
||||
{ .func = mrb_str_aref_m },
|
||||
{ .func = mrb_str_aset_m },
|
||||
{ .func = mrb_str_capitalize },
|
||||
{ .func = mrb_str_capitalize_bang },
|
||||
{ .func = mrb_str_chomp },
|
||||
{ .func = mrb_str_chomp_bang },
|
||||
{ .func = mrb_str_chop },
|
||||
{ .func = mrb_str_chop_bang },
|
||||
{ .func = mrb_str_downcase },
|
||||
{ .func = mrb_str_downcase_bang },
|
||||
{ .func = mrb_str_empty_p },
|
||||
{ .func = mrb_str_eql },
|
||||
{ .func = mrb_str_hash_m },
|
||||
{ .func = mrb_str_include },
|
||||
{ .func = mrb_str_index_m },
|
||||
{ .func = mrb_str_init },
|
||||
{ .func = mrb_str_replace },
|
||||
{ .func = mrb_str_intern },
|
||||
{ .func = mrb_str_size },
|
||||
{ .func = mrb_str_replace },
|
||||
{ .func = mrb_str_reverse },
|
||||
{ .func = mrb_str_reverse_bang },
|
||||
{ .func = mrb_str_rindex_m },
|
||||
{ .func = mrb_str_size },
|
||||
{ .func = mrb_str_aref_m },
|
||||
{ .func = mrb_str_split_m },
|
||||
{ .func = mrb_str_to_i },
|
||||
{ .func = mrb_str_to_s },
|
||||
{ .func = mrb_str_to_s },
|
||||
{ .func = mrb_str_intern },
|
||||
{ .func = mrb_str_upcase },
|
||||
{ .func = mrb_str_upcase_bang },
|
||||
{ .func = mrb_str_inspect },
|
||||
{ .func = mrb_str_bytes },
|
||||
{ .func = mrb_str_getbyte },
|
||||
{ .func = mrb_str_setbyte },
|
||||
{ .func = mrb_str_byteindex_m },
|
||||
{ .func = mrb_str_byterindex_m },
|
||||
{ .func = mrb_str_byteslice },
|
||||
{ .func = mrb_str_bytesplice },
|
||||
{ .func = sub_replace },
|
||||
},
|
||||
.keys = {
|
||||
MRB_MT_KEY(MRB_SYM(bytesize), 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_OPSYM(eq), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
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(aref), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_OPSYM(aset), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(capitalize), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_B(capitalize), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(chomp), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_B(chomp), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(chop), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_B(chop), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(downcase), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_B(downcase), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_Q(empty), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_Q(eql), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(hash), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_Q(include), 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(intern), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(length), MRB_MT_FUNC|MRB_MT_NOARG|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(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(split), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(to_i), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(to_s), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(to_str), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(to_sym), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(upcase), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM_B(upcase), 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(bytes), MRB_MT_FUNC|MRB_MT_NOARG|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(getbyte), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(setbyte), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(byteindex), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(byterindex), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(byteslice), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(bytesplice), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
MRB_MT_KEY(MRB_SYM(__sub_replace), MRB_MT_FUNC|MRB_MT_PUBLIC),
|
||||
}
|
||||
};
|
||||
static mrb_mt_tbl string_rom_mt = {
|
||||
STRING_ROM_MT_SIZE, STRING_ROM_MT_SIZE,
|
||||
(union mrb_mt_ptr*)&string_rom_data, NULL
|
||||
static mrb_mt_entry string_rom_entries[] = {
|
||||
MRB_MT_ENTRY(mrb_str_bytesize, MRB_SYM(bytesize), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_cmp_m, MRB_OPSYM(cmp), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_equal_m, MRB_OPSYM(eq), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_plus_m, MRB_OPSYM(add), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_times, MRB_OPSYM(mul), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_aref_m, MRB_OPSYM(aref), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_aset_m, MRB_OPSYM(aset), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_capitalize, MRB_SYM(capitalize), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_capitalize_bang, MRB_SYM_B(capitalize), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_chomp, MRB_SYM(chomp), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_chomp_bang, MRB_SYM_B(chomp), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_chop, MRB_SYM(chop), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_chop_bang, MRB_SYM_B(chop), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_downcase, MRB_SYM(downcase), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_downcase_bang, MRB_SYM_B(downcase), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_empty_p, MRB_SYM_Q(empty), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_eql, MRB_SYM_Q(eql), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_hash_m, MRB_SYM(hash), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_include, MRB_SYM_Q(include), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_index_m, MRB_SYM(index), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_init, MRB_SYM(initialize), MRB_MT_FUNC|MRB_MT_PRIVATE),
|
||||
MRB_MT_ENTRY(mrb_str_replace, MRB_SYM(initialize_copy), MRB_MT_FUNC|MRB_MT_PRIVATE),
|
||||
MRB_MT_ENTRY(mrb_str_intern, MRB_SYM(intern), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_size, MRB_SYM(length), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_replace, MRB_SYM(replace), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_reverse, MRB_SYM(reverse), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_reverse_bang, MRB_SYM_B(reverse), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_rindex_m, MRB_SYM(rindex), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_size, MRB_SYM(size), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_aref_m, MRB_SYM(slice), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_split_m, MRB_SYM(split), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_to_i, MRB_SYM(to_i), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_to_s, MRB_SYM(to_s), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_to_s, MRB_SYM(to_str), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_intern, MRB_SYM(to_sym), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_upcase, MRB_SYM(upcase), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_upcase_bang, MRB_SYM_B(upcase), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_inspect, MRB_SYM(inspect), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_bytes, MRB_SYM(bytes), MRB_MT_FUNC|MRB_MT_NOARG),
|
||||
MRB_MT_ENTRY(mrb_str_getbyte, MRB_SYM(getbyte), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_setbyte, MRB_SYM(setbyte), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_byteindex_m, MRB_SYM(byteindex), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_byterindex_m, MRB_SYM(byterindex), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_byteslice, MRB_SYM(byteslice), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(mrb_str_bytesplice, MRB_SYM(bytesplice), MRB_MT_FUNC),
|
||||
MRB_MT_ENTRY(sub_replace, MRB_SYM(__sub_replace), MRB_MT_FUNC),
|
||||
};
|
||||
static mrb_mt_tbl string_rom_mt = MRB_MT_ROM_TAB(string_rom_entries);
|
||||
|
||||
void
|
||||
mrb_init_string(mrb_state *mrb)
|
||||
|
||||
Reference in New Issue
Block a user