diff --git a/ext/mini_racer_extension/mini_racer_extension.c b/ext/mini_racer_extension/mini_racer_extension.c index 3e2c135..829cda3 100644 --- a/ext/mini_racer_extension/mini_racer_extension.c +++ b/ext/mini_racer_extension/mini_racer_extension.c @@ -1005,8 +1005,8 @@ static void handle_exception(VALUE e) if (NIL_P(e)) return; - StringValue(e); - s = RSTRING_PTR(e); + e = StringValue(e); + s = StringValueCStr(e); switch (*s) { case NO_ERROR: return; @@ -1028,7 +1028,7 @@ static void handle_exception(VALUE e) default: rb_raise(internal_error, "bad error class %02x", *s); } - rb_raise(klass, "%s", s+1); + rb_enc_raise(rb_enc_get(e), klass, "%s", s+1); } static VALUE context_alloc(VALUE klass) diff --git a/test/mini_racer_test.rb b/test/mini_racer_test.rb index 03fceab..0fb4203 100644 --- a/test/mini_racer_test.rb +++ b/test/mini_racer_test.rb @@ -1172,4 +1172,15 @@ def test_large_integer assert_equal(types, %w[number bigint number bigint]) end end + + def test_exception_message_encoding + e = nil + begin + MiniRacer::Context.new.eval("throw Error('รค')") + rescue MiniRacer::RuntimeError => e_ + e = e_ + end + assert e + assert_equal(e.message.encoding.to_s, "UTF-8") + end end