mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
mruby-metaprog: ROM method tables for metaprogramming extensions
Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -9,6 +9,8 @@
|
||||
#include <mruby/khash.h>
|
||||
#include <mruby/presym.h>
|
||||
|
||||
#undef MT_PUBLIC
|
||||
#undef MT_PRIVATE
|
||||
#define MT_PUBLIC MRB_METHOD_PUBLIC_FL
|
||||
#define MT_PRIVATE MRB_METHOD_PRIVATE_FL
|
||||
#define MT_PROTECTED MRB_METHOD_PROTECTED_FL
|
||||
@@ -687,12 +689,107 @@ mrb_mod_s_nesting(mrb_state *mrb, mrb_value mod)
|
||||
return ary;
|
||||
}
|
||||
|
||||
/* ---------------------------*/
|
||||
#ifndef MRB_NO_PRESYM
|
||||
#define METAPROG_KRN_ROM_MT_SIZE 15
|
||||
static struct {
|
||||
union mt_ptr vals[METAPROG_KRN_ROM_MT_SIZE];
|
||||
mrb_sym keys[METAPROG_KRN_ROM_MT_SIZE];
|
||||
} metaprog_krn_rom_data = {
|
||||
.vals = {
|
||||
{ .func = mrb_f_global_variables },
|
||||
{ .func = mrb_local_variables },
|
||||
{ .func = mrb_singleton_class },
|
||||
{ .func = mrb_obj_ivar_defined },
|
||||
{ .func = mrb_obj_ivar_get },
|
||||
{ .func = mrb_obj_ivar_set },
|
||||
{ .func = mrb_obj_instance_variables },
|
||||
{ .func = mrb_obj_methods_m },
|
||||
{ .func = mrb_obj_private_methods },
|
||||
{ .func = mrb_obj_protected_methods },
|
||||
{ .func = mrb_obj_public_methods },
|
||||
{ .func = mrb_obj_singleton_methods_m },
|
||||
{ .func = mod_define_singleton_method },
|
||||
{ .func = mrb_f_send },
|
||||
{ .func = mrb_f_public_send },
|
||||
},
|
||||
.keys = {
|
||||
MT_KEY(MRB_SYM(global_variables), MT_FUNC|MT_NOARG|MT_PRIVATE),
|
||||
MT_KEY(MRB_SYM(local_variables), MT_FUNC|MT_NOARG|MT_PRIVATE),
|
||||
MT_KEY(MRB_SYM(singleton_class), MT_FUNC|MT_NOARG|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM_Q(instance_variable_defined), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(instance_variable_get), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(instance_variable_set), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(instance_variables), MT_FUNC|MT_NOARG|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(methods), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(private_methods), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(protected_methods), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(public_methods), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(singleton_methods), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(define_singleton_method), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(send), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(public_send), MT_FUNC|MT_PUBLIC),
|
||||
}
|
||||
};
|
||||
static mt_tbl metaprog_krn_rom_mt = {
|
||||
METAPROG_KRN_ROM_MT_SIZE, METAPROG_KRN_ROM_MT_SIZE,
|
||||
(union mt_ptr*)&metaprog_krn_rom_data, NULL
|
||||
};
|
||||
|
||||
#define METAPROG_MOD_ROM_MT_SIZE 14
|
||||
static struct {
|
||||
union mt_ptr vals[METAPROG_MOD_ROM_MT_SIZE];
|
||||
mrb_sym keys[METAPROG_MOD_ROM_MT_SIZE];
|
||||
} metaprog_mod_rom_data = {
|
||||
.vals = {
|
||||
{ .func = mrb_mod_class_variables },
|
||||
{ .func = mrb_mod_remove_cvar },
|
||||
{ .func = mrb_mod_cvar_defined },
|
||||
{ .func = mrb_mod_cvar_get },
|
||||
{ .func = mrb_mod_cvar_set },
|
||||
{ .func = mrb_mod_included_modules },
|
||||
{ .func = mrb_mod_instance_methods },
|
||||
{ .func = mrb_mod_public_instance_methods },
|
||||
{ .func = mrb_mod_private_instance_methods },
|
||||
{ .func = mrb_mod_protected_instance_methods },
|
||||
{ .func = mrb_mod_undefined_methods },
|
||||
{ .func = mrb_mod_remove_method },
|
||||
{ .func = mrb_f_nil },
|
||||
{ .func = mrb_mod_constants },
|
||||
},
|
||||
.keys = {
|
||||
MT_KEY(MRB_SYM(class_variables), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(remove_class_variable), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM_Q(class_variable_defined), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(class_variable_get), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(class_variable_set), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(included_modules), MT_FUNC|MT_NOARG|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(instance_methods), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(public_instance_methods), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(private_instance_methods), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(protected_instance_methods), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(undefined_instance_methods), MT_FUNC|MT_NOARG|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(remove_method), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(method_removed), MT_FUNC|MT_PUBLIC),
|
||||
MT_KEY(MRB_SYM(constants), MT_FUNC|MT_PUBLIC),
|
||||
}
|
||||
};
|
||||
static mt_tbl metaprog_mod_rom_mt = {
|
||||
METAPROG_MOD_ROM_MT_SIZE, METAPROG_MOD_ROM_MT_SIZE,
|
||||
(union mt_ptr*)&metaprog_mod_rom_data, NULL
|
||||
};
|
||||
#endif /* !MRB_NO_PRESYM */
|
||||
|
||||
void
|
||||
mrb_mruby_metaprog_gem_init(mrb_state* mrb)
|
||||
{
|
||||
struct RClass *krn = mrb->kernel_module;
|
||||
struct RClass *mod = mrb->module_class;
|
||||
|
||||
#ifndef MRB_NO_PRESYM
|
||||
mrb_mt_init_rom(krn, &metaprog_krn_rom_mt);
|
||||
mrb_mt_init_rom(mod, &metaprog_mod_rom_mt);
|
||||
#else
|
||||
mrb_define_private_method_id(mrb, krn, MRB_SYM(global_variables), mrb_f_global_variables, MRB_ARGS_NONE()); /* 15.3.1.3.14 (15.3.1.2.4) */
|
||||
mrb_define_private_method_id(mrb, krn, MRB_SYM(local_variables), mrb_local_variables, MRB_ARGS_NONE()); /* 15.3.1.3.28 (15.3.1.2.7) */
|
||||
|
||||
@@ -724,6 +821,7 @@ mrb_mruby_metaprog_gem_init(mrb_state* mrb)
|
||||
mrb_define_method_id(mrb, mod, MRB_SYM(remove_method), mrb_mod_remove_method, MRB_ARGS_ANY()); /* 15.2.2.4.41 */
|
||||
mrb_define_method_id(mrb, mod, MRB_SYM(method_removed), mrb_f_nil, MRB_ARGS_REQ(1));
|
||||
mrb_define_method_id(mrb, mod, MRB_SYM(constants), mrb_mod_constants, MRB_ARGS_OPT(1)); /* 15.2.2.4.24 */
|
||||
#endif
|
||||
mrb_define_class_method_id(mrb, mod, MRB_SYM(constants), mrb_mod_s_constants, MRB_ARGS_ANY()); /* 15.2.2.3.1 */
|
||||
mrb_define_class_method_id(mrb, mod, MRB_SYM(nesting), mrb_mod_s_nesting, MRB_ARGS_NONE()); /* 15.2.2.3.2 */
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user