psych 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fe34c7fff6c7f07684a5412a451321413187345f
4
- data.tar.gz: 5945ad3ed259b7e40a6a29768582499ba7b28f70
3
+ metadata.gz: a1a904cdbd6c9e16a3b3857c895342397510bc5a
4
+ data.tar.gz: b4c98d184e105fce013d938635273f8e96ec7ce1
5
5
  SHA512:
6
- metadata.gz: 0630bc4eec665fed10bae438834a519ccb23d0a2ea0a85fb889f3115859b3805f6480829c184d0a3cdd813db6b94bbbff7083772dca74b5243693912181bbd8e
7
- data.tar.gz: c16d08618c06280e848a535f669f182a145ede5c6f1e1377f13159d33cf352ff49825667b292cbf21fbbef92bd15374f370afddff41bd0f2c144d14ce59bb76e
6
+ metadata.gz: 1a1e6b690f408452c7b0f997ec8dc2c0b904ce3741bed5c9c571c0991b656296a7033e291fe37024f4f068807cf2828fe464a9369955666a4bf73f2efe31c67d
7
+ data.tar.gz: de45125a31f1e676f80c25cf34be04bb27c0da721baa92a548fbda4154a52d8169722b832f3a656eee8b2fd66435bd2f24634e2542552ce99113658fe4251764
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,22 @@
1
+ Wed Feb 5 04:16:41 2014 Aaron Patterson <aaron@tenderlovemaking.com>
2
+
3
+ * ext/psych/yaml/emitter.c: merge libyaml 0.1.5
4
+ * ext/psych/yaml/loader.c: ditto
5
+ * ext/psych/yaml/parser.c: ditto
6
+ * ext/psych/yaml/reader.c: ditto
7
+ * ext/psych/yaml/scanner.c: ditto
8
+ * ext/psych/yaml/writer.c: ditto
9
+ * ext/psych/yaml/yaml_private.h: ditto
10
+
11
+ Thu Jan 9 09:55:20 2014 Aaron Patterson <aaron@tenderlovemaking.com>
12
+
13
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: dumping strings with
14
+ quotes should not have changed. [ruby-core:59316] [Bug #9300]
15
+
16
+ * ext/psych/lib/psych.rb: fixed missing require.
17
+
18
+ * test/psych/test_string.rb: test
19
+
1
20
  Wed Nov 27 06:40:18 2013 Aaron Patterson <aaron@tenderlovemaking.com>
2
21
 
3
22
  * ext/psych/lib/psych/scalar_scanner.rb: fix support for negative
@@ -221,7 +221,7 @@ yaml_emitter_write_indent(yaml_emitter_t *emitter);
221
221
 
222
222
  static int
223
223
  yaml_emitter_write_indicator(yaml_emitter_t *emitter,
224
- const char *indicator, int need_whitespace,
224
+ char *indicator, int need_whitespace,
225
225
  int is_whitespace, int is_indention);
226
226
 
227
227
  static int
@@ -517,7 +517,7 @@ yaml_emitter_emit_stream_start(yaml_emitter_t *emitter,
517
517
  if (emitter->best_width < 0) {
518
518
  emitter->best_width = INT_MAX;
519
519
  }
520
-
520
+
521
521
  if (!emitter->line_break) {
522
522
  emitter->line_break = YAML_LN_BREAK;
523
523
  }
@@ -607,7 +607,7 @@ yaml_emitter_emit_document_start(yaml_emitter_t *emitter,
607
607
  if (!yaml_emitter_write_indent(emitter))
608
608
  return 0;
609
609
  }
610
-
610
+
611
611
  if (event->data.document_start.tag_directives.start
612
612
  != event->data.document_start.tag_directives.end) {
613
613
  implicit = 0;
@@ -721,7 +721,7 @@ yaml_emitter_emit_document_end(yaml_emitter_t *emitter,
721
721
  }
722
722
 
723
723
  /*
724
- *
724
+ *
725
725
  * Expect a flow item node.
726
726
  */
727
727
 
@@ -1402,7 +1402,7 @@ yaml_emitter_analyze_anchor(yaml_emitter_t *emitter,
1402
1402
  {
1403
1403
  size_t anchor_length;
1404
1404
  yaml_string_t string;
1405
-
1405
+
1406
1406
  anchor_length = strlen((char *)anchor);
1407
1407
  STRING_ASSIGN(string, anchor, anchor_length);
1408
1408
 
@@ -1784,7 +1784,7 @@ yaml_emitter_write_indent(yaml_emitter_t *emitter)
1784
1784
 
1785
1785
  static int
1786
1786
  yaml_emitter_write_indicator(yaml_emitter_t *emitter,
1787
- const char *indicator, int need_whitespace,
1787
+ char *indicator, int need_whitespace,
1788
1788
  int is_whitespace, int is_indention)
1789
1789
  {
1790
1790
  size_t indicator_length;
@@ -2178,7 +2178,7 @@ yaml_emitter_write_block_scalar_hints(yaml_emitter_t *emitter,
2178
2178
  yaml_string_t string)
2179
2179
  {
2180
2180
  char indent_hint[2];
2181
- const char *chomp_hint = NULL;
2181
+ char *chomp_hint = NULL;
2182
2182
 
2183
2183
  if (IS_SPACE(string) || IS_BREAK(string))
2184
2184
  {
@@ -286,6 +286,8 @@ yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *first_event)
286
286
  int index;
287
287
  yaml_char_t *tag = first_event->data.scalar.tag;
288
288
 
289
+ if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
290
+
289
291
  if (!tag || strcmp((char *)tag, "!") == 0) {
290
292
  yaml_free(tag);
291
293
  tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SCALAR_TAG);
@@ -329,6 +331,8 @@ yaml_parser_load_sequence(yaml_parser_t *parser, yaml_event_t *first_event)
329
331
  int index, item_index;
330
332
  yaml_char_t *tag = first_event->data.sequence_start.tag;
331
333
 
334
+ if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
335
+
332
336
  if (!tag || strcmp((char *)tag, "!") == 0) {
333
337
  yaml_free(tag);
334
338
  tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG);
@@ -351,6 +355,9 @@ yaml_parser_load_sequence(yaml_parser_t *parser, yaml_event_t *first_event)
351
355
  if (!yaml_parser_parse(parser, &event)) return 0;
352
356
 
353
357
  while (event.type != YAML_SEQUENCE_END_EVENT) {
358
+ if (!STACK_LIMIT(parser,
359
+ parser->document->nodes.start[index-1].data.sequence.items,
360
+ INT_MAX-1)) return 0;
354
361
  item_index = yaml_parser_load_node(parser, &event);
355
362
  if (!item_index) return 0;
356
363
  if (!PUSH(parser,
@@ -387,6 +394,8 @@ yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *first_event)
387
394
  yaml_node_pair_t pair;
388
395
  yaml_char_t *tag = first_event->data.mapping_start.tag;
389
396
 
397
+ if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
398
+
390
399
  if (!tag || strcmp((char *)tag, "!") == 0) {
391
400
  yaml_free(tag);
392
401
  tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_MAPPING_TAG);
@@ -409,6 +418,9 @@ yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *first_event)
409
418
  if (!yaml_parser_parse(parser, &event)) return 0;
410
419
 
411
420
  while (event.type != YAML_MAPPING_END_EVENT) {
421
+ if (!STACK_LIMIT(parser,
422
+ parser->document->nodes.start[index-1].data.mapping.pairs,
423
+ INT_MAX-1)) return 0;
412
424
  pair.key = yaml_parser_load_node(parser, &event);
413
425
  if (!pair.key) return 0;
414
426
  if (!yaml_parser_parse(parser, &event)) return 0;
@@ -1295,7 +1295,7 @@ yaml_parser_process_directives(yaml_parser_t *parser,
1295
1295
  token = PEEK_TOKEN(parser);
1296
1296
  if (!token) goto error;
1297
1297
  }
1298
-
1298
+
1299
1299
  for (default_tag_directive = default_tag_directives;
1300
1300
  default_tag_directive->handle; default_tag_directive++) {
1301
1301
  if (!yaml_parser_append_tag_directive(parser, *default_tag_directive, 1,
@@ -52,7 +52,7 @@ yaml_parser_determine_encoding(yaml_parser_t *parser)
52
52
  {
53
53
  /* Ensure that we had enough bytes in the raw buffer. */
54
54
 
55
- while (!parser->eof
55
+ while (!parser->eof
56
56
  && parser->raw_buffer.last - parser->raw_buffer.pointer < 3) {
57
57
  if (!yaml_parser_update_raw_buffer(parser)) {
58
58
  return 0;
@@ -295,7 +295,7 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length)
295
295
  parser->offset, value);
296
296
 
297
297
  break;
298
-
298
+
299
299
  case YAML_UTF16LE_ENCODING:
300
300
  case YAML_UTF16BE_ENCODING:
301
301
 
@@ -318,7 +318,7 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length)
318
318
  *
319
319
  * The following formulas are used for decoding
320
320
  * and encoding characters using surrogate pairs:
321
- *
321
+ *
322
322
  * U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF)
323
323
  * U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF)
324
324
  * W1 = 110110yyyyyyyyyy
@@ -460,6 +460,10 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length)
460
460
 
461
461
  }
462
462
 
463
+ if (parser->offset >= PTRDIFF_MAX)
464
+ return yaml_parser_set_reader_error(parser, "input is too long",
465
+ PTRDIFF_MAX, -1);
466
+
463
467
  return 1;
464
468
  }
465
469
 
@@ -70,7 +70,7 @@
70
70
  * %TAG !yaml! tag:yaml.org,2002:
71
71
  * ---
72
72
  *
73
- * The correspoding sequence of tokens:
73
+ * The corresponding sequence of tokens:
74
74
  *
75
75
  * STREAM-START(utf-8)
76
76
  * VERSION-DIRECTIVE(1,1)
@@ -615,11 +615,11 @@ yaml_parser_decrease_flow_level(yaml_parser_t *parser);
615
615
  */
616
616
 
617
617
  static int
618
- yaml_parser_roll_indent(yaml_parser_t *parser, int column,
619
- int number, yaml_token_type_t type, yaml_mark_t mark);
618
+ yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column,
619
+ ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark);
620
620
 
621
621
  static int
622
- yaml_parser_unroll_indent(yaml_parser_t *parser, int column);
622
+ yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column);
623
623
 
624
624
  /*
625
625
  * Token fetchers.
@@ -762,7 +762,7 @@ yaml_parser_scan(yaml_parser_t *parser, yaml_token_t *token)
762
762
  }
763
763
 
764
764
  /* Fetch the next token from the queue. */
765
-
765
+
766
766
  *token = DEQUEUE(parser, parser->tokens);
767
767
  parser->token_available = 0;
768
768
  parser->tokens_parsed ++;
@@ -1103,7 +1103,7 @@ yaml_parser_save_simple_key(yaml_parser_t *parser)
1103
1103
  */
1104
1104
 
1105
1105
  int required = (!parser->flow_level
1106
- && parser->indent == (int)parser->mark.column);
1106
+ && parser->indent == (ptrdiff_t)parser->mark.column);
1107
1107
 
1108
1108
  /*
1109
1109
  * A simple key is required only when it is the first token in the current
@@ -1121,7 +1121,7 @@ yaml_parser_save_simple_key(yaml_parser_t *parser)
1121
1121
  yaml_simple_key_t simple_key;
1122
1122
  simple_key.possible = 1;
1123
1123
  simple_key.required = required;
1124
- simple_key.token_number =
1124
+ simple_key.token_number =
1125
1125
  parser->tokens_parsed + (parser->tokens.tail - parser->tokens.head);
1126
1126
  simple_key.mark = parser->mark;
1127
1127
 
@@ -1176,6 +1176,11 @@ yaml_parser_increase_flow_level(yaml_parser_t *parser)
1176
1176
 
1177
1177
  /* Increase the flow level. */
1178
1178
 
1179
+ if (parser->flow_level == INT_MAX) {
1180
+ parser->error = YAML_MEMORY_ERROR;
1181
+ return 0;
1182
+ }
1183
+
1179
1184
  parser->flow_level++;
1180
1185
 
1181
1186
  return 1;
@@ -1202,12 +1207,12 @@ yaml_parser_decrease_flow_level(yaml_parser_t *parser)
1202
1207
  * Push the current indentation level to the stack and set the new level
1203
1208
  * the current column is greater than the indentation level. In this case,
1204
1209
  * append or insert the specified token into the token queue.
1205
- *
1210
+ *
1206
1211
  */
1207
1212
 
1208
1213
  static int
1209
- yaml_parser_roll_indent(yaml_parser_t *parser, int column,
1210
- int number, yaml_token_type_t type, yaml_mark_t mark)
1214
+ yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column,
1215
+ ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark)
1211
1216
  {
1212
1217
  yaml_token_t token;
1213
1218
 
@@ -1226,6 +1231,11 @@ yaml_parser_roll_indent(yaml_parser_t *parser, int column,
1226
1231
  if (!PUSH(parser, parser->indents, parser->indent))
1227
1232
  return 0;
1228
1233
 
1234
+ if (column > INT_MAX) {
1235
+ parser->error = YAML_MEMORY_ERROR;
1236
+ return 0;
1237
+ }
1238
+
1229
1239
  parser->indent = column;
1230
1240
 
1231
1241
  /* Create a token and insert it into the queue. */
@@ -1248,13 +1258,13 @@ yaml_parser_roll_indent(yaml_parser_t *parser, int column,
1248
1258
 
1249
1259
  /*
1250
1260
  * Pop indentation levels from the indents stack until the current level
1251
- * becomes less or equal to the column. For each indentation level, append
1261
+ * becomes less or equal to the column. For each intendation level, append
1252
1262
  * the BLOCK-END token.
1253
1263
  */
1254
1264
 
1255
1265
 
1256
1266
  static int
1257
- yaml_parser_unroll_indent(yaml_parser_t *parser, int column)
1267
+ yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column)
1258
1268
  {
1259
1269
  yaml_token_t token;
1260
1270
 
@@ -1263,7 +1273,7 @@ yaml_parser_unroll_indent(yaml_parser_t *parser, int column)
1263
1273
  if (parser->flow_level)
1264
1274
  return 1;
1265
1275
 
1266
- /* Loop through the indentation levels in the stack. */
1276
+ /* Loop through the intendation levels in the stack. */
1267
1277
 
1268
1278
  while (parser->indent > column)
1269
1279
  {
@@ -1935,7 +1945,7 @@ yaml_parser_scan_to_next_token(yaml_parser_t *parser)
1935
1945
  *
1936
1946
  * - in the flow context;
1937
1947
  * - in the block context, but not at the beginning of the line or
1938
- * after '-', '?', or ':' (complex value).
1948
+ * after '-', '?', or ':' (complex value).
1939
1949
  */
1940
1950
 
1941
1951
  if (!CACHE(parser, 1)) return 0;
@@ -2574,7 +2584,7 @@ yaml_parser_scan_tag_uri(yaml_parser_t *parser, int directive,
2574
2584
 
2575
2585
  /* Resize the string to include the head. */
2576
2586
 
2577
- while (string.end - string.start <= (int)length) {
2587
+ while ((size_t)(string.end - string.start) <= length) {
2578
2588
  if (!yaml_string_extend(&string.start, &string.pointer, &string.end)) {
2579
2589
  parser->error = YAML_MEMORY_ERROR;
2580
2590
  goto error;
@@ -2769,15 +2779,15 @@ yaml_parser_scan_block_scalar(yaml_parser_t *parser, yaml_token_t *token,
2769
2779
 
2770
2780
  if (IS_DIGIT(parser->buffer))
2771
2781
  {
2772
- /* Check that the indentation is greater than 0. */
2782
+ /* Check that the intendation is greater than 0. */
2773
2783
 
2774
2784
  if (CHECK(parser->buffer, '0')) {
2775
2785
  yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
2776
- start_mark, "found an indentation indicator equal to 0");
2786
+ start_mark, "found an intendation indicator equal to 0");
2777
2787
  goto error;
2778
2788
  }
2779
2789
 
2780
- /* Get the indentation level and eat the indicator. */
2790
+ /* Get the intendation level and eat the indicator. */
2781
2791
 
2782
2792
  increment = AS_DIGIT(parser->buffer);
2783
2793
 
@@ -2791,7 +2801,7 @@ yaml_parser_scan_block_scalar(yaml_parser_t *parser, yaml_token_t *token,
2791
2801
  {
2792
2802
  if (CHECK(parser->buffer, '0')) {
2793
2803
  yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
2794
- start_mark, "found an indentation indicator equal to 0");
2804
+ start_mark, "found an intendation indicator equal to 0");
2795
2805
  goto error;
2796
2806
  }
2797
2807
 
@@ -2841,7 +2851,7 @@ yaml_parser_scan_block_scalar(yaml_parser_t *parser, yaml_token_t *token,
2841
2851
 
2842
2852
  end_mark = parser->mark;
2843
2853
 
2844
- /* Set the indentation level if it was specified. */
2854
+ /* Set the intendation level if it was specified. */
2845
2855
 
2846
2856
  if (increment) {
2847
2857
  indent = parser->indent >= 0 ? parser->indent+increment : increment;
@@ -2907,7 +2917,7 @@ yaml_parser_scan_block_scalar(yaml_parser_t *parser, yaml_token_t *token,
2907
2917
 
2908
2918
  if (!READ_LINE(parser, leading_break)) goto error;
2909
2919
 
2910
- /* Eat the following indentation spaces and line breaks. */
2920
+ /* Eat the following intendation spaces and line breaks. */
2911
2921
 
2912
2922
  if (!yaml_parser_scan_block_scalar_breaks(parser,
2913
2923
  &indent, &trailing_breaks, start_mark, &end_mark)) goto error;
@@ -2942,8 +2952,8 @@ error:
2942
2952
  }
2943
2953
 
2944
2954
  /*
2945
- * Scan indentation spaces and line breaks for a block scalar. Determine the
2946
- * indentation level if needed.
2955
+ * Scan intendation spaces and line breaks for a block scalar. Determine the
2956
+ * intendation level if needed.
2947
2957
  */
2948
2958
 
2949
2959
  static int
@@ -2955,11 +2965,11 @@ yaml_parser_scan_block_scalar_breaks(yaml_parser_t *parser,
2955
2965
 
2956
2966
  *end_mark = parser->mark;
2957
2967
 
2958
- /* Eat the indentation spaces and line breaks. */
2968
+ /* Eat the intendation spaces and line breaks. */
2959
2969
 
2960
2970
  while (1)
2961
2971
  {
2962
- /* Eat the indentation spaces. */
2972
+ /* Eat the intendation spaces. */
2963
2973
 
2964
2974
  if (!CACHE(parser, 1)) return 0;
2965
2975
 
@@ -2972,12 +2982,12 @@ yaml_parser_scan_block_scalar_breaks(yaml_parser_t *parser,
2972
2982
  if ((int)parser->mark.column > max_indent)
2973
2983
  max_indent = (int)parser->mark.column;
2974
2984
 
2975
- /* Check for a tab character messing the indentation. */
2985
+ /* Check for a tab character messing the intendation. */
2976
2986
 
2977
2987
  if ((!*indent || (int)parser->mark.column < *indent)
2978
2988
  && IS_TAB(parser->buffer)) {
2979
2989
  return yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
2980
- start_mark, "found a tab character where an indentation space is expected");
2990
+ start_mark, "found a tab character where an intendation space is expected");
2981
2991
  }
2982
2992
 
2983
2993
  /* Have we found a non-empty line? */
@@ -3001,7 +3011,7 @@ yaml_parser_scan_block_scalar_breaks(yaml_parser_t *parser,
3001
3011
  *indent = 1;
3002
3012
  }
3003
3013
 
3004
- return 1;
3014
+ return 1;
3005
3015
  }
3006
3016
 
3007
3017
  /*
@@ -3498,12 +3508,12 @@ yaml_parser_scan_plain_scalar(yaml_parser_t *parser, yaml_token_t *token)
3498
3508
  {
3499
3509
  if (IS_BLANK(parser->buffer))
3500
3510
  {
3501
- /* Check for tab character that abuse indentation. */
3511
+ /* Check for tab character that abuse intendation. */
3502
3512
 
3503
3513
  if (leading_blanks && (int)parser->mark.column < indent
3504
3514
  && IS_TAB(parser->buffer)) {
3505
3515
  yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
3506
- start_mark, "found a tab character that violates indentation");
3516
+ start_mark, "found a tab character that violate intendation");
3507
3517
  goto error;
3508
3518
  }
3509
3519
 
@@ -3536,7 +3546,7 @@ yaml_parser_scan_plain_scalar(yaml_parser_t *parser, yaml_token_t *token)
3536
3546
  if (!CACHE(parser, 1)) goto error;
3537
3547
  }
3538
3548
 
3539
- /* Check indentation level. */
3549
+ /* Check intendation level. */
3540
3550
 
3541
3551
  if (!parser->flow_level && (int)parser->mark.column < indent)
3542
3552
  break;
@@ -74,7 +74,7 @@ yaml_emitter_flush(yaml_emitter_t *emitter)
74
74
  unsigned int value;
75
75
  size_t k;
76
76
 
77
- /*
77
+ /*
78
78
  * See the "reader.c" code for more details on UTF-8 encoding. Note
79
79
  * that we assume that the buffer contains a valid UTF-8 sequence.
80
80
  */
@@ -1,6 +1,3 @@
1
- #ifdef RUBY_EXTCONF_H
2
- #include RUBY_EXTCONF_H
3
- #endif
4
1
 
5
2
  #if HAVE_CONFIG_H
6
3
  #include <config.h>
@@ -10,6 +7,17 @@
10
7
 
11
8
  #include <assert.h>
12
9
  #include <limits.h>
10
+ #include <stddef.h>
11
+
12
+ #ifndef _MSC_VER
13
+ #include <stdint.h>
14
+ #else
15
+ #ifdef _WIN64
16
+ #define PTRDIFF_MAX _I64_MAX
17
+ #else
18
+ #define PTRDIFF_MAX INT_MAX
19
+ #endif
20
+ #endif
13
21
 
14
22
  /*
15
23
  * Memory management.
@@ -231,9 +239,9 @@ yaml_string_join(
231
239
  (string).pointer[offset] <= (yaml_char_t) 'f') ? \
232
240
  ((string).pointer[offset] - (yaml_char_t) 'a' + 10) : \
233
241
  ((string).pointer[offset] - (yaml_char_t) '0'))
234
-
242
+
235
243
  #define AS_HEX(string) AS_HEX_AT((string),0)
236
-
244
+
237
245
  /*
238
246
  * Check if the character is ASCII.
239
247
  */
@@ -424,6 +432,12 @@ yaml_queue_extend(void **start, void **head, void **tail, void **end);
424
432
  #define STACK_EMPTY(context,stack) \
425
433
  ((stack).start == (stack).top)
426
434
 
435
+ #define STACK_LIMIT(context,stack,size) \
436
+ ((stack).top - (stack).start < (size) ? \
437
+ 1 : \
438
+ ((context)->error = YAML_MEMORY_ERROR, \
439
+ 0))
440
+
427
441
  #define PUSH(context,stack,value) \
428
442
  (((stack).top != (stack).end \
429
443
  || yaml_stack_extend((void **)&(stack).start, \
data/lib/psych.rb CHANGED
@@ -14,6 +14,7 @@ require 'psych/stream'
14
14
  require 'psych/json/tree_builder'
15
15
  require 'psych/json/stream'
16
16
  require 'psych/handlers/document_stream'
17
+ require 'psych/class_loader'
17
18
 
18
19
  ###
19
20
  # = Overview
@@ -71,7 +72,7 @@ require 'psych/handlers/document_stream'
71
72
  # ==== Exception handling
72
73
  #
73
74
  # begin
74
- # # The second argument chnages only the exception contents
75
+ # # The second argument changes only the exception contents
75
76
  # Psych.parse("--- `", "file.txt")
76
77
  # rescue Psych::SyntaxError => ex
77
78
  # ex.file # => 'file.txt'
@@ -135,7 +136,7 @@ require 'psych/handlers/document_stream'
135
136
  # ==== Exception handling
136
137
  #
137
138
  # begin
138
- # # The second argument chnages only the exception contents
139
+ # # The second argument changes only the exception contents
139
140
  # Psych.parse("--- `", "file.txt")
140
141
  # rescue Psych::SyntaxError => ex
141
142
  # ex.file # => 'file.txt'
@@ -216,7 +217,7 @@ require 'psych/handlers/document_stream'
216
217
 
217
218
  module Psych
218
219
  # The version is Psych you're using
219
- VERSION = '2.0.2'
220
+ VERSION = '2.0.3'
220
221
 
221
222
  # The version of libyaml Psych is using
222
223
  LIBYAML_VERSION = Psych.libyaml_version.join '.'
@@ -56,7 +56,7 @@ module Psych
56
56
  # Is this sequence started implicitly?
57
57
  attr_accessor :implicit
58
58
 
59
- # The sequece style used
59
+ # The sequence style used
60
60
  attr_accessor :style
61
61
 
62
62
  ###
@@ -181,9 +181,11 @@ module Psych
181
181
  klass = class_loader.struct
182
182
  members = o.children.map { |c| accept c }
183
183
  h = Hash[*members]
184
- klass.new(*h.map { |k,v|
184
+ s = klass.new(*h.map { |k,v|
185
185
  class_loader.symbolize k
186
186
  }).new(*h.map { |k,v| v })
187
+ register(o, s)
188
+ s
187
189
  end
188
190
 
189
191
  when /^!ruby\/object:?(.*)?$/
@@ -284,7 +284,7 @@ module Psych
284
284
  quote = false
285
285
  elsif o =~ /\n/
286
286
  style = Nodes::Scalar::LITERAL
287
- elsif o =~ /^\W/
287
+ elsif o =~ /^\W[^"]*$/
288
288
  style = Nodes::Scalar::DOUBLE_QUOTED
289
289
  else
290
290
  unless String === @ss.tokenize(o)
@@ -26,6 +26,10 @@ module Psych
26
26
  assert_reference_trip DateTime.now
27
27
  end
28
28
 
29
+ def test_struct_has_references
30
+ assert_reference_trip Struct.new(:foo).new(1)
31
+ end
32
+
29
33
  def assert_reference_trip obj
30
34
  yml = Psych.dump([obj, obj])
31
35
  assert_match(/\*-?\d+/, yml)
@@ -15,6 +15,10 @@ module Psych
15
15
  end
16
16
  end
17
17
 
18
+ def test_no_doublequotes_with_special_characters
19
+ assert_equal 2, Psych.dump(%Q{<%= ENV["PATH"] %>}).count('"')
20
+ end
21
+
18
22
  def test_doublequotes_when_there_is_a_single
19
23
  yaml = Psych.dump "@123'abc"
20
24
  assert_match(/---\s*"/, yaml)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: psych
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Patterson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-26 00:00:00.000000000 Z
11
+ date: 2014-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdoc
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.6'
47
+ version: '3.8'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.6'
54
+ version: '3.8'
55
55
  description: |-
56
56
  Psych is a YAML parser and emitter. Psych leverages libyaml[http://pyyaml.org/wiki/LibYAML]
57
57
  for its YAML parsing and emitting capabilities. In addition to wrapping
@@ -68,6 +68,7 @@ extra_rdoc_files:
68
68
  - README.rdoc
69
69
  files:
70
70
  - ".autotest"
71
+ - ".gemtest"
71
72
  - ".travis.yml"
72
73
  - CHANGELOG.rdoc
73
74
  - Manifest.txt
@@ -180,7 +181,6 @@ files:
180
181
  - test/psych/visitors/test_emitter.rb
181
182
  - test/psych/visitors/test_to_ruby.rb
182
183
  - test/psych/visitors/test_yaml_tree.rb
183
- - ".gemtest"
184
184
  homepage: http://github.com/tenderlove/psych
185
185
  licenses:
186
186
  - MIT
@@ -203,7 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
203
203
  version: '0'
204
204
  requirements: []
205
205
  rubyforge_project: psych
206
- rubygems_version: 2.0.2
206
+ rubygems_version: 2.2.1
207
207
  signing_key:
208
208
  specification_version: 4
209
209
  summary: Psych is a YAML parser and emitter