psych 2.2.1 → 5.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +5 -5
  2. data/CONTRIBUTING.md +24 -0
  3. data/{ext/psych/yaml/LICENSE → LICENSE} +9 -7
  4. data/README.md +13 -13
  5. data/ext/psych/depend +14 -0
  6. data/ext/psych/extconf.rb +43 -29
  7. data/ext/psych/psych.c +6 -3
  8. data/ext/psych/psych_emitter.c +10 -9
  9. data/ext/psych/psych_parser.c +69 -72
  10. data/ext/psych/psych_yaml_tree.c +0 -12
  11. data/lib/psych/class_loader.rb +11 -9
  12. data/lib/psych/coder.rb +1 -1
  13. data/lib/psych/core_ext.rb +3 -20
  14. data/lib/psych/exception.rb +17 -3
  15. data/lib/psych/handler.rb +8 -3
  16. data/lib/psych/handlers/document_stream.rb +2 -2
  17. data/lib/psych/handlers/recorder.rb +2 -2
  18. data/lib/psych/json/ruby_events.rb +1 -1
  19. data/lib/psych/json/stream.rb +3 -3
  20. data/lib/psych/json/tree_builder.rb +2 -2
  21. data/lib/psych/json/yaml_events.rb +1 -1
  22. data/lib/psych/nodes/alias.rb +3 -1
  23. data/lib/psych/nodes/document.rb +3 -1
  24. data/lib/psych/nodes/mapping.rb +3 -1
  25. data/lib/psych/nodes/node.rb +24 -5
  26. data/lib/psych/nodes/scalar.rb +4 -2
  27. data/lib/psych/nodes/sequence.rb +3 -1
  28. data/lib/psych/nodes/stream.rb +3 -1
  29. data/lib/psych/nodes.rb +8 -8
  30. data/lib/psych/omap.rb +1 -1
  31. data/lib/psych/parser.rb +14 -1
  32. data/lib/psych/scalar_scanner.rb +39 -47
  33. data/lib/psych/set.rb +1 -1
  34. data/lib/psych/stream.rb +1 -1
  35. data/lib/psych/streaming.rb +1 -1
  36. data/lib/psych/syntax_error.rb +2 -2
  37. data/lib/psych/tree_builder.rb +48 -8
  38. data/lib/psych/versions.rb +5 -4
  39. data/lib/psych/visitors/depth_first.rb +1 -1
  40. data/lib/psych/visitors/emitter.rb +1 -1
  41. data/lib/psych/visitors/json_tree.rb +2 -2
  42. data/lib/psych/visitors/to_ruby.rb +61 -31
  43. data/lib/psych/visitors/visitor.rb +18 -4
  44. data/lib/psych/visitors/yaml_tree.rb +111 -123
  45. data/lib/psych/visitors.rb +7 -7
  46. data/lib/psych/y.rb +1 -1
  47. data/lib/psych.rb +333 -96
  48. metadata +16 -52
  49. data/.gitignore +0 -14
  50. data/.travis.yml +0 -18
  51. data/CHANGELOG.rdoc +0 -576
  52. data/Gemfile +0 -3
  53. data/Mavenfile +0 -7
  54. data/Rakefile +0 -33
  55. data/bin/console +0 -7
  56. data/bin/setup +0 -6
  57. data/ext/psych/.gitignore +0 -11
  58. data/ext/psych/yaml/api.c +0 -1392
  59. data/ext/psych/yaml/config.h +0 -10
  60. data/ext/psych/yaml/dumper.c +0 -394
  61. data/ext/psych/yaml/emitter.c +0 -2329
  62. data/ext/psych/yaml/loader.c +0 -444
  63. data/ext/psych/yaml/parser.c +0 -1374
  64. data/ext/psych/yaml/reader.c +0 -469
  65. data/ext/psych/yaml/scanner.c +0 -3576
  66. data/ext/psych/yaml/writer.c +0 -141
  67. data/ext/psych/yaml/yaml.h +0 -1971
  68. data/ext/psych/yaml/yaml_private.h +0 -662
  69. data/lib/psych/deprecated.rb +0 -86
  70. data/psych.gemspec +0 -43
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b3d0517189a9d9a831b2732d0a6d8392b20292f7
4
- data.tar.gz: '068f28a7615fb785fffb794bd67c4cff126c65a3'
2
+ SHA256:
3
+ metadata.gz: 39bdb85aafa27b992e7e8db6905f6e1bc52976bbfc3f71e0ce1adee552a89682
4
+ data.tar.gz: a8d566aa3e16cde752a41ffdb5990af2b2d4f7082ad8774dbd3a8250636fef20
5
5
  SHA512:
6
- metadata.gz: 8a6b72ff59c6604e90ca759bbdd3cc634c390587bed67bca04d8858db26a1fe58f8521b2d4cc1e6c2ac9e22844da6c6daf2e02a1be5141526c707193bb780e32
7
- data.tar.gz: ef4f1e582bdfb0e088a75db018e642f6e387aee4fb271ad1ad69e9d8f1b42d81893f0524e2b984b25b734ecef83818ec114871f9242ba204fe47ea2e1e663613
6
+ metadata.gz: ca436b4d85c8c931bfc9b05d2f16a52f03d01f65c5d708419f75ce926ba55ef9aa4af95a811fec0309773ec6f8963002ffa5ead5cc2f69e1666d3759f24a688b
7
+ data.tar.gz: bc2aabe53f58a0eb15fed477c96767bc4267ce6bd1f929010c580a0891fdbe28517fdf030a09356dd9b84000c60e1fe7d403d2d9414b5b3a7db8bfa152f5ba5a
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,24 @@
1
+ ## How to contribute to Psych
2
+
3
+ Full details [here](https://bugs.ruby-lang.org/projects/ruby/wiki/HowToContribute)
4
+
5
+ #### **Did you find a bug?**
6
+
7
+ * **Do not open an issue if the bug is a security vulnerability
8
+ in Psych**, instead refer to our [security policy](https://www.ruby-lang.org/en/security/) and email [here](security@ruby-lang.org).
9
+
10
+ * **Ensure the bug was not already reported** by searching on ruby-core, the ruby github repo and on Psych's github repo. More info [here](https://bugs.ruby-lang.org/projects/ruby/wiki/HowToReport)
11
+
12
+ * If you're unable to find an open issue addressing the problem, [open a new one](https://bugs.ruby-lang.org/). Be sure to include a **title and clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring.
13
+
14
+ #### **Did you write a patch that fixes a bug?**
15
+
16
+ * Open a new GitHub pull request with the patch for small fixes. Anything larger look [here](https://bugs.ruby-lang.org/projects/ruby/wiki/HowToContribute); submit a Feature.
17
+
18
+ * Ensure you clearly describe the problem and solution. Include the relevant ticket/issue number if applicable.
19
+
20
+ Psych is a volunteer effort. We encourage you to pitch in and [join the team](https://github.com/ruby/psych/contributors)!
21
+
22
+ Thanks! :heart: :heart: :heart:
23
+
24
+ The Psych Team
@@ -1,11 +1,13 @@
1
- Copyright (c) 2006 Kirill Simonov
1
+ MIT License
2
2
 
3
- Permission is hereby granted, free of charge, to any person obtaining a copy of
4
- this software and associated documentation files (the "Software"), to deal in
5
- the Software without restriction, including without limitation the rights to
6
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
- of the Software, and to permit persons to whom the Software is furnished to do
8
- so, subject to the following conditions:
3
+ Copyright (c) 2009 Aaron Patterson, et al.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
9
11
 
10
12
  The above copyright notice and this permission notice shall be included in all
11
13
  copies or substantial portions of the Software.
data/README.md CHANGED
@@ -1,24 +1,24 @@
1
1
  # Psych
2
2
 
3
- [![Build Status](https://travis-ci.org/ruby/psych.svg?branch=master)](https://travis-ci.org/ruby/psych)
4
- [![Build status](https://ci.appveyor.com/api/projects/status/2t6x109xfmbx209k/branch/master?svg=true)](https://ci.appveyor.com/project/ruby/psych/branch/master)
5
-
6
3
  * https://github.com/ruby/psych
4
+ * https://docs.ruby-lang.org/en/master/Psych.html
7
5
 
8
6
  ## Description
9
7
 
10
8
  Psych is a YAML parser and emitter. Psych leverages
11
- [libyaml](http://pyyaml.org/wiki/LibYAML) for its YAML parsing and emitting
9
+ [libyaml](https://pyyaml.org/wiki/LibYAML) for its YAML parsing and emitting
12
10
  capabilities. In addition to wrapping libyaml, Psych also knows how to
13
11
  serialize and de-serialize most Ruby objects to and from the YAML format.
14
12
 
15
13
  ## Examples
16
14
 
17
- # Load YAML in to a Ruby object
18
- Psych.load('--- foo') # => 'foo'
15
+ ```ruby
16
+ # Safely load YAML in to a Ruby object
17
+ Psych.safe_load('--- foo') # => 'foo'
19
18
 
20
- # Emit YAML from a Ruby object
21
- Psych.dump("foo") # => "--- foo\n...\n"
19
+ # Emit YAML from a Ruby object
20
+ Psych.dump("foo") # => "--- foo\n...\n"
21
+ ```
22
22
 
23
23
  ## Dependencies
24
24
 
@@ -33,6 +33,11 @@ If you want a newer gem release of Psych, you can use rubygems:
33
33
 
34
34
  gem install psych
35
35
 
36
+
37
+ Psych supported the static build with specific version of libyaml sources. You can build psych with libyaml-0.2.5 like this.
38
+
39
+ gem install psych -- --with-libyaml-source-dir=/path/to/libyaml-0.2.5
40
+
36
41
  In order to use the gem release in your app, and not the stdlib version,
37
42
  you'll need the following:
38
43
 
@@ -45,11 +50,6 @@ Or if you use Bundler add this to your `Gemfile`:
45
50
 
46
51
  JRuby ships with a pure Java implementation of Psych.
47
52
 
48
- If you're on Rubinius, Psych is available in 1.9 mode, please refer to the
49
- Language Modes section of the [Rubinius
50
- README](https://github.com/rubinius/rubinius#readme) for more information on
51
- building and 1.9 mode.
52
-
53
53
  ## License
54
54
 
55
55
  Copyright 2009 Aaron Patterson, et al.
data/ext/psych/depend CHANGED
@@ -1,3 +1,17 @@
1
+ $(TARGET_SO): $(LIBYAML)
2
+
3
+ libyaml $(LIBYAML):
4
+ cd libyaml && $(MAKE)
5
+ $(AR) $(ARFLAGS) $(LIBYAML) $(LIBYAML_OBJDIR)/*.$(OBJEXT)
6
+ $(RANLIB) $(LIBYAML)
7
+
8
+ clean-so::
9
+ -cd libyaml && $(MAKE) clean
10
+
11
+ distclean-so::
12
+ -cd libyaml && $(MAKE) distclean
13
+ -$(Q)$(RMDIRS) libyaml/* libyaml
14
+
1
15
  $(OBJS): $(HDRS) $(ruby_headers) \
2
16
  $(hdrdir)/ruby/encoding.h \
3
17
  $(hdrdir)/ruby/oniguruma.h
data/ext/psych/extconf.rb CHANGED
@@ -1,39 +1,53 @@
1
1
  # -*- coding: us-ascii -*-
2
- # frozen_string_literal: false
2
+ # frozen_string_literal: true
3
3
  require 'mkmf'
4
- require 'fileutils'
5
4
 
6
- # :stopdoc:
7
-
8
- dir_config 'libyaml'
9
-
10
- if enable_config("bundled-libyaml", false) || !(find_header('yaml.h') && find_library('yaml', 'yaml_get_version'))
11
- # Embed libyaml since we could not find it.
12
-
13
- $VPATH << "$(srcdir)/yaml"
14
- $INCFLAGS << " -I$(srcdir)/yaml"
15
-
16
- $srcs = Dir.glob("#{$srcdir}/{,yaml/}*.c").map {|n| File.basename(n)}
5
+ if $mswin or $mingw or $cygwin
6
+ $CPPFLAGS << " -DYAML_DECLARE_STATIC"
7
+ end
17
8
 
18
- if have_macro("_WIN32")
19
- $CPPFLAGS << " -DYAML_DECLARE_STATIC -DHAVE_CONFIG_H"
9
+ yaml_source = with_config("libyaml-source-dir")
10
+ if yaml_source
11
+ yaml_source = yaml_source.gsub(/\$\((\w+)\)|\$\{(\w+)\}/) {ENV[$1||$2]}
12
+ yaml_source = yaml_source.chomp("/")
13
+ yaml_configure = "#{File.expand_path(yaml_source)}/configure"
14
+ unless File.exist?(yaml_configure)
15
+ raise "Configure script not found in #{yaml_source.quote}"
20
16
  end
21
17
 
22
- have_header 'dlfcn.h'
23
- have_header 'inttypes.h'
24
- have_header 'memory.h'
25
- have_header 'stdint.h'
26
- have_header 'stdlib.h'
27
- have_header 'strings.h'
28
- have_header 'string.h'
29
- have_header 'sys/stat.h'
30
- have_header 'sys/types.h'
31
- have_header 'unistd.h'
32
-
33
- find_header 'yaml.h'
34
- have_header 'config.h'
18
+ puts("Configuring libyaml source in #{yaml_source.quote}")
19
+ yaml = "libyaml"
20
+ Dir.mkdir(yaml) unless File.directory?(yaml)
21
+ shared = $enable_shared || !$static
22
+ args = [
23
+ yaml_configure,
24
+ "--enable-#{shared ? 'shared' : 'static'}",
25
+ "--host=#{RbConfig::CONFIG['host'].sub(/-unknown-/, '-').sub(/arm64/, 'arm')}",
26
+ "CC=#{RbConfig::CONFIG['CC']}",
27
+ *(["CFLAGS=-w"] if RbConfig::CONFIG["GCC"] == "yes"),
28
+ ]
29
+ puts(args.quote.join(' '))
30
+ unless system(*args, chdir: yaml)
31
+ raise "failed to configure libyaml"
32
+ end
33
+ inc = yaml_source.start_with?("#$srcdir/") ? "$(srcdir)#{yaml_source[$srcdir.size..-1]}" : yaml_source
34
+ $INCFLAGS << " -I#{yaml}/include -I#{inc}/include"
35
+ puts("INCFLAGS=#$INCFLAGS")
36
+ libyaml = "libyaml.#$LIBEXT"
37
+ $cleanfiles << libyaml
38
+ $LOCAL_LIBS.prepend("$(LIBYAML) ")
39
+ else # default to pre-installed libyaml
40
+ pkg_config('yaml-0.1')
41
+ dir_config('libyaml')
42
+ find_header('yaml.h') or abort "yaml.h not found"
43
+ find_library('yaml', 'yaml_get_version') or abort "libyaml not found"
35
44
  end
36
45
 
37
- create_makefile 'psych'
46
+ create_makefile 'psych' do |mk|
47
+ mk << "LIBYAML = #{libyaml}".strip << "\n"
48
+ mk << "LIBYAML_OBJDIR = libyaml/src#{shared ? '/.libs' : ''}\n"
49
+ mk << "OBJEXT = #$OBJEXT"
50
+ mk << "RANLIB = #{config_string('RANLIB') || config_string('NULLCMD')}\n"
51
+ end
38
52
 
39
53
  # :startdoc:
data/ext/psych/psych.c CHANGED
@@ -11,9 +11,9 @@ static VALUE libyaml_version(VALUE module)
11
11
 
12
12
  yaml_get_version(&major, &minor, &patch);
13
13
 
14
- list[0] = INT2NUM((long)major);
15
- list[1] = INT2NUM((long)minor);
16
- list[2] = INT2NUM((long)patch);
14
+ list[0] = INT2NUM(major);
15
+ list[1] = INT2NUM(minor);
16
+ list[2] = INT2NUM(patch);
17
17
 
18
18
  return rb_ary_new4((long)3, list);
19
19
  }
@@ -22,6 +22,9 @@ VALUE mPsych;
22
22
 
23
23
  void Init_psych(void)
24
24
  {
25
+ #ifdef HAVE_RB_EXT_RACTOR_SAFE
26
+ RB_EXT_RACTOR_SAFE(true);
27
+ #endif
25
28
  mPsych = rb_define_module("Psych");
26
29
 
27
30
  rb_define_singleton_method(mPsych, "libyaml_version", libyaml_version, 0);
@@ -192,8 +192,8 @@ static VALUE start_document(VALUE self, VALUE version, VALUE tags, VALUE imp)
192
192
  name = rb_str_export_to_enc(name, encoding);
193
193
  value = rb_str_export_to_enc(value, encoding);
194
194
 
195
- tail->handle = (yaml_char_t *)RSTRING_PTR(name);
196
- tail->prefix = (yaml_char_t *)RSTRING_PTR(value);
195
+ tail->handle = (yaml_char_t *)StringValueCStr(name);
196
+ tail->prefix = (yaml_char_t *)StringValueCStr(value);
197
197
 
198
198
  tail++;
199
199
  }
@@ -272,8 +272,8 @@ static VALUE scalar(
272
272
 
273
273
  yaml_scalar_event_initialize(
274
274
  &event,
275
- (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValuePtr(anchor)),
276
- (yaml_char_t *)(NIL_P(tag) ? NULL : StringValuePtr(tag)),
275
+ (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValueCStr(anchor)),
276
+ (yaml_char_t *)(NIL_P(tag) ? NULL : StringValueCStr(tag)),
277
277
  (yaml_char_t*)StringValuePtr(value),
278
278
  (int)RSTRING_LEN(value),
279
279
  plain ? 1 : 0,
@@ -319,8 +319,8 @@ static VALUE start_sequence(
319
319
 
320
320
  yaml_sequence_start_event_initialize(
321
321
  &event,
322
- (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValuePtr(anchor)),
323
- (yaml_char_t *)(NIL_P(tag) ? NULL : StringValuePtr(tag)),
322
+ (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValueCStr(anchor)),
323
+ (yaml_char_t *)(NIL_P(tag) ? NULL : StringValueCStr(tag)),
324
324
  implicit ? 1 : 0,
325
325
  (yaml_sequence_style_t)NUM2INT(style)
326
326
  );
@@ -383,8 +383,8 @@ static VALUE start_mapping(
383
383
 
384
384
  yaml_mapping_start_event_initialize(
385
385
  &event,
386
- (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValuePtr(anchor)),
387
- (yaml_char_t *)(NIL_P(tag) ? NULL : StringValuePtr(tag)),
386
+ (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValueCStr(anchor)),
387
+ (yaml_char_t *)(NIL_P(tag) ? NULL : StringValueCStr(tag)),
388
388
  implicit ? 1 : 0,
389
389
  (yaml_mapping_style_t)NUM2INT(style)
390
390
  );
@@ -432,7 +432,7 @@ static VALUE alias(VALUE self, VALUE anchor)
432
432
 
433
433
  yaml_alias_event_initialize(
434
434
  &event,
435
- (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValuePtr(anchor))
435
+ (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValueCStr(anchor))
436
436
  );
437
437
 
438
438
  emit(emitter, &event);
@@ -521,6 +521,7 @@ static VALUE set_line_width(VALUE self, VALUE width)
521
521
 
522
522
  void Init_psych_emitter(void)
523
523
  {
524
+ #undef rb_intern
524
525
  VALUE psych = rb_define_module("Psych");
525
526
  VALUE handler = rb_define_class_under(psych, "Handler", rb_cObject);
526
527
  cPsychEmitter = rb_define_class_under(psych, "Emitter", handler);
@@ -1,7 +1,6 @@
1
1
  #include <psych.h>
2
2
 
3
3
  VALUE cPsychParser;
4
- VALUE ePsychSyntaxError;
5
4
 
6
5
  static ID id_read;
7
6
  static ID id_path;
@@ -16,6 +15,7 @@ static ID id_start_sequence;
16
15
  static ID id_end_sequence;
17
16
  static ID id_start_mapping;
18
17
  static ID id_end_mapping;
18
+ static ID id_event_location;
19
19
 
20
20
  #define PSYCH_TRANSCODE(_str, _yaml_enc, _internal_enc) \
21
21
  do { \
@@ -27,7 +27,7 @@ static ID id_end_mapping;
27
27
  static int io_reader(void * data, unsigned char *buf, size_t size, size_t *read)
28
28
  {
29
29
  VALUE io = (VALUE)data;
30
- VALUE string = rb_funcall(io, id_read, 1, INT2NUM(size));
30
+ VALUE string = rb_funcall(io, id_read, 1, SIZET2NUM(size));
31
31
 
32
32
  *read = 0;
33
33
 
@@ -79,18 +79,25 @@ static VALUE allocate(VALUE klass)
79
79
 
80
80
  static VALUE make_exception(yaml_parser_t * parser, VALUE path)
81
81
  {
82
- size_t line, column;
83
-
84
- line = parser->context_mark.line + 1;
85
- column = parser->context_mark.column + 1;
86
-
87
- return rb_funcall(ePsychSyntaxError, rb_intern("new"), 6,
88
- path,
89
- INT2NUM(line),
90
- INT2NUM(column),
91
- INT2NUM(parser->problem_offset),
92
- parser->problem ? rb_usascii_str_new2(parser->problem) : Qnil,
93
- parser->context ? rb_usascii_str_new2(parser->context) : Qnil);
82
+ if (parser->error == YAML_MEMORY_ERROR) {
83
+ return rb_eNoMemError;
84
+ } else {
85
+ size_t line, column;
86
+ VALUE ePsychSyntaxError;
87
+
88
+ line = parser->context_mark.line + 1;
89
+ column = parser->context_mark.column + 1;
90
+
91
+ ePsychSyntaxError = rb_const_get(mPsych, rb_intern("SyntaxError"));
92
+
93
+ return rb_funcall(ePsychSyntaxError, rb_intern("new"), 6,
94
+ path,
95
+ SIZET2NUM(line),
96
+ SIZET2NUM(column),
97
+ SIZET2NUM(parser->problem_offset),
98
+ parser->problem ? rb_usascii_str_new2(parser->problem) : Qnil,
99
+ parser->context ? rb_usascii_str_new2(parser->context) : Qnil);
100
+ }
94
101
  }
95
102
 
96
103
  static VALUE transcode_string(VALUE src, int * parser_encoding)
@@ -232,47 +239,31 @@ static VALUE protected_end_stream(VALUE handler)
232
239
  return rb_funcall(handler, id_end_stream, 0);
233
240
  }
234
241
 
235
- /*
236
- * call-seq:
237
- * parser.parse(yaml)
238
- *
239
- * Parse the YAML document contained in +yaml+. Events will be called on
240
- * the handler set on the parser instance.
241
- *
242
- * See Psych::Parser and Psych::Parser#handler
243
- */
244
- static VALUE parse(int argc, VALUE *argv, VALUE self)
242
+ static VALUE protected_event_location(VALUE pointer)
243
+ {
244
+ VALUE *args = (VALUE *)pointer;
245
+ return rb_funcall3(args[0], id_event_location, 4, args + 1);
246
+ }
247
+
248
+ static VALUE parse(VALUE self, VALUE handler, VALUE yaml, VALUE path)
245
249
  {
246
- VALUE yaml, path;
247
250
  yaml_parser_t * parser;
248
251
  yaml_event_t event;
249
252
  int done = 0;
250
- int tainted = 0;
251
253
  int state = 0;
252
254
  int parser_encoding = YAML_ANY_ENCODING;
253
255
  int encoding = rb_utf8_encindex();
254
256
  rb_encoding * internal_enc = rb_default_internal_encoding();
255
- VALUE handler = rb_iv_get(self, "@handler");
256
-
257
- if (rb_scan_args(argc, argv, "11", &yaml, &path) == 1) {
258
- if(rb_respond_to(yaml, id_path))
259
- path = rb_funcall(yaml, id_path, 0);
260
- else
261
- path = rb_str_new2("<unknown>");
262
- }
263
257
 
264
258
  TypedData_Get_Struct(self, yaml_parser_t, &psych_parser_type, parser);
265
259
 
266
260
  yaml_parser_delete(parser);
267
261
  yaml_parser_initialize(parser);
268
262
 
269
- if (OBJ_TAINTED(yaml)) tainted = 1;
270
-
271
263
  if (rb_respond_to(yaml, id_read)) {
272
264
  yaml = transcode_io(yaml, &parser_encoding);
273
265
  yaml_parser_set_encoding(parser, parser_encoding);
274
266
  yaml_parser_set_input(parser, io_reader, (void *)yaml);
275
- if (RTEST(rb_obj_is_kind_of(yaml, rb_cIO))) tainted = 1;
276
267
  } else {
277
268
  StringValue(yaml);
278
269
  yaml = transcode_string(yaml, &parser_encoding);
@@ -285,7 +276,10 @@ static VALUE parse(int argc, VALUE *argv, VALUE self)
285
276
  }
286
277
 
287
278
  while(!done) {
288
- if(!yaml_parser_parse(parser, &event)) {
279
+ VALUE event_args[5];
280
+ VALUE start_line, start_column, end_line, end_column;
281
+
282
+ if(parser->error || !yaml_parser_parse(parser, &event)) {
289
283
  VALUE exception;
290
284
 
291
285
  exception = make_exception(parser, path);
@@ -295,13 +289,25 @@ static VALUE parse(int argc, VALUE *argv, VALUE self)
295
289
  rb_exc_raise(exception);
296
290
  }
297
291
 
292
+ start_line = SIZET2NUM(event.start_mark.line);
293
+ start_column = SIZET2NUM(event.start_mark.column);
294
+ end_line = SIZET2NUM(event.end_mark.line);
295
+ end_column = SIZET2NUM(event.end_mark.column);
296
+
297
+ event_args[0] = handler;
298
+ event_args[1] = start_line;
299
+ event_args[2] = start_column;
300
+ event_args[3] = end_line;
301
+ event_args[4] = end_column;
302
+ rb_protect(protected_event_location, (VALUE)event_args, &state);
303
+
298
304
  switch(event.type) {
299
305
  case YAML_STREAM_START_EVENT:
300
306
  {
301
307
  VALUE args[2];
302
308
 
303
309
  args[0] = handler;
304
- args[1] = INT2NUM((long)event.data.stream_start.encoding);
310
+ args[1] = INT2NUM(event.data.stream_start.encoding);
305
311
  rb_protect(protected_start_stream, (VALUE)args, &state);
306
312
  }
307
313
  break;
@@ -314,8 +320,8 @@ static VALUE parse(int argc, VALUE *argv, VALUE self)
314
320
  VALUE version = event.data.document_start.version_directive ?
315
321
  rb_ary_new3(
316
322
  (long)2,
317
- INT2NUM((long)event.data.document_start.version_directive->major),
318
- INT2NUM((long)event.data.document_start.version_directive->minor)
323
+ INT2NUM(event.data.document_start.version_directive->major),
324
+ INT2NUM(event.data.document_start.version_directive->minor)
319
325
  ) : rb_ary_new();
320
326
 
321
327
  if(event.data.document_start.tag_directives.start) {
@@ -328,13 +334,11 @@ static VALUE parse(int argc, VALUE *argv, VALUE self)
328
334
  VALUE prefix = Qnil;
329
335
  if(start->handle) {
330
336
  handle = rb_str_new2((const char *)start->handle);
331
- if (tainted) OBJ_TAINT(handle);
332
337
  PSYCH_TRANSCODE(handle, encoding, internal_enc);
333
338
  }
334
339
 
335
340
  if(start->prefix) {
336
341
  prefix = rb_str_new2((const char *)start->prefix);
337
- if (tainted) OBJ_TAINT(prefix);
338
342
  PSYCH_TRANSCODE(prefix, encoding, internal_enc);
339
343
  }
340
344
 
@@ -363,7 +367,6 @@ static VALUE parse(int argc, VALUE *argv, VALUE self)
363
367
  VALUE alias = Qnil;
364
368
  if(event.data.alias.anchor) {
365
369
  alias = rb_str_new2((const char *)event.data.alias.anchor);
366
- if (tainted) OBJ_TAINT(alias);
367
370
  PSYCH_TRANSCODE(alias, encoding, internal_enc);
368
371
  }
369
372
 
@@ -382,19 +385,16 @@ static VALUE parse(int argc, VALUE *argv, VALUE self)
382
385
  (const char *)event.data.scalar.value,
383
386
  (long)event.data.scalar.length
384
387
  );
385
- if (tainted) OBJ_TAINT(val);
386
388
 
387
389
  PSYCH_TRANSCODE(val, encoding, internal_enc);
388
390
 
389
391
  if(event.data.scalar.anchor) {
390
392
  anchor = rb_str_new2((const char *)event.data.scalar.anchor);
391
- if (tainted) OBJ_TAINT(anchor);
392
393
  PSYCH_TRANSCODE(anchor, encoding, internal_enc);
393
394
  }
394
395
 
395
396
  if(event.data.scalar.tag) {
396
397
  tag = rb_str_new2((const char *)event.data.scalar.tag);
397
- if (tainted) OBJ_TAINT(tag);
398
398
  PSYCH_TRANSCODE(tag, encoding, internal_enc);
399
399
  }
400
400
 
@@ -404,7 +404,7 @@ static VALUE parse(int argc, VALUE *argv, VALUE self)
404
404
  quoted_implicit =
405
405
  event.data.scalar.quoted_implicit == 0 ? Qfalse : Qtrue;
406
406
 
407
- style = INT2NUM((long)event.data.scalar.style);
407
+ style = INT2NUM(event.data.scalar.style);
408
408
 
409
409
  args[0] = handler;
410
410
  args[1] = val;
@@ -424,21 +424,19 @@ static VALUE parse(int argc, VALUE *argv, VALUE self)
424
424
  VALUE implicit, style;
425
425
  if(event.data.sequence_start.anchor) {
426
426
  anchor = rb_str_new2((const char *)event.data.sequence_start.anchor);
427
- if (tainted) OBJ_TAINT(anchor);
428
427
  PSYCH_TRANSCODE(anchor, encoding, internal_enc);
429
428
  }
430
429
 
431
430
  tag = Qnil;
432
431
  if(event.data.sequence_start.tag) {
433
432
  tag = rb_str_new2((const char *)event.data.sequence_start.tag);
434
- if (tainted) OBJ_TAINT(tag);
435
433
  PSYCH_TRANSCODE(tag, encoding, internal_enc);
436
434
  }
437
435
 
438
436
  implicit =
439
437
  event.data.sequence_start.implicit == 0 ? Qfalse : Qtrue;
440
438
 
441
- style = INT2NUM((long)event.data.sequence_start.style);
439
+ style = INT2NUM(event.data.sequence_start.style);
442
440
 
443
441
  args[0] = handler;
444
442
  args[1] = anchor;
@@ -460,20 +458,18 @@ static VALUE parse(int argc, VALUE *argv, VALUE self)
460
458
  VALUE implicit, style;
461
459
  if(event.data.mapping_start.anchor) {
462
460
  anchor = rb_str_new2((const char *)event.data.mapping_start.anchor);
463
- if (tainted) OBJ_TAINT(anchor);
464
461
  PSYCH_TRANSCODE(anchor, encoding, internal_enc);
465
462
  }
466
463
 
467
464
  if(event.data.mapping_start.tag) {
468
465
  tag = rb_str_new2((const char *)event.data.mapping_start.tag);
469
- if (tainted) OBJ_TAINT(tag);
470
466
  PSYCH_TRANSCODE(tag, encoding, internal_enc);
471
467
  }
472
468
 
473
469
  implicit =
474
470
  event.data.mapping_start.implicit == 0 ? Qfalse : Qtrue;
475
471
 
476
- style = INT2NUM((long)event.data.mapping_start.style);
472
+ style = INT2NUM(event.data.mapping_start.style);
477
473
 
478
474
  args[0] = handler;
479
475
  args[1] = anchor;
@@ -517,15 +513,16 @@ static VALUE mark(VALUE self)
517
513
 
518
514
  TypedData_Get_Struct(self, yaml_parser_t, &psych_parser_type, parser);
519
515
  mark_klass = rb_const_get_at(cPsychParser, rb_intern("Mark"));
520
- args[0] = INT2NUM(parser->mark.index);
521
- args[1] = INT2NUM(parser->mark.line);
522
- args[2] = INT2NUM(parser->mark.column);
516
+ args[0] = SIZET2NUM(parser->mark.index);
517
+ args[1] = SIZET2NUM(parser->mark.line);
518
+ args[2] = SIZET2NUM(parser->mark.column);
523
519
 
524
520
  return rb_class_new_instance(3, args, mark_klass);
525
521
  }
526
522
 
527
523
  void Init_psych_parser(void)
528
524
  {
525
+ #undef rb_intern
529
526
  #if 0
530
527
  mPsych = rb_define_module("Psych");
531
528
  #endif
@@ -546,23 +543,23 @@ void Init_psych_parser(void)
546
543
  rb_define_const(cPsychParser, "UTF16BE", INT2NUM(YAML_UTF16BE_ENCODING));
547
544
 
548
545
  rb_require("psych/syntax_error");
549
- ePsychSyntaxError = rb_const_get(mPsych, rb_intern("SyntaxError"));
550
546
 
551
- rb_define_method(cPsychParser, "parse", parse, -1);
547
+ rb_define_private_method(cPsychParser, "_native_parse", parse, 3);
552
548
  rb_define_method(cPsychParser, "mark", mark, 0);
553
549
 
554
- id_read = rb_intern("read");
555
- id_path = rb_intern("path");
556
- id_empty = rb_intern("empty");
557
- id_start_stream = rb_intern("start_stream");
558
- id_end_stream = rb_intern("end_stream");
559
- id_start_document = rb_intern("start_document");
560
- id_end_document = rb_intern("end_document");
561
- id_alias = rb_intern("alias");
562
- id_scalar = rb_intern("scalar");
563
- id_start_sequence = rb_intern("start_sequence");
564
- id_end_sequence = rb_intern("end_sequence");
565
- id_start_mapping = rb_intern("start_mapping");
566
- id_end_mapping = rb_intern("end_mapping");
550
+ id_read = rb_intern("read");
551
+ id_path = rb_intern("path");
552
+ id_empty = rb_intern("empty");
553
+ id_start_stream = rb_intern("start_stream");
554
+ id_end_stream = rb_intern("end_stream");
555
+ id_start_document = rb_intern("start_document");
556
+ id_end_document = rb_intern("end_document");
557
+ id_alias = rb_intern("alias");
558
+ id_scalar = rb_intern("scalar");
559
+ id_start_sequence = rb_intern("start_sequence");
560
+ id_end_sequence = rb_intern("end_sequence");
561
+ id_start_mapping = rb_intern("start_mapping");
562
+ id_end_mapping = rb_intern("end_mapping");
563
+ id_event_location = rb_intern("event_location");
567
564
  }
568
565
  /* vim: set noet sws=4 sw=4: */
@@ -2,23 +2,11 @@
2
2
 
3
3
  VALUE cPsychVisitorsYamlTree;
4
4
 
5
- /*
6
- * call-seq: private_iv_get(target, prop)
7
- *
8
- * Get the private instance variable +prop+ from +target+
9
- */
10
- static VALUE private_iv_get(VALUE self, VALUE target, VALUE prop)
11
- {
12
- return rb_attr_get(target, rb_intern(StringValuePtr(prop)));
13
- }
14
-
15
5
  void Init_psych_yaml_tree(void)
16
6
  {
17
7
  VALUE psych = rb_define_module("Psych");
18
8
  VALUE visitors = rb_define_module_under(psych, "Visitors");
19
9
  VALUE visitor = rb_define_class_under(visitors, "Visitor", rb_cObject);
20
10
  cPsychVisitorsYamlTree = rb_define_class_under(visitors, "YAMLTree", visitor);
21
-
22
- rb_define_private_method(cPsychVisitorsYamlTree, "private_iv_get", private_iv_get, 2);
23
11
  }
24
12
  /* vim: set noet sws=4 sw=4: */