From b613a2c5ae03c425bc94771e4eced1b80e4e80d0 Mon Sep 17 00:00:00 2001 From: hsbt Date: Mon, 27 Nov 2017 03:11:18 +0000 Subject: Merge psych-3.0.0.beta4 from upstream. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60917 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/psych/psych_parser.c | 49 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 13 deletions(-) (limited to 'ext/psych/psych_parser.c') diff --git a/ext/psych/psych_parser.c b/ext/psych/psych_parser.c index 47ed8744b6..4b18c94761 100644 --- a/ext/psych/psych_parser.c +++ b/ext/psych/psych_parser.c @@ -16,6 +16,7 @@ static ID id_start_sequence; static ID id_end_sequence; static ID id_start_mapping; static ID id_end_mapping; +static ID id_event_location; #define PSYCH_TRANSCODE(_str, _yaml_enc, _internal_enc) \ do { \ @@ -232,6 +233,12 @@ static VALUE protected_end_stream(VALUE handler) return rb_funcall(handler, id_end_stream, 0); } +static VALUE protected_event_location(VALUE pointer) +{ + VALUE *args = (VALUE *)pointer; + return rb_funcall3(args[0], id_event_location, 4, args + 1); +} + /* * call-seq: * parser.parse(yaml) @@ -295,6 +302,21 @@ static VALUE parse(int argc, VALUE *argv, VALUE self) rb_exc_raise(exception); } + VALUE event_args[5]; + VALUE start_line, start_column, end_line, end_column; + + start_line = INT2NUM((long)event.start_mark.line); + start_column = INT2NUM((long)event.start_mark.column); + end_line = INT2NUM((long)event.end_mark.line); + end_column = INT2NUM((long)event.end_mark.column); + + event_args[0] = handler; + event_args[1] = start_line; + event_args[2] = start_column; + event_args[3] = end_line; + event_args[4] = end_column; + rb_protect(protected_event_location, (VALUE)event_args, &state); + switch(event.type) { case YAML_STREAM_START_EVENT: { @@ -551,18 +573,19 @@ void Init_psych_parser(void) rb_define_method(cPsychParser, "parse", parse, -1); rb_define_method(cPsychParser, "mark", mark, 0); - id_read = rb_intern("read"); - id_path = rb_intern("path"); - id_empty = rb_intern("empty"); - id_start_stream = rb_intern("start_stream"); - id_end_stream = rb_intern("end_stream"); - id_start_document = rb_intern("start_document"); - id_end_document = rb_intern("end_document"); - id_alias = rb_intern("alias"); - id_scalar = rb_intern("scalar"); - id_start_sequence = rb_intern("start_sequence"); - id_end_sequence = rb_intern("end_sequence"); - id_start_mapping = rb_intern("start_mapping"); - id_end_mapping = rb_intern("end_mapping"); + id_read = rb_intern("read"); + id_path = rb_intern("path"); + id_empty = rb_intern("empty"); + id_start_stream = rb_intern("start_stream"); + id_end_stream = rb_intern("end_stream"); + id_start_document = rb_intern("start_document"); + id_end_document = rb_intern("end_document"); + id_alias = rb_intern("alias"); + id_scalar = rb_intern("scalar"); + id_start_sequence = rb_intern("start_sequence"); + id_end_sequence = rb_intern("end_sequence"); + id_start_mapping = rb_intern("start_mapping"); + id_end_mapping = rb_intern("end_mapping"); + id_event_location = rb_intern("event_location"); } /* vim: set noet sws=4 sw=4: */ -- cgit v1.2.3