summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-03-28 10:47:04 -0400
committerKevin Newton <kddnewton@gmail.com>2024-03-28 12:04:35 -0400
commitd583616f32795de61ecd4efd60346c278873da7f (patch)
tree12e5a2e5aacc86f290105326396306bb93e58cb2
parent35ff302893dfb1efd03ea17e76b9a09e2d3377a2 (diff)
[ruby/prism] Ensure deserialization works with errors+warnings>256
https://github.com/ruby/prism/commit/f540e830b5
-rw-r--r--prism/extension.c3
-rw-r--r--prism/templates/lib/prism/serialize.rb.erb8
-rw-r--r--prism/templates/src/serialize.c.erb2
-rw-r--r--test/prism/command_line_test.rb19
4 files changed, 28 insertions, 4 deletions
diff --git a/prism/extension.c b/prism/extension.c
index d19a004beb..27e799a8da 100644
--- a/prism/extension.c
+++ b/prism/extension.c
@@ -451,6 +451,9 @@ parser_errors(pm_parser_t *parser, rb_encoding *encoding, VALUE source) {
case PM_ERROR_LEVEL_ARGUMENT:
level = ID2SYM(rb_intern("argument"));
break;
+ case PM_ERROR_LEVEL_LOAD:
+ level = ID2SYM(rb_intern("load"));
+ break;
default:
rb_raise(rb_eRuntimeError, "Unknown level: %" PRIu8, error->level);
}
diff --git a/prism/templates/lib/prism/serialize.rb.erb b/prism/templates/lib/prism/serialize.rb.erb
index 1a723f64af..ac7ab4fff3 100644
--- a/prism/templates/lib/prism/serialize.rb.erb
+++ b/prism/templates/lib/prism/serialize.rb.erb
@@ -131,8 +131,8 @@ module Prism
comments = load_comments
magic_comments = Array.new(load_varuint) { MagicComment.new(load_location_object, load_location_object) }
data_loc = load_optional_location_object
- errors = Array.new(load_varuint) { ParseError.new(DIAGNOSTIC_TYPES[io.getbyte], load_embedded_string, load_location_object, load_error_level) }
- warnings = Array.new(load_varuint) { ParseWarning.new(DIAGNOSTIC_TYPES[io.getbyte], load_embedded_string, load_location_object, load_warning_level) }
+ errors = Array.new(load_varuint) { ParseError.new(DIAGNOSTIC_TYPES[load_varuint], load_embedded_string, load_location_object, load_error_level) }
+ warnings = Array.new(load_varuint) { ParseWarning.new(DIAGNOSTIC_TYPES[load_varuint], load_embedded_string, load_location_object, load_warning_level) }
[comments, magic_comments, data_loc, errors, warnings]
end
@@ -296,9 +296,11 @@ module Prism
case level
when 0
- :fatal
+ :syntax
when 1
:argument
+ when 2
+ :load
else
raise "Unknown level: #{level}"
end
diff --git a/prism/templates/src/serialize.c.erb b/prism/templates/src/serialize.c.erb
index 94b976645d..97101e36d5 100644
--- a/prism/templates/src/serialize.c.erb
+++ b/prism/templates/src/serialize.c.erb
@@ -220,7 +220,7 @@ pm_serialize_data_loc(const pm_parser_t *parser, pm_buffer_t *buffer) {
static void
pm_serialize_diagnostic(pm_parser_t *parser, pm_diagnostic_t *diagnostic, pm_buffer_t *buffer) {
// serialize the type
- pm_buffer_append_byte(buffer, (uint8_t) diagnostic->diag_id);
+ pm_buffer_append_varuint(buffer, (uint32_t) diagnostic->diag_id);
// serialize message
size_t message_length = strlen(diagnostic->message);
diff --git a/test/prism/command_line_test.rb b/test/prism/command_line_test.rb
index 96ceb2da38..4b04c36f3a 100644
--- a/test/prism/command_line_test.rb
+++ b/test/prism/command_line_test.rb
@@ -88,5 +88,24 @@ module Prism
assert_kind_of IntegerNode, result.value.statements.body.first
end
+
+ def test_command_line_x_implicit_fail
+ result = Prism.parse(<<~RUBY)
+ #!/bin/bash
+ exit 1
+ RUBY
+
+ assert_equal 1, result.errors.length
+ assert_equal :load, result.errors.first.level
+ end
+
+ def test_command_line_x_explicit_fail
+ result = Prism.parse(<<~RUBY, command_line: "x")
+ exit 1
+ RUBY
+
+ assert_equal 1, result.errors.length
+ assert_equal :load, result.errors.first.level
+ end
end
end