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.
- checksums.yaml +4 -4
- data/lib/minjs/compressor.rb +130 -121
- data/lib/minjs/ctype.rb +2 -0
- data/lib/minjs/ecma262/base.rb +172 -34
- data/lib/minjs/ecma262/exp.rb +644 -388
- data/lib/minjs/ecma262/lit.rb +39 -3
- data/lib/minjs/ecma262/st.rb +388 -157
- data/lib/minjs/exceptions.rb +1 -1
- data/lib/minjs/expression.rb +88 -76
- data/lib/minjs/func.rb +1 -2
- data/lib/minjs/lex.rb +7 -7
- data/lib/minjs/minjs_compressor.rb +8 -4
- data/lib/minjs/program.rb +1 -1
- data/lib/minjs/statement.rb +32 -15
- data/lib/minjs/version.rb +1 -1
- metadata +2 -2
data/lib/minjs/ecma262/st.rb
CHANGED
@@ -9,113 +9,15 @@ module Minjs
|
|
9
9
|
false
|
10
10
|
end
|
11
11
|
|
12
|
-
def priority
|
12
|
+
def priority
|
13
13
|
999
|
14
14
|
end
|
15
|
-
end
|
16
15
|
|
17
|
-
|
18
|
-
|
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
|
-
|
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
|
-
}
|
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
|
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
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
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
|
496
|
-
def initialize(exp1, exp2,
|
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,
|
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
|
589
|
-
if
|
590
|
-
@
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|