summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2017-09-10 20:17:05 -0700
committerGitHub <noreply@github.com>2017-09-10 20:17:05 -0700
commitbbdd6637e37d4b821a8c7075e9ccd17ea0e07569 (patch)
tree2d43a27216316f248533ab6e3e36aa47ef733166 /ext
parentb572261900893df0352d3ad71c17dfa81ab17ccc (diff)
parent00d1ab44a9ede3f016c640659a1202de701d6648 (diff)
downloadpsych-bbdd6637e37d4b821a8c7075e9ccd17ea0e07569.tar.gz
Merge pull request #326 from asterite/feature/scalar_location
Add Psych::Handler#event_location
Diffstat (limited to 'ext')
-rw-r--r--ext/java/PsychParser.java7
-rw-r--r--ext/psych/psych_parser.c49
2 files changed, 43 insertions, 13 deletions
diff --git a/ext/java/PsychParser.java b/ext/java/PsychParser.java
index f5b6faf..db0306b 100644
--- a/ext/java/PsychParser.java
+++ b/ext/java/PsychParser.java
@@ -197,6 +197,12 @@ public class PsychParser extends RubyObject {
while (true) {
event = parser.getEvent();
+ IRubyObject start_line = runtime.newFixnum(event.getStartMark().getLine());
+ IRubyObject start_column = runtime.newFixnum(event.getStartMark().getColumn());
+ IRubyObject end_line = runtime.newFixnum(event.getEndMark().getLine());
+ IRubyObject end_column = runtime.newFixnum(event.getEndMark().getColumn());
+ invoke(context, handler, "event_location", start_line, start_column, end_line, end_column);
+
// FIXME: Event should expose a getID, so it can be switched
if (event.is(ID.StreamStart)) {
invoke(context, handler, "start_stream", runtime.newFixnum(YAML_ANY_ENCODING.ordinal()));
@@ -284,6 +290,7 @@ public class PsychParser extends RubyObject {
private void handleScalar(ThreadContext context, ScalarEvent se, boolean tainted, IRubyObject handler) {
Ruby runtime = context.runtime;
+
IRubyObject anchor = stringOrNilFor(runtime, se.getAnchor(), tainted);
IRubyObject tag = stringOrNilFor(runtime, se.getTag(), tainted);
IRubyObject plain_implicit = runtime.newBoolean(se.getImplicit().canOmitTagInPlainScalar());
diff --git a/ext/psych/psych_parser.c b/ext/psych/psych_parser.c
index 47ed874..4b18c94 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: */