diff options
Diffstat (limited to 'encoding.c')
-rw-r--r-- | encoding.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/encoding.c b/encoding.c index b2d9359694..325ee7a73b 100644 --- a/encoding.c +++ b/encoding.c @@ -155,7 +155,7 @@ enc_register(const char *name, rb_encoding *encoding) } static VALUE enc_based_encoding(VALUE); -#define rb_enc_registered(name) rb_enc_find_index(name) +int rb_enc_registered(const char *name); int rb_enc_register(const char *name, rb_encoding *encoding) @@ -252,7 +252,7 @@ rb_enc_from_index(int index) } int -rb_enc_find_index(const char *name) +rb_enc_registered(const char *name) { int i; st_data_t alias = 0; @@ -278,6 +278,26 @@ rb_enc_find_index(const char *name) return -1; } +static VALUE +require_enc(VALUE enclib) +{ + return rb_require_safe(enclib, rb_safe_level()); +} + +int +rb_enc_find_index(const char *name) +{ + int i = rb_enc_registered(name); + if (i < 0) { + VALUE enclib = rb_sprintf("enc/%s", name); + OBJ_FREEZE(enclib); + if (RTEST(rb_protect(require_enc, enclib, 0))) + i = rb_enc_registered(name); + rb_set_errinfo(Qnil); + } + return i; +} + rb_encoding * rb_enc_find(const char *name) { |