static int load_encoding(const char *name) { VALUE enclib = rb_sprintf("enc/%s.so", name); VALUE verbose = ruby_verbose; VALUE debug = ruby_debug; VALUE errinfo; char *s = RSTRING_PTR(enclib) + 4, *e = RSTRING_END(enclib) - 3; int loaded; int idx; while (s < e) { if (!ISALNUM(*s)) *s = '_'; else if (ISUPPER(*s)) *s = (char)TOLOWER(*s); ++s; } FL_UNSET(enclib, FL_TAINT); enclib = rb_fstring(enclib); ruby_verbose = Qfalse; ruby_debug = Qfalse; errinfo = rb_errinfo(); loaded = rb_require_internal(enclib, rb_safe_level()); ruby_verbose = verbose; ruby_debug = debug; rb_set_errinfo(errinfo); if (loaded < 0 || 1 < loaded) return -1; if ((idx = rb_enc_registered(name)) < 0) return -1; if (enc_autoload_p(enc_table.list[idx].enc)) return -1; return idx; }
int ruby_require_internal(const char *fname, unsigned int len) { struct RString fake; VALUE str = rb_setup_fake_str(&fake, fname, len, 0); int result = rb_require_internal(str, 0); rb_set_errinfo(Qnil); return result == TAG_RETURN ? 1 : result ? -1 : 0; }
int ruby_require_internal(const char *fname, unsigned int len) { struct RString fake; VALUE str = rb_setup_fake_str(&fake, fname, len, 0); int result = rb_require_internal(str, 0); if (result > 1) result = -1; rb_set_errinfo(Qnil); return result; }
VALUE rb_require_safe(VALUE fname, int safe) { int result = rb_require_internal(fname, safe); if (result > TAG_RETURN) { JUMP_TAG(result); } if (result < 0) { load_failed(fname); } return result ? Qtrue : Qfalse; }
VALUE rb_require_safe(VALUE fname, int safe) { int result = rb_require_internal(fname, safe); if (result > TAG_RETURN) { if (result == TAG_RAISE) rb_exc_raise(rb_errinfo()); EC_JUMP_TAG(GET_EC(), result); } if (result < 0) { load_failed(fname); } return result ? Qtrue : Qfalse; }