ParseTree 2.0.2 → 2.1.0

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.
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
  }