minjs 0.1.3 → 0.1.5

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.
@@ -9,113 +9,15 @@ module Minjs
9
9
  false
10
10
  end
11
11
 
12
- def priority(exp)
12
+ def priority
13
13
  999
14
14
  end
15
- end
16
15
 
17
- #statement_list
18
- class StList < St
19
- attr_reader :statement_list
20
- #
21
- # statement_list: [statement, statement, ...]
22
- #
23
- def initialize(statement_list)
24
- @statement_list = statement_list
25
- end
26
-
27
- def grouping
28
- sl = @statement_list
29
- i = 0
30
- while i < sl.length
31
- st = sl[i]
32
- i0 = i
33
- prev = nil
34
- t = nil
35
- while st and st.to_exp?
36
- if prev and prev.to_exp?
37
- t = ECMA262::ExpComma.new(t, st.to_exp({}))
38
- elsif prev.nil?
39
- t = st.to_exp({})
40
- else
41
- break
42
- end
43
- prev = st
44
- i += 1
45
- st = sl[i]
46
- end
47
- if i0 != i and i - i0 >= 2
48
- sl[i0...i] = StExp.new(t)
49
- i = (i - i0 + 1)
50
- else
51
- i += 1
52
- end
53
- end
54
- end
55
-
56
- def replace(from, to)
57
- idx = @statement_list.index(from)
58
- if idx
59
- @statement_list[idx] = to
60
- end
61
- end
62
-
63
- def remove(st)
64
- @statement_list.delete(st)
65
- end
66
-
67
- def remove_empty_statement
68
- @statement_list.reject!{|x|
69
- x.class == StEmpty
70
- }
71
- end
72
-
73
- def traverse(parent, &block)
74
- @statement_list.each do|st|
75
- st.traverse(self, &block)
76
- end
77
- yield self, parent
78
- end
79
-
80
- def to_js(options = {})
81
- concat options, @statement_list
82
- end
83
-
84
- def length
85
- @statement_list.length
86
- end
87
-
88
- def to_exp?
89
- @statement_list.each do |s|
90
- return false if s.to_exp? == false
91
- end
92
- return true
93
- end
94
-
95
- def to_exp(options)
96
- return nil if to_exp? == false
97
- t = @statement_list[0].to_exp(options)
98
- return t.to_exp(options) if @statement_list.length <= 1
99
- i = 1
100
- while(i < @statement_list.length)
101
- t = ExpComma.new(t, @statement_list[i])
102
- i += 1
103
- end
104
- t
105
- end
106
-
107
- def each(&block)
108
- @statement_list.each(&block)
109
- end
110
-
111
- def [](i)
112
- @statement_list[i]
113
- end
114
-
115
- def index(st)
116
- @statement_list.index(st)
16
+ def last_statement
17
+ puts "warning: #{self.class}: last_statement not implement"
117
18
  end
118
19
  end
20
+
119
21
  #
120
22
  # 12.1
121
23
  #
@@ -127,6 +29,10 @@ module Minjs
127
29
  @statement_list = statement_list
128
30
  end
129
31
 
32
+ def deep_dup
33
+ self.class.new(@statement_list.deep_dup)
34
+ end
35
+
130
36
  def traverse(parent, &block)
131
37
  @statement_list.traverse(self, &block)
132
38
  yield self, parent
@@ -137,23 +43,54 @@ module Minjs
137
43
  end
138
44
 
139
45
  def to_exp?
140
- @statement_list.length == 1 and @statement_list[0].to_exp?
46
+ t = @statement_list.statement_list.select{|s|
47
+ s.class != StEmpty
48
+ }
49
+ t.length == 1 and t[0].to_exp?
141
50
  end
142
51
 
143
- def to_exp(options)
52
+ def to_exp(options = {})
53
+ statement_list.remove_empty_statement
144
54
  @statement_list[0].to_exp({})
145
55
  end
146
56
 
147
57
  def to_statement?
148
- @statement_list.statement_list.select{|s|
58
+ t = @statement_list.statement_list.select{|s|
149
59
  s.class != StEmpty
150
- }.length == 1
60
+ }
61
+ return false if t.length != 1
62
+ #
63
+ # if(a){ //<= this block must not be removed
64
+ # while(true)
65
+ # if(b){
66
+ # ;
67
+ # }
68
+ # }
69
+ # else{
70
+ # ;
71
+ # }
72
+ #
73
+ last_st = t[0].last_statement[-2]
74
+ if last_st.kind_of?(StIf) and last_st.else_st.nil?
75
+ return false
76
+ else
77
+ return true
78
+ end
151
79
  end
152
80
 
153
81
  def to_statement
154
82
  statement_list.remove_empty_statement
155
83
  @statement_list[0]
156
84
  end
85
+
86
+ def last_statement
87
+ list = [self]
88
+ t = @statement_list.statement_list.select{|s|
89
+ s.class != StEmpty
90
+ }
91
+ return [nil] if t[-1].nil?
92
+ list.concat(t[-1].last_statement)
93
+ end
157
94
  end
158
95
  #
159
96
  # 12.2
@@ -170,6 +107,13 @@ module Minjs
170
107
  @context = context
171
108
  end
172
109
 
110
+ def deep_dup
111
+ self.class.new(@context,
112
+ @vars.collect{|x,y|
113
+ [x.deep_dup, y ? y.deep_dup : nil]
114
+ })
115
+ end
116
+
173
117
  def replace(from, to)
174
118
  @vars.each do |x|
175
119
  if x[0] == from
@@ -220,18 +164,38 @@ module Minjs
220
164
  end
221
165
  @vars = v1.concat(v2)
222
166
  end
167
+
168
+ def remove_paren
169
+ @vars.each do |x|
170
+ if x[1] and x[1].kind_of? ExpParen and x[1].val.priority <= 130
171
+ x[1] = x[1].val
172
+ end
173
+ end
174
+ end
175
+ def last_statement
176
+ [self]
177
+ end
223
178
  end
224
179
 
225
180
  #12.3 empty
226
181
  class StEmpty < St
227
182
  def initialize()
228
183
  end
184
+
185
+ def deep_dup
186
+ self.class.new()
187
+ end
188
+
229
189
  def traverse(parent, &block)
230
190
  yield self, parent
231
191
  end
192
+
232
193
  def to_js(options = {})
233
194
  ";"
234
195
  end
196
+ def last_statement
197
+ [nil]
198
+ end
235
199
  end
236
200
 
237
201
  #12.4
@@ -242,6 +206,10 @@ module Minjs
242
206
  @exp = exp
243
207
  end
244
208
 
209
+ def deep_dup
210
+ self.class.new(@exp.deep_dup)
211
+ end
212
+
245
213
  def replace(from, to)
246
214
  if @exp == from
247
215
  @exp = to
@@ -257,13 +225,22 @@ module Minjs
257
225
  concat(options, @exp, ";")
258
226
  end
259
227
 
260
- def to_exp(options)
228
+ def to_exp(options = {})
261
229
  @exp
262
230
  end
263
231
 
264
232
  def to_exp?
265
233
  true
266
234
  end
235
+
236
+ def remove_paren
237
+ if @exp.kind_of? ExpParen
238
+ @exp = @exp.val if @exp.remove_paren?
239
+ end
240
+ end
241
+ def last_statement
242
+ [self]
243
+ end
267
244
  end
268
245
 
269
246
  #12.5
@@ -276,6 +253,10 @@ module Minjs
276
253
  @else_st = else_st
277
254
  end
278
255
 
256
+ def deep_dup
257
+ self.class.new(@cond.deep_dup, @then_st.deep_dup, @else_st.deep_dup)
258
+ end
259
+
279
260
  def replace(from, to)
280
261
  if from == @then_st
281
262
  @then_st = to
@@ -293,6 +274,10 @@ module Minjs
293
274
  yield self, parent
294
275
  end
295
276
 
277
+ def deep_dup
278
+ self.class.new(@cond.deep_dup, @then_st.deep_dup, @else_st ? @else_st.deep_dup : nil)
279
+ end
280
+
296
281
  def to_js(options = {})
297
282
  if @else_st
298
283
  concat options, :if, "(", @cond, ")", @then_st, :else, @else_st
@@ -303,24 +288,17 @@ module Minjs
303
288
 
304
289
  def to_return?
305
290
  if !@else_st
306
- return true if @then_st.class == StReturn
291
+ return false
307
292
  else
308
293
  return true if @then_st.class == StReturn and @else_st.class == StReturn
309
294
  end
310
295
  end
311
296
 
312
297
  def to_return
313
- if !@else_st
314
- cond = ExpParen.new(@cond)
315
- then_exp = ExpParen.new(then_st.exp)
316
- else_exp = ExpVoid.new(ECMA262Numeric.new('0'))
317
- StReturn.new(ExpCond.new(cond, then_exp, else_exp))
318
- else
319
- cond = ExpParen.new(@cond)
320
- then_exp = ExpParen.new(then_st.exp)
321
- else_exp = ExpParen.new(else_st.exp)
322
- StReturn.new(ExpCond.new(cond, then_exp, else_exp))
323
- end
298
+ cond = ExpParen.new(@cond)
299
+ then_exp = ExpParen.new(then_st.exp ? then_st.exp : ExpVoid.new(ExpParen.new(ECMA262Numeric.new(0))))
300
+ else_exp = ExpParen.new(else_st.exp ? else_st.exp : ExpVoid.new(ExpParen.new(ECMA262Numeric.new(0))))
301
+ StReturn.new(ExpCond.new(cond, then_exp, else_exp))
324
302
  end
325
303
 
326
304
  def to_exp?
@@ -333,7 +311,7 @@ module Minjs
333
311
  return true
334
312
  end
335
313
 
336
- def to_exp(options)
314
+ def to_exp(options = {})
337
315
  return nil if to_exp? == false
338
316
  if @else_st
339
317
  then_exp = @then_st.to_exp(options)
@@ -357,6 +335,21 @@ module Minjs
357
335
  ExpCond.new(@cond, then_exp, else_exp)
358
336
  end
359
337
  end
338
+
339
+ def remove_paren
340
+ if @cond.kind_of? ExpParen
341
+ @cond = @cond.val
342
+ end
343
+ end
344
+
345
+ def last_statement
346
+ list = [self]
347
+ if @else_st
348
+ list.concat @else_st.last_statement
349
+ else
350
+ list.concat @then_st.last_statement
351
+ end
352
+ end
360
353
  end
361
354
 
362
355
  #12.6
@@ -365,6 +358,10 @@ module Minjs
365
358
  @exp, @statement = exp, statement
366
359
  end
367
360
 
361
+ def deep_dup
362
+ self.class.new(@exp.deep_dup, @statement.deep_dup)
363
+ end
364
+
368
365
  def replace(from, to)
369
366
  if from == @statement
370
367
  @statement = to
@@ -386,6 +383,17 @@ module Minjs
386
383
 
387
384
  concat(options, :while, "(", @exp, ")", statement)
388
385
  end
386
+
387
+ def remove_paren
388
+ if @exp.kind_of? ExpParen
389
+ @exp = @exp.val
390
+ end
391
+ end
392
+
393
+ def last_statement
394
+ list = [self]
395
+ list.concat @statement.last_statement
396
+ end
389
397
  end
390
398
 
391
399
  class StDoWhile < St
@@ -393,6 +401,10 @@ module Minjs
393
401
  @exp, @statement = exp, statement
394
402
  end
395
403
 
404
+ def deep_dup
405
+ self.class.new(@exp.deep_dup, @statement.deep_dup)
406
+ end
407
+
396
408
  def replace(from, to)
397
409
  if from == @statement
398
410
  @statement = to
@@ -414,6 +426,74 @@ module Minjs
414
426
 
415
427
  concat options, :do, statement, :while, "(", @exp, ")", ";"
416
428
  end
429
+ def remove_paren
430
+ if @exp.kind_of? ExpParen
431
+ @exp = @exp.val
432
+ end
433
+ end
434
+ def last_statement
435
+ list = [self]
436
+ list.concat @statement.last_statement
437
+ end
438
+ end
439
+
440
+ #
441
+ # 12.6.3 the for statement
442
+ #
443
+ class StFor < St
444
+ def initialize(exp1, exp2, exp3, statement)
445
+ @exp1 = exp1
446
+ @exp2 = exp2
447
+ @exp3 = exp3
448
+ @statement = statement
449
+ end
450
+
451
+ def deep_dup
452
+ self.class.new(@exp1 && @exp1.deep_dup,
453
+ @exp2 && @exp2.deep_dup,
454
+ @exp3 && @exp3.deep_dup,
455
+ @statement.deep_dup)
456
+ end
457
+
458
+ def replace(from, to)
459
+ if from == @statement
460
+ @statement = to
461
+ end
462
+ end
463
+
464
+ def traverse(parent, &block)
465
+ @exp1.traverse(self, &block)
466
+ @exp2.traverse(self, &block)
467
+ @exp3.traverse(self, &block)
468
+ @statement.traverse(self, &block)
469
+ yield self, parent
470
+ end
471
+
472
+ def to_js(options = {})
473
+ if @statement.kind_of? StBlock and @statement.statement_list.length == 1
474
+ statement = @statement.statement_list.statement_list[0]
475
+ else
476
+ statement = @statement
477
+ end
478
+
479
+ concat options, :for, "(", @exp1, ";", @exp2, ";", @exp3, ")", statement
480
+ end
481
+
482
+ def remove_paren
483
+ if @exp1.kind_of? ExpParen
484
+ @exp1 = @exp1.val
485
+ end
486
+ if @exp2.kind_of? ExpParen
487
+ @exp2 = @exp2.val
488
+ end
489
+ if @exp3.kind_of? ExpParen
490
+ @exp3 = @exp3.val
491
+ end
492
+ end
493
+ def last_statement
494
+ list = [self]
495
+ list.concat @statement.last_statement
496
+ end
417
497
  end
418
498
 
419
499
  #
@@ -434,6 +514,16 @@ module Minjs
434
514
  @statement = statement
435
515
  end
436
516
 
517
+ def deep_dup
518
+ self.class.new(@context,
519
+ @var_decl_list.collect{|x,y|
520
+ [x.deep_dup, y.deep_dup]
521
+ },
522
+ @exp2 && @exp2.deep_dup,
523
+ @exp3 && @exp3.deep_dup,
524
+ @statement.deep_dup)
525
+ end
526
+
437
527
  def replace(from, to)
438
528
  if from == @statement
439
529
  @statement = to
@@ -490,16 +580,37 @@ module Minjs
490
580
  t = concat({:for_args => true}.merge(options), :for, "(var", _var_decl_list, ";", @exp2, ";", @exp3, ")")
491
581
  concat options, t, statement
492
582
  end
583
+
584
+ def remove_paren
585
+ @var_decl_list.each do|x|
586
+ if x[1] and x[1].kind_of? ExpParen
587
+ x[1] = x[1].val
588
+ end
589
+ end
590
+ if @exp2.kind_of? ExpParen
591
+ @exp2 = @exp2.val
592
+ end
593
+ if @exp3.kind_of? ExpParen
594
+ @exp3 = @exp3.val
595
+ end
596
+ end
597
+ def last_statement
598
+ list = [self]
599
+ list.concat @statement.last_statement
600
+ end
493
601
  end
494
602
 
495
- class StFor < St
496
- def initialize(exp1, exp2, exp3, statement)
603
+ class StForIn < St
604
+ def initialize(exp1, exp2, statement)
497
605
  @exp1 = exp1
498
606
  @exp2 = exp2
499
- @exp3 = exp3
500
607
  @statement = statement
501
608
  end
502
609
 
610
+ def deep_dup
611
+ self.class.new(@exp1.deep_dup, @exp2.deep_dup, @statement.deep_dup)
612
+ end
613
+
503
614
  def replace(from, to)
504
615
  if from == @statement
505
616
  @statement = to
@@ -509,7 +620,6 @@ module Minjs
509
620
  def traverse(parent, &block)
510
621
  @exp1.traverse(self, &block)
511
622
  @exp2.traverse(self, &block)
512
- @exp3.traverse(self, &block)
513
623
  @statement.traverse(self, &block)
514
624
  yield self, parent
515
625
  end
@@ -521,7 +631,20 @@ module Minjs
521
631
  statement = @statement
522
632
  end
523
633
 
524
- concat options, :for, "(", @exp1, ";", @exp2, ";", @exp3, ")", statement
634
+ concat options, :for, '(', @exp1, :in, @exp2, ')', statement
635
+ end
636
+
637
+ def remove_paren
638
+ if @exp1.kind_of? ExpParen and @exp1.priority <= 20 #left-hand
639
+ @exp1 = @exp1.val
640
+ end
641
+ if @exp2.kind_of? ExpParen
642
+ @exp2 = @exp2.val
643
+ end
644
+ end
645
+ def last_statement
646
+ list = [self]
647
+ list.concat @statement.last_statement
525
648
  end
526
649
  end
527
650
 
@@ -535,6 +658,13 @@ module Minjs
535
658
  @statement = statement
536
659
  end
537
660
 
661
+ def deep_dup
662
+ self.class.new(@context,
663
+ [@var_decl[0].deep_dup, @var_decl[1] ? @var_decl[1].deep_dup : nil],
664
+ @exp2.deep_dup,
665
+ @statement.deep_dup)
666
+ end
667
+
538
668
  def traverse(parent, &block)
539
669
  @var_decl[0].traverse(self, &block)
540
670
  @var_decl[1].traverse(self, &block) if @var_decl[1]
@@ -570,50 +700,35 @@ module Minjs
570
700
  _var_decl = concat(options, @var_decl[0])
571
701
  end
572
702
 
573
- # if options[:compress_var]
574
- # concat options, :for, "(", _var_decl, :in, @exp2, ")", statement
575
- # else
576
703
  concat options, :for, "(", :var, _var_decl, :in, @exp2, ")", statement
577
- # end
578
- end
579
- end
580
-
581
- class StForIn < St
582
- def initialize(exp1, exp2, statement)
583
- @exp1 = exp1
584
- @exp2 = exp2
585
- @statement = statement
586
704
  end
587
705
 
588
- def replace(from, to)
589
- if from == @statement
590
- @statement = to
706
+ def remove_paren
707
+ if @var_decl[1] and @var_decl[1].kind_of? ExpParen
708
+ @var_decl[1] = @var_decl[1].val
591
709
  end
592
- end
593
-
594
- def traverse(parent, &block)
595
- @exp1.traverse(self, &block)
596
- @exp2.traverse(self, &block)
597
- @statement.traverse(self, &block)
598
- yield self, parent
599
- end
600
-
601
- def to_js(options = {})
602
- if @statement.kind_of? StBlock and @statement.statement_list.length == 1
603
- statement = @statement.statement_list.statement_list[0]
604
- else
605
- statement = @statement
710
+ if @exp2.kind_of? ExpParen
711
+ @exp2 = @exp2.val
606
712
  end
713
+ end
607
714
 
608
- concat options, :for, '(', @exp1, :in, @exp2, ')', statement
715
+ def last_statement
716
+ list = [self]
717
+ list.concat @statement.last_statement
609
718
  end
610
719
  end
611
720
 
721
+
612
722
  #12.7
613
723
  class StContinue < St
614
724
  def initialize(exp = nil)
615
725
  @exp = exp
616
726
  end
727
+
728
+ def deep_dup
729
+ self.class.new(@exp)
730
+ end
731
+
617
732
  def traverse(parent, &block)
618
733
  @exp.traverse(self, &block) if @exp
619
734
  yield self, parent
@@ -625,6 +740,9 @@ module Minjs
625
740
  concat options, :continue, ";"
626
741
  end
627
742
  end
743
+ def last_statement
744
+ [self]
745
+ end
628
746
  end
629
747
 
630
748
  #12.8
@@ -633,6 +751,10 @@ module Minjs
633
751
  @exp = exp
634
752
  end
635
753
 
754
+ def deep_dup
755
+ self.class.new(@exp)
756
+ end
757
+
636
758
  def traverse(parent, &block)
637
759
  @exp.traverse(self, &block) if @exp
638
760
  yield self, parent
@@ -645,6 +767,9 @@ module Minjs
645
767
  concat options, :break, ";"
646
768
  end
647
769
  end
770
+ def last_statement
771
+ [self]
772
+ end
648
773
  end
649
774
 
650
775
  #12.9
@@ -655,16 +780,33 @@ module Minjs
655
780
  @exp = exp
656
781
  end
657
782
 
783
+ def deep_dup
784
+ self.class.new(@exp)
785
+ end
786
+
787
+ def deep_dup
788
+ self.class.new(exp ? exp.deep_dup : nil)
789
+ end
790
+
658
791
  def replace(from, to)
659
792
  if from == @exp
660
793
  @exp = to
661
794
  end
662
795
  end
796
+
663
797
  def traverse(parent, &block)
664
798
  @exp.traverse(self, &block) if @exp
665
799
  yield self, parent
666
800
  end
667
801
 
802
+ def to_return?
803
+ true
804
+ end
805
+
806
+ def to_return
807
+ self
808
+ end
809
+
668
810
  def to_js(options = {})
669
811
  if @exp
670
812
  concat options, :return, @exp, ";"
@@ -672,6 +814,14 @@ module Minjs
672
814
  concat options, :return, ";"
673
815
  end
674
816
  end
817
+ def remove_paren
818
+ if @exp.kind_of? ExpParen
819
+ @exp = @exp.val
820
+ end
821
+ end
822
+ def last_statement
823
+ [self]
824
+ end
675
825
  end
676
826
  #12.10
677
827
  class StWith < St
@@ -680,6 +830,10 @@ module Minjs
680
830
  @statement = statement
681
831
  end
682
832
 
833
+ def deep_dup
834
+ self.class.new(@exp)
835
+ end
836
+
683
837
  def traverse(parent, &block)
684
838
  @exp.traverse(self, &block)
685
839
  @statement.traverse(self, &block)
@@ -689,6 +843,15 @@ module Minjs
689
843
  def to_js(options = {})
690
844
  concat options, :with, "(", @exp, ")", @statement
691
845
  end
846
+ def remove_paren
847
+ if @exp.kind_of? ExpParen
848
+ @exp = @exp.val
849
+ end
850
+ end
851
+ def last_statement
852
+ list = [self]
853
+ list.concat @statement.last_statement
854
+ end
692
855
  end
693
856
  #12.11
694
857
  class StSwitch < St
@@ -700,6 +863,13 @@ module Minjs
700
863
  @blocks = blocks
701
864
  end
702
865
 
866
+ def deep_dup
867
+ self.class.new(@exp,
868
+ @blocks.collect{|x, y|
869
+ [x.deep_dup, y.deep_dup]
870
+ })
871
+ end
872
+
703
873
  def replace(from, to)
704
874
  if @exp == from
705
875
  @exp = to
@@ -730,6 +900,20 @@ module Minjs
730
900
  end
731
901
  t = concat(options, t, "}")
732
902
  end
903
+
904
+ def remove_paren
905
+ if @exp.kind_of? ExpParen
906
+ @exp = @exp.val
907
+ end
908
+ @blocks.each do |b|
909
+ if b[0] and b[0].kind_of? ExpParen
910
+ b[0] = b[0].val
911
+ end
912
+ end
913
+ end
914
+ def last_statement
915
+ list = [self]
916
+ end
733
917
  end
734
918
  #12.12
735
919
  class StLabelled < St
@@ -738,6 +922,10 @@ module Minjs
738
922
  @statement = statement
739
923
  end
740
924
 
925
+ def deep_dup
926
+ self.class.new(@id, @statement)
927
+ end
928
+
741
929
  def replace(from, to)
742
930
  if from == @id
743
931
  @id = to
@@ -755,6 +943,11 @@ module Minjs
755
943
  def to_js(options = {})
756
944
  concat options, @id, ":", @statement
757
945
  end
946
+
947
+ def last_statement
948
+ list = [self]
949
+ list.concat @statement.last_statement
950
+ end
758
951
  end
759
952
 
760
953
  #12.13
@@ -763,6 +956,10 @@ module Minjs
763
956
  @exp = exp
764
957
  end
765
958
 
959
+ def deep_dup
960
+ self.class.new(@exp)
961
+ end
962
+
766
963
  def traverse(parent, &block)
767
964
  @exp.traverse(self, &block)
768
965
  yield self, parent
@@ -771,6 +968,10 @@ module Minjs
771
968
  def to_js(options = {})
772
969
  concat options, :throw, @exp, ";"
773
970
  end
971
+
972
+ def last_statement
973
+ [self]
974
+ end
774
975
  end
775
976
 
776
977
  #12.14
@@ -781,6 +982,10 @@ module Minjs
781
982
  @finally = finally
782
983
  end
783
984
 
985
+ def deep_dup
986
+ self.class.new(@try, @catch, @finally)
987
+ end
988
+
784
989
  def replace(from, to)
785
990
  if from == @try
786
991
  @try = to
@@ -812,17 +1017,32 @@ module Minjs
812
1017
  concat(options, :try, @try, :finally, @finally)
813
1018
  end
814
1019
  end
1020
+ def last_statement
1021
+ [self]
1022
+ end
815
1023
  end
816
1024
  #12.15
817
1025
  class StDebugger < St
1026
+ def deep_dup
1027
+ self.class.new
1028
+ end
1029
+
818
1030
  def traverse
819
1031
  yield self, parent
820
1032
  end
821
1033
  def to_js(options = {})
822
1034
  concat options, :debugger, ";"
823
1035
  end
1036
+ def last_statement
1037
+ [self]
1038
+ end
824
1039
  end
825
- #13 function
1040
+
1041
+ #
1042
+ # 13 function / function expression
1043
+ #
1044
+ # 11.1.5 getter/setter
1045
+ #
826
1046
  class StFunc < St
827
1047
  attr_reader :name
828
1048
  attr_reader :args
@@ -839,10 +1059,17 @@ module Minjs
839
1059
  @setter = options[:setter]
840
1060
  end
841
1061
 
842
- def priority(exp)
1062
+ def priority
843
1063
  10
844
1064
  end
845
1065
 
1066
+ def deep_dup
1067
+ self.class.new(@context, @name ? @name.deep_dup : nil,
1068
+ @args.collect{|args|args.deep_dup},
1069
+ @statements.deep_dup,
1070
+ {decl: @decl, getter: @getter, setter: @setter})
1071
+ end
1072
+
846
1073
  def traverse(parent, &block)
847
1074
  @name.traverse(self, &block) if @name
848
1075
  @args.each do |arg|
@@ -874,6 +1101,10 @@ module Minjs
874
1101
  def decl?
875
1102
  @decl
876
1103
  end
1104
+
1105
+ def last_statement
1106
+ [self]
1107
+ end
877
1108
  end
878
1109
  end
879
1110
  end