Index: encoding.c =================================================================== --- encoding.c (revision 54963) +++ encoding.c (working copy) @@ -12,6 +12,7 @@ #include "internal.h" #include "encindex.h" #include "regenc.h" +#include "vm_core.h" #include #include "ruby/util.h" @@ -1345,6 +1346,19 @@ rb_usascii_encindex(void) return ENCINDEX_US_ASCII; } +int +rb_source_encindex(void) +{ + int idx = GET_VM()->src_encoding_index; + return idx < 0 ? ENCINDEX_UTF_8 : idx; +} + +rb_encoding * +rb_source_encoding(void) +{ + return rb_enc_from_index(rb_source_encindex()); +} + int rb_locale_charmap_index(void); int Index: internal.h =================================================================== --- internal.h (revision 54963) +++ internal.h (working copy) @@ -924,6 +924,8 @@ void rb_enc_set_base(const char *name, const char int rb_enc_set_dummy(int index); void rb_encdb_set_unicode(int index); PUREFUNC(int rb_data_is_encoding(VALUE obj)); +int rb_source_encindex(void); +rb_encoding *rb_source_encoding(void); /* enum.c */ VALUE rb_f_send(int argc, VALUE *argv, VALUE recv); Index: numeric.c =================================================================== --- numeric.c (revision 54963) +++ numeric.c (working copy) @@ -3055,7 +3055,7 @@ int_chr(int argc, VALUE *argv, VALUE num) if (0xff < i) { enc = rb_default_internal_encoding(); if (!enc) { - rb_raise(rb_eRangeError, "%d out of char range", i); + enc = rb_source_encoding(); } goto decode; }