diff --git a/prism_compile.c b/prism_compile.c index 764d2fa557..0e507b56d9 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -8153,7 +8153,13 @@ VALUE pm_parse_file(pm_parse_result_t *result, VALUE filepath) { if (!pm_string_mapped_init(&result->input, RSTRING_PTR(filepath))) { - return rb_exc_new3(rb_eRuntimeError, rb_sprintf("Failed to map file: %s", RSTRING_PTR(filepath))); +#ifdef _WIN32 + int e = rb_w32_map_errno(GetLastError()); +#else + int e = errno; +#endif + + return rb_syserr_new(e, RSTRING_PTR(filepath)); } VALUE error = pm_parse_input(result, filepath); diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index e09192a4b2..c48b7ac085 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -2678,6 +2678,22 @@ end assert_prism_eval(":perĂ²") end + def test_parse_file + assert_nothing_raised do + RubyVM::InstructionSequence.compile_file_prism(__FILE__) + end + + error = assert_raise Errno::ENOENT do + RubyVM::InstructionSequence.compile_file_prism("idontexist.rb") + end + + assert_equal "No such file or directory - idontexist.rb", error.message + + assert_raise TypeError do + RubyVM::InstructionSequence.compile_file_prism(nil) + end + end + private def compare_eval(source, raw:)