summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--ext/psych/parser.c19
-rw-r--r--test/psych/test_parser.rb7
3 files changed, 24 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 660a6e062e..825120b916 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Nov 30 09:09:37 2011 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/parser.c (parse): parse method can take an option file
+ name for use in exception messages.
+ * test/psych/test_parser.rb: corresponding tests.
+
Tue Nov 29 09:07:59 2011 Eric Hodel <drbrain@segment7.net>
* lib/mkmf.rb: Fix indentations of constants at end of module.
diff --git a/ext/psych/parser.c b/ext/psych/parser.c
index 987fd7ad40..70a5865edb 100644
--- a/ext/psych/parser.c
+++ b/ext/psych/parser.c
@@ -84,8 +84,9 @@ static VALUE make_exception(yaml_parser_t * parser, VALUE path)
*
* See Psych::Parser and Psych::Parser#handler
*/
-static VALUE parse(VALUE self, VALUE yaml)
+static VALUE parse(int argc, VALUE *argv, VALUE self)
{
+ VALUE yaml, path;
yaml_parser_t * parser;
yaml_event_t event;
int done = 0;
@@ -96,6 +97,13 @@ static VALUE parse(VALUE self, VALUE yaml)
#endif
VALUE handler = rb_iv_get(self, "@handler");
+ if (rb_scan_args(argc, argv, "11", &yaml, &path) == 1) {
+ if(rb_respond_to(yaml, id_path))
+ path = rb_funcall(yaml, id_path, 0);
+ else
+ path = rb_str_new2("<unknown>");
+ }
+
Data_Get_Struct(self, yaml_parser_t, parser);
if (OBJ_TAINTED(yaml)) tainted = 1;
@@ -114,12 +122,7 @@ static VALUE parse(VALUE self, VALUE yaml)
while(!done) {
if(!yaml_parser_parse(parser, &event)) {
- VALUE path, exception;
-
- if(rb_respond_to(yaml, id_path))
- path = rb_funcall(yaml, id_path, 0);
- else
- path = rb_str_new2("<unknown>");
+ VALUE exception;
exception = make_exception(parser, path);
yaml_parser_delete(parser);
@@ -392,7 +395,7 @@ void Init_psych_parser()
rb_require("psych/syntax_error");
ePsychSyntaxError = rb_define_class_under(mPsych, "SyntaxError", rb_eSyntaxError);
- rb_define_method(cPsychParser, "parse", parse, 1);
+ rb_define_method(cPsychParser, "parse", parse, -1);
rb_define_method(cPsychParser, "mark", mark, 0);
rb_define_method(cPsychParser, "external_encoding=", set_external_encoding, 1);
diff --git a/test/psych/test_parser.rb b/test/psych/test_parser.rb
index decb241d19..b607514fe6 100644
--- a/test/psych/test_parser.rb
+++ b/test/psych/test_parser.rb
@@ -32,6 +32,13 @@ module Psych
@handler.parser = @parser
end
+ def test_filename
+ ex = assert_raises(Psych::SyntaxError) do
+ @parser.parse '--- `', 'omg!'
+ end
+ assert_match 'omg!', ex.message
+ end
+
def test_line_numbers
assert_equal 0, @parser.mark.line
@parser.parse "---\n- hello\n- world"