Skip to content

Commit

Permalink
[PRISM] Raise syntax errors when found
Browse files Browse the repository at this point in the history
  • Loading branch information
kddnewton committed Jan 11, 2024
1 parent 45dd8ed commit 44d0c5a
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 14 deletions.
2 changes: 2 additions & 0 deletions common.mk
Original file line number Diff line number Diff line change
Expand Up @@ -8495,6 +8495,7 @@ iseq.$(OBJEXT): $(top_srcdir)/internal/fixnum.h
iseq.$(OBJEXT): $(top_srcdir)/internal/gc.h
iseq.$(OBJEXT): $(top_srcdir)/internal/hash.h
iseq.$(OBJEXT): $(top_srcdir)/internal/imemo.h
iseq.$(OBJEXT): $(top_srcdir)/internal/io.h
iseq.$(OBJEXT): $(top_srcdir)/internal/numeric.h
iseq.$(OBJEXT): $(top_srcdir)/internal/parse.h
iseq.$(OBJEXT): $(top_srcdir)/internal/rational.h
Expand Down Expand Up @@ -8702,6 +8703,7 @@ iseq.$(OBJEXT): {$(VPATH)}internal/value_type.h
iseq.$(OBJEXT): {$(VPATH)}internal/variable.h
iseq.$(OBJEXT): {$(VPATH)}internal/warning_push.h
iseq.$(OBJEXT): {$(VPATH)}internal/xmalloc.h
iseq.$(OBJEXT): {$(VPATH)}io.h
iseq.$(OBJEXT): {$(VPATH)}iseq.c
iseq.$(OBJEXT): {$(VPATH)}iseq.h
iseq.$(OBJEXT): {$(VPATH)}method.h
Expand Down
38 changes: 28 additions & 10 deletions iseq.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include "internal/file.h"
#include "internal/gc.h"
#include "internal/hash.h"
#include "internal/io.h"
#include "internal/ruby_parser.h"
#include "internal/sanitizers.h"
#include "internal/symbol.h"
Expand Down Expand Up @@ -1404,19 +1405,36 @@ static void
iseqw_s_compile_prism_compile(pm_parser_t *parser, VALUE opt, rb_iseq_t *iseq, VALUE file, VALUE path, int first_lineno)
{
pm_node_t *node = pm_parse(parser);
rb_code_location_t code_location;
pm_code_location(&code_location, &parser->newline_list, &node->location);

rb_compile_option_t option;
make_compile_option(&option, opt);
prepare_iseq_build(iseq, rb_fstring_lit("<compiled>"), file, path, first_lineno, &code_location, -1, NULL, 0, ISEQ_TYPE_TOP, Qnil, &option);
if (parser->error_list.size > 0) {
pm_buffer_t buffer = { 0 };
pm_parser_errors_format(parser, &buffer, rb_stderr_tty_p());

pm_scope_node_t scope_node;
pm_scope_node_init(node, &scope_node, NULL, parser);
rb_iseq_compile_prism_node(iseq, &scope_node, parser);
pm_buffer_prepend_string(&buffer, "syntax errors found\n", 20);
VALUE error = rb_exc_new(rb_eSyntaxError, pm_buffer_value(&buffer), pm_buffer_length(&buffer));

finish_iseq_build(iseq);
pm_node_destroy(parser, node);
pm_buffer_free(&buffer);
pm_node_destroy(parser, node);

// TODO: We need to set the backtrace based on the ISEQ.
// VALUE path = pathobj_path(ISEQ_BODY(iseq)->location.pathobj);
// rb_funcallv(error, rb_intern("set_backtrace"), 1, &path);
rb_exc_raise(error);
} else {
rb_code_location_t code_location;
pm_code_location(&code_location, &parser->newline_list, &node->location);

rb_compile_option_t option;
make_compile_option(&option, opt);
prepare_iseq_build(iseq, rb_fstring_lit("<compiled>"), file, path, first_lineno, &code_location, -1, NULL, 0, ISEQ_TYPE_TOP, Qnil, &option);

pm_scope_node_t scope_node;
pm_scope_node_init(node, &scope_node, NULL, parser);
rb_iseq_compile_prism_node(iseq, &scope_node, parser);

finish_iseq_build(iseq);
pm_node_destroy(parser, node);
}
}

static VALUE
Expand Down
11 changes: 7 additions & 4 deletions test/ruby/test_iseq.rb
Original file line number Diff line number Diff line change
Expand Up @@ -801,12 +801,15 @@ def test_ibf_bignum

def test_compile_prism_with_file
Tempfile.create(%w"test_iseq .rb") do |f|
f.puts "name = 'Prism'; puts 'hello"
f.puts "name = 'Prism'; puts 'hello'"
f.close

assert_nothing_raised(SyntaxError) {
RubyVM::InstructionSequence.compile_prism(f.path)
}
assert_nothing_raised(TypeError) do
begin
RubyVM::InstructionSequence.compile_prism(f.path)
rescue SyntaxError
end
end
end
end
end

0 comments on commit 44d0c5a

Please sign in to comment.