From 0a4f21c60f02e462c42f2822e4a526ca73a5eb19 Mon Sep 17 00:00:00 2001 From: dearblue Date: Sun, 6 Feb 2022 18:39:46 +0900 Subject: [PATCH] Support `disable_presym` for `mrbgems/mruby-errno` The `mrbgems/mruby-errno/src/known_errors_def.cstub` file has been extended, so the `mrbgems/mruby-errno/src/known_errors_e2c.cstub` file is no longer needed. --- mrbgems/mruby-errno/src/errno.c | 42 +- mrbgems/mruby-errno/src/gen.rb | 11 +- .../mruby-errno/src/known_errors_def.cstub | 624 +++++++++--------- .../mruby-errno/src/known_errors_e2c.cstub | 468 ------------- 4 files changed, 343 insertions(+), 802 deletions(-) delete mode 100644 mrbgems/mruby-errno/src/known_errors_e2c.cstub diff --git a/mrbgems/mruby-errno/src/errno.c b/mrbgems/mruby-errno/src/errno.c index 74df5d0fc..480f3bdda 100644 --- a/mrbgems/mruby-errno/src/errno.c +++ b/mrbgems/mruby-errno/src/errno.c @@ -10,14 +10,30 @@ #include #include -static struct { +static const struct { +#ifdef MRB_NO_PRESYM +#define itsdefined(name, sym) { #name, name }, + const char *name; +#else +#define itsdefined(name, sym) { sym, name }, mrb_sym sym; +#endif int eno; } e2c[] = { -#include "known_errors_e2c.cstub" - {0, 0}, +#define itsnotdefined(name, sym) +#include "known_errors_def.cstub" +#undef itsdefined +#undef itsnotdefined }; +#ifdef MRB_NO_PRESYM +#define ENTRY_SYM(e) mrb_intern_static(mrb, (e).name, strlen((e).name)) +#else +#define ENTRY_SYM(e) (e).sym +#endif + +#define E2C_LEN (sizeof(e2c) / sizeof(e2c[0])) + static void mrb_sce_init(mrb_state *mrb, mrb_value self, mrb_value m, mrb_int n) { @@ -30,14 +46,14 @@ mrb_sce_init(mrb_state *mrb, mrb_value self, mrb_value m, mrb_int n) if (!no_errno) { int i; - for (i=0; e2c[i].sym != 0; i++) { + for (i=0; i < E2C_LEN; i++) { if (e2c[i].eno == n) { - mrb_basic_ptr(self)->c = mrb_class_get_under_id(mrb, m_errno, e2c[i].sym); + mrb_basic_ptr(self)->c = mrb_class_get_under_id(mrb, m_errno, ENTRY_SYM(e2c[i])); str = mrb_str_new_cstr(mrb, strerror(n)); break; } } - if (e2c[i].sym == 0) { + if (i == E2C_LEN) { mrb_iv_set(mrb, self, MRB_SYM(errno), mrb_fixnum_value(n)); str = mrb_str_new_cstr(mrb, "Unknown error: "); snprintf(buf, sizeof(buf), "%d", (int)n); @@ -158,19 +174,19 @@ mrb_mruby_errno_gem_init(mrb_state *mrb) //mrb_define_method(mrb, e, "===", mrb_exxx_cmp, MRB_ARGS_REQ(1)); noerror = mrb_obj_value(e); -#define itsdefined(SYM) \ +#define itsdefined(name, sym) \ do { \ int ai = mrb_gc_arena_save(mrb); \ - e = mrb_define_class_under(mrb, eno, #SYM, sce); \ - mrb_define_const_id(mrb, e, MRB_SYM(Errno), mrb_fixnum_value(SYM)); \ + e = mrb_define_class_under_id(mrb, eno, sym, sce); \ + mrb_define_const_id(mrb, e, MRB_SYM(Errno), mrb_fixnum_value(name)); \ mrb_define_method(mrb, e, "initialize", mrb_exxx_init, MRB_ARGS_OPT(1)); \ mrb_gc_arena_restore(mrb, ai); \ - } while (0) + } while (0); -#define itsnotdefined(SYM) \ +#define itsnotdefined(name, sym) \ do { \ - mrb_define_const(mrb, eno, #SYM, noerror); \ - } while (0) + mrb_define_const_id(mrb, eno, sym, noerror); \ + } while (0); #include "known_errors_def.cstub" } diff --git a/mrbgems/mruby-errno/src/gen.rb b/mrbgems/mruby-errno/src/gen.rb index 6a0327dd3..a9a6c8ee0 100755 --- a/mrbgems/mruby-errno/src/gen.rb +++ b/mrbgems/mruby-errno/src/gen.rb @@ -2,24 +2,17 @@ Dir.chdir(File.dirname($0)) -e = File.open("known_errors_e2c.cstub", "w") d = File.open("known_errors_def.cstub", "w") IO.readlines("known_errors.def").each { |name| next if name =~ /^#/ name.strip! - e.write <