ParseTree 2.0.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,30 @@
1
+ === 2.1.0 / 2007-10-30
2
+
3
+ * 13 minor enhancements:
4
+
5
+ * Added (partial) regexp flag support, currently numerical. ugh.
6
+ * Added -a flag to parse_tree_show to turn on newline (all) nodes.
7
+ * Added -r to parse_tree_show for raw arrays instead of sexps.
8
+ * Added Unifier (SexpProcessor) class to unified_ruby.rb.
9
+ * Added a ton of tests while working on ruby_parser.
10
+ * Added ability to tell proc {} (nil arg slot) from proc {||} (0 arg slot)
11
+ * Added context tracking to rewriting phase... slightly broken.
12
+ * Added evstr support. (I hate evan)
13
+ * Added usage for parse_tree_show.
14
+ * Changed verbose to be true all the time in parse_tree_for_string.
15
+ * Removed process_level from SexpProcessor... just look at context size instead.
16
+ * Revamped ParseTree. No more passing around newline. Pass around self instead.
17
+ * I'm starting to dislike ruby's AST. It is REALLY inconsistent.
18
+
19
+ * 6 bug fix:
20
+
21
+ * SexpProcessor#assert_type now a bit safer with bad values.
22
+ * Uncovered a bug in ruby (AST changes when -v used), added handler code.
23
+ * Fixed NODE_BLOCK and massively simplified in the process.
24
+ * Fixed rewrite_defs to deal with non-block asts.
25
+ * Fixed test/unit hack so it does not die under miniunit.
26
+ * Found a bug in PT where parse_tree_for_string had some shadowed variables.
27
+
1
28
  === 2.0.2 / 2007-09-20
2
29
 
3
30
  * 2 minor enhancements:
data/bin/parse_tree_show CHANGED
@@ -5,11 +5,27 @@ begin require 'rubygems' rescue LoadError end
5
5
  require 'parse_tree'
6
6
  require 'sexp'
7
7
 
8
- $u ||= false
8
+ $a ||= false
9
+ $h ||= false
9
10
  $n ||= false
11
+ $r ||= false
10
12
  $s ||= false
13
+ $u ||= false
11
14
  $n = $n.intern if $n
12
15
 
16
+ if $h then
17
+ puts "usage: #{File.basename $0} [options] [file...]"
18
+ puts "options:"
19
+ puts "-h : display usage"
20
+ puts "-a : all nodes, including newline"
21
+ puts "-n=node : only display matching nodes"
22
+ puts "-r : raw arrays, no sexps"
23
+ puts "-s : structural sexps, strip all content and show bare tree"
24
+ puts "-u : unified sexps"
25
+
26
+ exit 1
27
+ end
28
+
13
29
  ARGV.push "-" if ARGV.empty?
14
30
 
15
31
  if $u then
@@ -21,13 +37,14 @@ if $u then
21
37
  end
22
38
  end
23
39
 
24
- parse_tree = ParseTree.new
40
+ parse_tree = ParseTree.new($a)
25
41
  unifier = Unifier.new if $u
26
42
 
27
43
  ARGV.each do |file|
28
44
  ruby = file == "-" ? $stdin.read : File.read(file)
29
45
 
30
- sexp = Sexp.from_array parse_tree.parse_tree_for_string(ruby, file).first
46
+ sexp = parse_tree.parse_tree_for_string(ruby, file).first
47
+ sexp = Sexp.from_array sexp unless $r
31
48
  sexp = unifier.process(sexp) if $u
32
49
  sexp = sexp.structure if $s
33
50
 
data/lib/parse_tree.rb CHANGED
@@ -41,7 +41,7 @@ end
41
41
 
42
42
  class ParseTree
43
43
 
44
- VERSION = '2.0.2'
44
+ VERSION = '2.1.0'
45
45
 
46
46
  ##
47
47
  # Front end translation method.
@@ -78,9 +78,6 @@ class ParseTree
78
78
  # +include_newlines+ which defaults to +$DEBUG+.
79
79
 
80
80
  def initialize(include_newlines=$DEBUG)
81
- if include_newlines then
82
- warn "WAR\NING: include_newlines=true from #{caller[0..9].join(', ')}"
83
- end
84
81
  @include_newlines = include_newlines
85
82
  end
86
83
 
@@ -149,7 +146,7 @@ class ParseTree
149
146
 
150
147
  def parse_tree_for_method(klass, method, is_cls_meth=false)
151
148
  $stderr.puts "** parse_tree_for_method(#{klass}, #{method}):" if $DEBUG
152
- r = parse_tree_for_meth(klass, method.to_sym, @include_newlines, is_cls_meth)
149
+ r = parse_tree_for_meth(klass, method.to_sym, is_cls_meth)
153
150
  r
154
151
  end
155
152
 
@@ -160,11 +157,15 @@ class ParseTree
160
157
  #
161
158
  # [[sexps] ... ]
162
159
 
163
- def parse_tree_for_string(source, filename = nil, line = nil,
164
- newlines = false)
165
- filename ||= '(string)'
166
- line ||= 1
167
- return parse_tree_for_str(source, filename, line, newlines)
160
+ def parse_tree_for_string(source, filename = '(string)', line = 1)
161
+ old_verbose, $VERBOSE = $VERBOSE, true
162
+ return parse_tree_for_str0(source, filename, line)
163
+ ensure
164
+ $VERBOSE = old_verbose
165
+ end
166
+
167
+ def parse_tree_for_str0(*__1args2__) # :nodoc:
168
+ parse_tree_for_str(*__1args2__) # just helps clean up the binding
168
169
  end
169
170
 
170
171
  if RUBY_VERSION < "1.8.4" then
@@ -282,13 +283,15 @@ class ParseTree
282
283
  builder.prefix %{
283
284
  #define nd_3rd u3.node
284
285
  static unsigned case_level = 0;
286
+ static unsigned when_level = 0;
287
+ static unsigned inside_case_args = 0;
285
288
  }
286
289
 
287
290
  builder.prefix %{
288
291
  static VALUE wrap_into_node(const char * name, VALUE val) {
289
292
  VALUE n = rb_ary_new();
290
293
  rb_ary_push(n, ID2SYM(rb_intern(name)));
291
- rb_ary_push(n, val);
294
+ if (val) rb_ary_push(n, val);
292
295
  return n;
293
296
  }
294
297
  }
@@ -326,15 +329,11 @@ class ParseTree
326
329
  } unless RUBY_VERSION >= "1.9" # we got matz to add this to env.h
327
330
 
328
331
  ##
329
- # add_to_parse_tree(ary, node, include_newlines, local_variables)
332
+ # add_to_parse_tree(self, ary, node, local_variables)
330
333
 
331
334
  builder.prefix %Q@
332
- void add_to_parse_tree(VALUE ary,
333
- NODE * n,
334
- VALUE newlines,
335
- ID * locals) {
335
+ void add_to_parse_tree(VALUE self, VALUE ary, NODE * n, ID * locals) {
336
336
  NODE * volatile node = n;
337
- NODE * volatile contnode = NULL;
338
337
  VALUE old_ary = Qnil;
339
338
  VALUE current;
340
339
  VALUE node_name;
@@ -370,54 +369,45 @@ again_no_block:
370
369
  switch (nd_type(node)) {
371
370
 
372
371
  case NODE_BLOCK:
373
- if (contnode) {
374
- add_to_parse_tree(current, node, newlines, locals);
375
- break;
376
- }
377
- contnode = node->nd_next;
378
-
379
- /* FIX: this will break the moment there is a block w/in a block */
380
- old_ary = ary;
381
- ary = current;
382
- node = node->nd_head;
383
- if (nd_type(node) == NODE_DASGN_CURR
384
- && (!node->nd_value || nd_type(node->nd_value) == NODE_DASGN_CURR)) {
385
- goto finish;
372
+ {
373
+ while (node) {
374
+ add_to_parse_tree(self, current, node->nd_head, locals);
375
+ node = node->nd_next;
376
+ }
386
377
  }
387
- goto again;
388
378
  break;
389
379
 
390
380
  case NODE_FBODY:
391
381
  case NODE_DEFINED:
392
- add_to_parse_tree(current, node->nd_head, newlines, locals);
382
+ add_to_parse_tree(self, current, node->nd_head, locals);
393
383
  break;
394
384
 
395
385
  case NODE_COLON2:
396
- add_to_parse_tree(current, node->nd_head, newlines, locals);
386
+ add_to_parse_tree(self, current, node->nd_head, locals);
397
387
  rb_ary_push(current, ID2SYM(node->nd_mid));
398
388
  break;
399
389
 
400
390
  case NODE_MATCH2:
401
391
  case NODE_MATCH3:
402
- add_to_parse_tree(current, node->nd_recv, newlines, locals);
403
- add_to_parse_tree(current, node->nd_value, newlines, locals);
392
+ add_to_parse_tree(self, current, node->nd_recv, locals);
393
+ add_to_parse_tree(self, current, node->nd_value, locals);
404
394
  break;
405
395
 
406
396
  case NODE_BEGIN:
407
397
  case NODE_OPT_N:
408
398
  case NODE_NOT:
409
- add_to_parse_tree(current, node->nd_body, newlines, locals);
399
+ add_to_parse_tree(self, current, node->nd_body, locals);
410
400
  break;
411
401
 
412
402
  case NODE_IF:
413
- add_to_parse_tree(current, node->nd_cond, newlines, locals);
403
+ add_to_parse_tree(self, current, node->nd_cond, locals);
414
404
  if (node->nd_body) {
415
- add_to_parse_tree(current, node->nd_body, newlines, locals);
405
+ add_to_parse_tree(self, current, node->nd_body, locals);
416
406
  } else {
417
407
  rb_ary_push(current, Qnil);
418
408
  }
419
409
  if (node->nd_else) {
420
- add_to_parse_tree(current, node->nd_else, newlines, locals);
410
+ add_to_parse_tree(self, current, node->nd_else, locals);
421
411
  } else {
422
412
  rb_ary_push(current, Qnil);
423
413
  }
@@ -426,13 +416,13 @@ again_no_block:
426
416
  case NODE_CASE:
427
417
  case_level++;
428
418
  if (node->nd_head != NULL) {
429
- add_to_parse_tree(current, node->nd_head, newlines, locals); /* expr */
419
+ add_to_parse_tree(self, current, node->nd_head, locals); /* expr */
430
420
  } else {
431
421
  rb_ary_push(current, Qnil);
432
422
  }
433
423
  node = node->nd_body;
434
424
  while (node) {
435
- add_to_parse_tree(current, node, newlines, locals);
425
+ add_to_parse_tree(self, current, node, locals);
436
426
  if (nd_type(node) == NODE_WHEN) { /* when */
437
427
  node = node->nd_next;
438
428
  } else {
@@ -446,24 +436,31 @@ again_no_block:
446
436
  break;
447
437
 
448
438
  case NODE_WHEN:
449
- if (!case_level) { /* when without case, ie, no expr in case */
439
+ when_level++;
440
+ if (!inside_case_args && case_level < when_level) { /* when without case, ie, no expr in case */
441
+ when_level--; if (when_level < 0) when_level = 0;
450
442
  rb_ary_pop(ary); /* reset what current is pointing at */
451
443
  node = NEW_CASE(0, node);
452
444
  goto again;
453
445
  }
454
- add_to_parse_tree(current, node->nd_head, newlines, locals); /* args */
446
+ inside_case_args++;
447
+ add_to_parse_tree(self, current, node->nd_head, locals); /* args */
448
+ inside_case_args--;
449
+
455
450
  if (node->nd_body) {
456
- add_to_parse_tree(current, node->nd_body, newlines, locals); /* body */
451
+ add_to_parse_tree(self, current, node->nd_body, locals); /* body */
457
452
  } else {
458
453
  rb_ary_push(current, Qnil);
459
454
  }
455
+
456
+ when_level--; if (when_level < 0) when_level = 0;
460
457
  break;
461
458
 
462
459
  case NODE_WHILE:
463
460
  case NODE_UNTIL:
464
- add_to_parse_tree(current, node->nd_cond, newlines, locals);
461
+ add_to_parse_tree(self, current, node->nd_cond, locals);
465
462
  if (node->nd_body) {
466
- add_to_parse_tree(current, node->nd_body, newlines, locals);
463
+ add_to_parse_tree(self, current, node->nd_body, locals);
467
464
  } else {
468
465
  rb_ary_push(current, Qnil);
469
466
  }
@@ -471,34 +468,40 @@ again_no_block:
471
468
  break;
472
469
 
473
470
  case NODE_BLOCK_PASS:
474
- add_to_parse_tree(current, node->nd_body, newlines, locals);
475
- add_to_parse_tree(current, node->nd_iter, newlines, locals);
471
+ add_to_parse_tree(self, current, node->nd_body, locals);
472
+ add_to_parse_tree(self, current, node->nd_iter, locals);
476
473
  break;
477
474
 
478
475
  case NODE_ITER:
479
476
  case NODE_FOR:
480
- add_to_parse_tree(current, node->nd_iter, newlines, locals);
477
+ add_to_parse_tree(self, current, node->nd_iter, locals);
481
478
  if (node->nd_var != (NODE *)1
482
479
  && node->nd_var != (NODE *)2
483
480
  && node->nd_var != NULL) {
484
- add_to_parse_tree(current, node->nd_var, newlines, locals);
481
+ add_to_parse_tree(self, current, node->nd_var, locals);
485
482
  } else {
486
- rb_ary_push(current, Qnil);
483
+ if (node->nd_var == NULL) {
484
+ // e.g. proc {}
485
+ rb_ary_push(current, Qnil);
486
+ } else {
487
+ // e.g. proc {||}
488
+ rb_ary_push(current, INT2FIX(0));
489
+ }
487
490
  }
488
- add_to_parse_tree(current, node->nd_body, newlines, locals);
491
+ add_to_parse_tree(self, current, node->nd_body, locals);
489
492
  break;
490
493
 
491
494
  case NODE_BREAK:
492
495
  case NODE_NEXT:
493
496
  case NODE_YIELD:
494
497
  if (node->nd_stts)
495
- add_to_parse_tree(current, node->nd_stts, newlines, locals);
498
+ add_to_parse_tree(self, current, node->nd_stts, locals);
496
499
  break;
497
500
 
498
501
  case NODE_RESCUE:
499
- add_to_parse_tree(current, node->nd_1st, newlines, locals);
500
- add_to_parse_tree(current, node->nd_2nd, newlines, locals);
501
- add_to_parse_tree(current, node->nd_3rd, newlines, locals);
502
+ add_to_parse_tree(self, current, node->nd_1st, locals);
503
+ add_to_parse_tree(self, current, node->nd_2nd, locals);
504
+ add_to_parse_tree(self, current, node->nd_3rd, locals);
502
505
  break;
503
506
 
504
507
  /*
@@ -510,58 +513,58 @@ again_no_block:
510
513
 
511
514
  case NODE_RESBODY:
512
515
  if (node->nd_3rd) {
513
- add_to_parse_tree(current, node->nd_3rd, newlines, locals);
516
+ add_to_parse_tree(self, current, node->nd_3rd, locals);
514
517
  } else {
515
518
  rb_ary_push(current, Qnil);
516
519
  }
517
- add_to_parse_tree(current, node->nd_2nd, newlines, locals);
518
- add_to_parse_tree(current, node->nd_1st, newlines, locals);
520
+ add_to_parse_tree(self, current, node->nd_2nd, locals);
521
+ add_to_parse_tree(self, current, node->nd_1st, locals);
519
522
  break;
520
523
 
521
524
  case NODE_ENSURE:
522
- add_to_parse_tree(current, node->nd_head, newlines, locals);
525
+ add_to_parse_tree(self, current, node->nd_head, locals);
523
526
  if (node->nd_ensr) {
524
- add_to_parse_tree(current, node->nd_ensr, newlines, locals);
527
+ add_to_parse_tree(self, current, node->nd_ensr, locals);
525
528
  }
526
529
  break;
527
530
 
528
531
  case NODE_AND:
529
532
  case NODE_OR:
530
- add_to_parse_tree(current, node->nd_1st, newlines, locals);
531
- add_to_parse_tree(current, node->nd_2nd, newlines, locals);
533
+ add_to_parse_tree(self, current, node->nd_1st, locals);
534
+ add_to_parse_tree(self, current, node->nd_2nd, locals);
532
535
  break;
533
536
 
534
537
  case NODE_DOT2:
535
538
  case NODE_DOT3:
536
539
  case NODE_FLIP2:
537
540
  case NODE_FLIP3:
538
- add_to_parse_tree(current, node->nd_beg, newlines, locals);
539
- add_to_parse_tree(current, node->nd_end, newlines, locals);
541
+ add_to_parse_tree(self, current, node->nd_beg, locals);
542
+ add_to_parse_tree(self, current, node->nd_end, locals);
540
543
  break;
541
544
 
542
545
  case NODE_RETURN:
543
546
  if (node->nd_stts)
544
- add_to_parse_tree(current, node->nd_stts, newlines, locals);
547
+ add_to_parse_tree(self, current, node->nd_stts, locals);
545
548
  break;
546
549
 
547
550
  case NODE_ARGSCAT:
548
551
  case NODE_ARGSPUSH:
549
- add_to_parse_tree(current, node->nd_head, newlines, locals);
550
- add_to_parse_tree(current, node->nd_body, newlines, locals);
552
+ add_to_parse_tree(self, current, node->nd_head, locals);
553
+ add_to_parse_tree(self, current, node->nd_body, locals);
551
554
  break;
552
555
 
553
556
  case NODE_CALL:
554
557
  case NODE_FCALL:
555
558
  case NODE_VCALL:
556
559
  if (nd_type(node) != NODE_FCALL)
557
- add_to_parse_tree(current, node->nd_recv, newlines, locals);
560
+ add_to_parse_tree(self, current, node->nd_recv, locals);
558
561
  rb_ary_push(current, ID2SYM(node->nd_mid));
559
562
  if (node->nd_args || nd_type(node) != NODE_FCALL)
560
- add_to_parse_tree(current, node->nd_args, newlines, locals);
563
+ add_to_parse_tree(self, current, node->nd_args, locals);
561
564
  break;
562
565
 
563
566
  case NODE_SUPER:
564
- add_to_parse_tree(current, node->nd_args, newlines, locals);
567
+ add_to_parse_tree(self, current, node->nd_args, locals);
565
568
  break;
566
569
 
567
570
  case NODE_BMETHOD:
@@ -571,9 +574,9 @@ again_no_block:
571
574
  if (data->var == 0 || data->var == (NODE *)1 || data->var == (NODE *)2) {
572
575
  rb_ary_push(current, Qnil);
573
576
  } else {
574
- add_to_parse_tree(current, data->var, newlines, locals);
577
+ add_to_parse_tree(self, current, data->var, locals);
575
578
  }
576
- add_to_parse_tree(current, data->body, newlines, locals);
579
+ add_to_parse_tree(self, current, data->body, locals);
577
580
  break;
578
581
  }
579
582
  break;
@@ -584,26 +587,26 @@ again_no_block:
584
587
  struct METHOD *data;
585
588
  Data_Get_Struct(node->nd_cval, struct METHOD, data);
586
589
  rb_ary_push(current, ID2SYM(data->id));
587
- add_to_parse_tree(current, data->body, newlines, locals);
590
+ add_to_parse_tree(self, current, data->body, locals);
588
591
  break;
589
592
  }
590
593
  #endif
591
594
 
592
595
  case NODE_METHOD:
593
- add_to_parse_tree(current, node->nd_3rd, newlines, locals);
596
+ add_to_parse_tree(self, current, node->nd_3rd, locals);
594
597
  break;
595
598
 
596
599
  case NODE_SCOPE:
597
- add_to_parse_tree(current, node->nd_next, newlines, node->nd_tbl);
600
+ add_to_parse_tree(self, current, node->nd_next, node->nd_tbl);
598
601
  break;
599
602
 
600
603
  case NODE_OP_ASGN1:
601
- add_to_parse_tree(current, node->nd_recv, newlines, locals);
604
+ add_to_parse_tree(self, current, node->nd_recv, locals);
602
605
  #if RUBY_VERSION_CODE < 185
603
- add_to_parse_tree(current, node->nd_args->nd_next, newlines, locals);
606
+ add_to_parse_tree(self, current, node->nd_args->nd_next, locals);
604
607
  rb_ary_pop(rb_ary_entry(current, -1)); /* no idea why I need this */
605
608
  #else
606
- add_to_parse_tree(current, node->nd_args->nd_2nd, newlines, locals);
609
+ add_to_parse_tree(self, current, node->nd_args->nd_2nd, locals);
607
610
  #endif
608
611
  switch (node->nd_mid) {
609
612
  case 0:
@@ -616,11 +619,11 @@ again_no_block:
616
619
  rb_ary_push(current, ID2SYM(node->nd_mid));
617
620
  break;
618
621
  }
619
- add_to_parse_tree(current, node->nd_args->nd_head, newlines, locals);
622
+ add_to_parse_tree(self, current, node->nd_args->nd_head, locals);
620
623
  break;
621
624
 
622
625
  case NODE_OP_ASGN2:
623
- add_to_parse_tree(current, node->nd_recv, newlines, locals);
626
+ add_to_parse_tree(self, current, node->nd_recv, locals);
624
627
  rb_ary_push(current, ID2SYM(node->nd_next->nd_aid));
625
628
 
626
629
  switch (node->nd_next->nd_mid) {
@@ -635,21 +638,25 @@ again_no_block:
635
638
  break;
636
639
  }
637
640
 
638
- add_to_parse_tree(current, node->nd_value, newlines, locals);
641
+ add_to_parse_tree(self, current, node->nd_value, locals);
639
642
  break;
640
643
 
641
644
  case NODE_OP_ASGN_AND:
642
645
  case NODE_OP_ASGN_OR:
643
- add_to_parse_tree(current, node->nd_head, newlines, locals);
644
- add_to_parse_tree(current, node->nd_value, newlines, locals);
646
+ add_to_parse_tree(self, current, node->nd_head, locals);
647
+ add_to_parse_tree(self, current, node->nd_value, locals);
645
648
  break;
646
649
 
647
650
  case NODE_MASGN:
648
- add_to_parse_tree(current, node->nd_head, newlines, locals);
649
- if (node->nd_args && node->nd_args != (NODE *)-1) {
650
- add_to_parse_tree(current, node->nd_args, newlines, locals);
651
+ add_to_parse_tree(self, current, node->nd_head, locals);
652
+ if (node->nd_args) {
653
+ if (node->nd_args != (NODE *)-1) {
654
+ add_to_parse_tree(self, current, node->nd_args, locals);
655
+ } else {
656
+ rb_ary_push(current, wrap_into_node("splat", 0));
657
+ }
651
658
  }
652
- add_to_parse_tree(current, node->nd_value, newlines, locals);
659
+ add_to_parse_tree(self, current, node->nd_value, locals);
653
660
  break;
654
661
 
655
662
  case NODE_LASGN:
@@ -661,7 +668,7 @@ again_no_block:
661
668
  case NODE_CVDECL:
662
669
  case NODE_GASGN:
663
670
  rb_ary_push(current, ID2SYM(node->nd_vid));
664
- add_to_parse_tree(current, node->nd_value, newlines, locals);
671
+ add_to_parse_tree(self, current, node->nd_value, locals);
665
672
  break;
666
673
 
667
674
  case NODE_VALIAS: /* u1 u2 (alias $global $global2) */
@@ -678,8 +685,8 @@ again_no_block:
678
685
  rb_ary_push(current, wrap_into_node("lit", ID2SYM(node->u2.id)));
679
686
  rb_ary_push(current, wrap_into_node("lit", ID2SYM(node->u1.id)));
680
687
  #else
681
- add_to_parse_tree(current, node->nd_1st, newlines, locals);
682
- add_to_parse_tree(current, node->nd_2nd, newlines, locals);
688
+ add_to_parse_tree(self, current, node->nd_1st, locals);
689
+ add_to_parse_tree(self, current, node->nd_2nd, locals);
683
690
  #endif
684
691
  break;
685
692
 
@@ -687,7 +694,7 @@ again_no_block:
687
694
  #if RUBY_VERSION_CODE < 185
688
695
  rb_ary_push(current, wrap_into_node("lit", ID2SYM(node->u2.id)));
689
696
  #else
690
- add_to_parse_tree(current, node->nd_value, newlines, locals);
697
+ add_to_parse_tree(self, current, node->nd_value, locals);
691
698
  #endif
692
699
  break;
693
700
 
@@ -701,11 +708,11 @@ again_no_block:
701
708
 
702
709
  list = node->nd_head;
703
710
  while (list) {
704
- add_to_parse_tree(current, list->nd_head, newlines, locals);
711
+ add_to_parse_tree(self, current, list->nd_head, locals);
705
712
  list = list->nd_next;
706
713
  if (list == 0)
707
714
  rb_bug("odd number list for Hash");
708
- add_to_parse_tree(current, list->nd_head, newlines, locals);
715
+ add_to_parse_tree(self, current, list->nd_head, locals);
709
716
  list = list->nd_next;
710
717
  }
711
718
  }
@@ -713,7 +720,7 @@ again_no_block:
713
720
 
714
721
  case NODE_ARRAY:
715
722
  while (node) {
716
- add_to_parse_tree(current, node->nd_head, newlines, locals);
723
+ add_to_parse_tree(self, current, node->nd_head, locals);
717
724
  node = node->nd_next;
718
725
  }
719
726
  break;
@@ -730,18 +737,25 @@ again_no_block:
730
737
  if (list->nd_head) {
731
738
  switch (nd_type(list->nd_head)) {
732
739
  case NODE_STR:
733
- add_to_parse_tree(current, list->nd_head, newlines, locals);
740
+ add_to_parse_tree(self, current, list->nd_head, locals);
734
741
  break;
735
742
  case NODE_EVSTR:
736
- add_to_parse_tree(current, list->nd_head->nd_body, newlines, locals);
743
+ add_to_parse_tree(self, current, list->nd_head, locals);
737
744
  break;
738
745
  default:
739
- add_to_parse_tree(current, list->nd_head, newlines, locals);
746
+ add_to_parse_tree(self, current, list->nd_head, locals);
740
747
  break;
741
748
  }
742
749
  }
743
750
  list = list->nd_next;
744
751
  }
752
+ switch (nd_type(node)) {
753
+ case NODE_DREGX:
754
+ case NODE_DREGX_ONCE:
755
+ if (node->nd_cflag) {
756
+ rb_ary_push(current, INT2FIX(node->nd_cflag));
757
+ }
758
+ }
745
759
  }
746
760
  break;
747
761
 
@@ -749,9 +763,9 @@ again_no_block:
749
763
  case NODE_DEFS:
750
764
  if (node->nd_defn) {
751
765
  if (nd_type(node) == NODE_DEFS)
752
- add_to_parse_tree(current, node->nd_recv, newlines, locals);
766
+ add_to_parse_tree(self, current, node->nd_recv, locals);
753
767
  rb_ary_push(current, ID2SYM(node->nd_mid));
754
- add_to_parse_tree(current, node->nd_defn, newlines, locals);
768
+ add_to_parse_tree(self, current, node->nd_defn, locals);
755
769
  }
756
770
  break;
757
771
 
@@ -760,17 +774,17 @@ again_no_block:
760
774
  rb_ary_push(current, ID2SYM((ID)node->nd_cpath->nd_mid));
761
775
  if (nd_type(node) == NODE_CLASS) {
762
776
  if (node->nd_super) {
763
- add_to_parse_tree(current, node->nd_super, newlines, locals);
777
+ add_to_parse_tree(self, current, node->nd_super, locals);
764
778
  } else {
765
779
  rb_ary_push(current, Qnil);
766
780
  }
767
781
  }
768
- add_to_parse_tree(current, node->nd_body, newlines, locals);
782
+ add_to_parse_tree(self, current, node->nd_body, locals);
769
783
  break;
770
784
 
771
785
  case NODE_SCLASS:
772
- add_to_parse_tree(current, node->nd_recv, newlines, locals);
773
- add_to_parse_tree(current, node->nd_body, newlines, locals);
786
+ add_to_parse_tree(self, current, node->nd_recv, locals);
787
+ add_to_parse_tree(self, current, node->nd_body, locals);
774
788
  break;
775
789
 
776
790
  case NODE_ARGS: {
@@ -827,7 +841,7 @@ again_no_block:
827
841
 
828
842
  optnode = node->nd_opt;
829
843
  if (optnode) {
830
- add_to_parse_tree(current, node->nd_opt, newlines, locals);
844
+ add_to_parse_tree(self, current, node->nd_opt, locals);
831
845
  }
832
846
  } break;
833
847
 
@@ -845,6 +859,9 @@ again_no_block:
845
859
  case NODE_STR: /* u1 */
846
860
  case NODE_LIT:
847
861
  rb_ary_push(current, node->nd_lit);
862
+ if (node->nd_cflag) {
863
+ rb_ary_push(current, INT2FIX(node->nd_cflag));
864
+ }
848
865
  break;
849
866
 
850
867
  case NODE_MATCH: /* u1 -> [:lit, u1] */
@@ -856,11 +873,13 @@ again_no_block:
856
873
  case NODE_NEWLINE:
857
874
  rb_ary_push(current, INT2FIX(nd_line(node)));
858
875
  rb_ary_push(current, rb_str_new2(node->nd_file));
859
-
860
- if (! RTEST(newlines)) rb_ary_pop(ary); /* nuke it */
861
-
862
- node = node->nd_next;
863
- goto again;
876
+ if (! RTEST(rb_iv_get(self, "\@include_newlines"))) {
877
+ rb_ary_pop(ary); /* nuke it */
878
+ node = node->nd_next;
879
+ goto again;
880
+ } else {
881
+ add_to_parse_tree(self, current, node->nd_next, locals);
882
+ }
864
883
  break;
865
884
 
866
885
  case NODE_NTH_REF: /* u2 u3 ($1) - u3 is local_cnt('~') ignorable? */
@@ -892,22 +911,22 @@ again_no_block:
892
911
  case NODE_SPLAT:
893
912
  case NODE_TO_ARY:
894
913
  case NODE_SVALUE: /* a = b, c */
895
- add_to_parse_tree(current, node->nd_head, newlines, locals);
914
+ add_to_parse_tree(self, current, node->nd_head, locals);
896
915
  break;
897
916
 
898
917
  case NODE_ATTRASGN: /* literal.meth = y u1 u2 u3 */
899
918
  /* node id node */
900
919
  if (node->nd_1st == RNODE(1)) {
901
- add_to_parse_tree(current, NEW_SELF(), newlines, locals);
920
+ add_to_parse_tree(self, current, NEW_SELF(), locals);
902
921
  } else {
903
- add_to_parse_tree(current, node->nd_1st, newlines, locals);
922
+ add_to_parse_tree(self, current, node->nd_1st, locals);
904
923
  }
905
924
  rb_ary_push(current, ID2SYM(node->u2.id));
906
- add_to_parse_tree(current, node->nd_3rd, newlines, locals);
925
+ add_to_parse_tree(self, current, node->nd_3rd, locals);
907
926
  break;
908
927
 
909
928
  case NODE_EVSTR:
910
- add_to_parse_tree(current, node->nd_2nd, newlines, locals);
929
+ add_to_parse_tree(self, current, node->nd_2nd, locals);
911
930
  break;
912
931
 
913
932
  case NODE_POSTEXE: /* END { ... } */
@@ -946,21 +965,11 @@ again_no_block:
946
965
  rb_ary_push(current, INT2FIX(nd_type(node)));
947
966
  break;
948
967
  }
949
-
950
- finish:
951
- if (contnode) {
952
- node = contnode;
953
- contnode = NULL;
954
- current = ary;
955
- ary = old_ary;
956
- old_ary = Qnil;
957
- goto again_no_block;
958
- }
959
968
  }
960
969
  @ # end of add_to_parse_tree block
961
970
 
962
971
  builder.c %Q{
963
- static VALUE parse_tree_for_meth(VALUE klass, VALUE method, VALUE newlines, VALUE is_cls_meth) {
972
+ static VALUE parse_tree_for_meth(VALUE klass, VALUE method, VALUE is_cls_meth) {
964
973
  VALUE n;
965
974
  NODE *node = NULL;
966
975
  ID id;
@@ -984,7 +993,7 @@ static VALUE parse_tree_for_meth(VALUE klass, VALUE method, VALUE newlines, VALU
984
993
  rb_ary_push(result, rb_ary_new3(1, ID2SYM(rb_intern("self"))));
985
994
  }
986
995
  rb_ary_push(result, ID2SYM(id));
987
- add_to_parse_tree(result, node->nd_body, newlines, NULL);
996
+ add_to_parse_tree(self, result, node->nd_body, NULL);
988
997
  } else {
989
998
  rb_ary_push(result, Qnil);
990
999
  }
@@ -997,14 +1006,12 @@ static VALUE parse_tree_for_meth(VALUE klass, VALUE method, VALUE newlines, VALU
997
1006
  if RUBY_VERSION < '1.9.0'
998
1007
 
999
1008
  builder.c %Q{
1000
- static VALUE parse_tree_for_str(VALUE source, VALUE filename, VALUE line,
1001
- VALUE newlines) {
1009
+ static VALUE parse_tree_for_str(VALUE source, VALUE filename, VALUE line) {
1002
1010
  VALUE tmp;
1003
1011
  VALUE result = rb_ary_new();
1004
1012
  NODE *node = NULL;
1005
1013
  int critical;
1006
-
1007
- (void) self; /* quell warnings */
1014
+ int newlines = RTEST(rb_iv_get(self, "@include_newlines"));
1008
1015
 
1009
1016
  tmp = rb_check_string_type(filename);
1010
1017
  if (NIL_P(tmp)) {
@@ -1015,8 +1022,6 @@ static VALUE parse_tree_for_str(VALUE source, VALUE filename, VALUE line,
1015
1022
  line = LONG2FIX(1);
1016
1023
  }
1017
1024
 
1018
- newlines = RTEST(newlines);
1019
-
1020
1025
  ruby_nerrs = 0;
1021
1026
  StringValue(source);
1022
1027
  critical = rb_thread_critical;
@@ -1034,7 +1039,7 @@ static VALUE parse_tree_for_str(VALUE source, VALUE filename, VALUE line,
1034
1039
  rb_exc_raise(ruby_errinfo);
1035
1040
  }
1036
1041
 
1037
- add_to_parse_tree(result, node, newlines, NULL);
1042
+ add_to_parse_tree(self, result, node, NULL);
1038
1043
 
1039
1044
  return result;
1040
1045
  }