minjs 0.2.2 → 0.3.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.
- checksums.yaml +4 -4
- data/exe/minjs +12 -2
- data/lib/minjs.rb +0 -1
- data/lib/minjs/compressor.rb +24 -21
- data/lib/minjs/ctype.rb +1239 -836
- data/lib/minjs/ecma262/base.rb +1 -1
- data/lib/minjs/ecma262/exp.rb +31 -2
- data/lib/minjs/ecma262/lit.rb +103 -56
- data/lib/minjs/ecma262/punc.rb +6 -2
- data/lib/minjs/ecma262/st.rb +7 -3
- data/lib/minjs/exceptions.rb +3 -3
- data/lib/minjs/expression.rb +597 -496
- data/lib/minjs/func.rb +80 -66
- data/lib/minjs/lex.rb +629 -407
- data/lib/minjs/program.rb +16 -12
- data/lib/minjs/statement.rb +321 -309
- data/lib/minjs/version.rb +1 -1
- metadata +2 -3
- data/lib/minjs/literal.rb +0 -45
data/lib/minjs/ecma262/base.rb
CHANGED
@@ -24,7 +24,7 @@ module Minjs
|
|
24
24
|
if prev.match(/[\w\$]\z/) and js.match(/\A[\w\$]/)
|
25
25
|
sep = ' '
|
26
26
|
end
|
27
|
-
|
27
|
+
#';;' means 'empty statement' that must not be deleted
|
28
28
|
if prev.match(/;;\Z/)
|
29
29
|
prev.sub!(/;;\Z/, ";")
|
30
30
|
elsif prev.match(/;\Z/) and js == "}"
|
data/lib/minjs/ecma262/exp.rb
CHANGED
@@ -30,6 +30,10 @@ module Minjs
|
|
30
30
|
def reduce(parent)
|
31
31
|
end
|
32
32
|
|
33
|
+
def left_hand_side_exp?
|
34
|
+
false
|
35
|
+
end
|
36
|
+
|
33
37
|
def priority
|
34
38
|
9999
|
35
39
|
end
|
@@ -46,6 +50,7 @@ module Minjs
|
|
46
50
|
end
|
47
51
|
self
|
48
52
|
end
|
53
|
+
|
49
54
|
def add_paren
|
50
55
|
if @val.priority > self.priority
|
51
56
|
@val = ExpParen.new(@val)
|
@@ -142,6 +147,10 @@ module Minjs
|
|
142
147
|
def to_js(options = {})
|
143
148
|
concat options, sym, @val
|
144
149
|
end
|
150
|
+
|
151
|
+
def left_hand_side_exp?
|
152
|
+
true
|
153
|
+
end
|
145
154
|
end
|
146
155
|
|
147
156
|
class ExpArg2 < Exp
|
@@ -212,6 +221,10 @@ module Minjs
|
|
212
221
|
"(#{@val.to_js(options)})"
|
213
222
|
end
|
214
223
|
|
224
|
+
def left_hand_side_exp?
|
225
|
+
true
|
226
|
+
end
|
227
|
+
|
215
228
|
def remove_paren?
|
216
229
|
js = @val.to_js
|
217
230
|
if js.match(/^function/) or js.match(/^{/)
|
@@ -274,6 +287,10 @@ module Minjs
|
|
274
287
|
"#{@val.to_js(options)}[#{@val2.to_js(options)}]"
|
275
288
|
end
|
276
289
|
|
290
|
+
def left_hand_side_exp?
|
291
|
+
true
|
292
|
+
end
|
293
|
+
|
277
294
|
def remove_paren
|
278
295
|
if @val.kind_of? ExpParen and @val.val.priority <= PRIORITY_LEFT_HAND_SIDE
|
279
296
|
@val = @val.val if @val.remove_paren?
|
@@ -286,7 +303,7 @@ module Minjs
|
|
286
303
|
|
287
304
|
def add_paren
|
288
305
|
if @val.priority > PRIORITY_LEFT_HAND_SIDE
|
289
|
-
@val =
|
306
|
+
@val = ExpParen.new(@val)
|
290
307
|
end
|
291
308
|
self
|
292
309
|
end
|
@@ -324,6 +341,10 @@ module Minjs
|
|
324
341
|
"#{@val.to_js(options)}.#{@val2.val}"
|
325
342
|
end
|
326
343
|
|
344
|
+
def left_hand_side_exp?
|
345
|
+
true
|
346
|
+
end
|
347
|
+
|
327
348
|
def remove_paren
|
328
349
|
if @val.kind_of? ExpParen and @val.val.priority <= PRIORITY_LEFT_HAND_SIDE
|
329
350
|
@val = @val.val if @val.remove_paren?
|
@@ -390,6 +411,10 @@ module Minjs
|
|
390
411
|
"#{@name.to_js(options)}(#{args})"
|
391
412
|
end
|
392
413
|
|
414
|
+
def left_hand_side_exp?
|
415
|
+
true
|
416
|
+
end
|
417
|
+
|
393
418
|
def remove_paren
|
394
419
|
if @name.kind_of? ExpParen and @name.val.priority <= PRIORITY_LEFT_HAND_SIDE
|
395
420
|
@name = @name.val if @name.remove_paren?
|
@@ -408,7 +433,7 @@ module Minjs
|
|
408
433
|
|
409
434
|
def add_paren
|
410
435
|
if @name.priority > PRIORITY_LEFT_HAND_SIDE
|
411
|
-
@name =
|
436
|
+
@name = ExpParen.new(@name)
|
412
437
|
end
|
413
438
|
if @args
|
414
439
|
@args.map! do |arg|
|
@@ -478,6 +503,10 @@ module Minjs
|
|
478
503
|
end
|
479
504
|
end
|
480
505
|
|
506
|
+
def left_hand_side_exp?
|
507
|
+
true
|
508
|
+
end
|
509
|
+
|
481
510
|
def remove_paren
|
482
511
|
if @name.kind_of? ExpParen and @name.val.priority <= PRIORITY_LEFT_HAND_SIDE
|
483
512
|
@name = @name.val if @name.remove_paren?
|
data/lib/minjs/ecma262/lit.rb
CHANGED
@@ -86,6 +86,38 @@ module Minjs
|
|
86
86
|
|
87
87
|
LIT_LINE_FEED = LineFeed.get
|
88
88
|
|
89
|
+
class This < Literal
|
90
|
+
attr_reader :context
|
91
|
+
|
92
|
+
def initialize(context)
|
93
|
+
@context = context
|
94
|
+
end
|
95
|
+
|
96
|
+
def deep_dup
|
97
|
+
self.class.new(@context)
|
98
|
+
end
|
99
|
+
|
100
|
+
def traverse(parent, &block)
|
101
|
+
yield self, parent
|
102
|
+
end
|
103
|
+
|
104
|
+
def to_s
|
105
|
+
"this"
|
106
|
+
end
|
107
|
+
|
108
|
+
def ==(obj)
|
109
|
+
self.class == obj.class
|
110
|
+
end
|
111
|
+
|
112
|
+
def to_js(options = {})
|
113
|
+
"this"
|
114
|
+
end
|
115
|
+
|
116
|
+
def left_hand_side_exp?
|
117
|
+
true
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
89
121
|
class Null < Literal
|
90
122
|
def initialize(val)
|
91
123
|
@val = :null
|
@@ -111,6 +143,10 @@ module Minjs
|
|
111
143
|
"null"
|
112
144
|
end
|
113
145
|
|
146
|
+
def left_hand_side_exp?
|
147
|
+
true
|
148
|
+
end
|
149
|
+
|
114
150
|
@@instance = self.new(nil)
|
115
151
|
def self.get
|
116
152
|
@@instance
|
@@ -161,6 +197,10 @@ module Minjs
|
|
161
197
|
@val.to_s
|
162
198
|
end
|
163
199
|
|
200
|
+
def left_hand_side_exp?
|
201
|
+
true
|
202
|
+
end
|
203
|
+
|
164
204
|
def true?
|
165
205
|
@val == :true
|
166
206
|
end
|
@@ -269,6 +309,10 @@ module Minjs
|
|
269
309
|
end
|
270
310
|
end
|
271
311
|
|
312
|
+
def left_hand_side_exp?
|
313
|
+
true
|
314
|
+
end
|
315
|
+
|
272
316
|
def to_ecma262_boolean
|
273
317
|
if @val.length == 0
|
274
318
|
false
|
@@ -294,13 +338,13 @@ module Minjs
|
|
294
338
|
end
|
295
339
|
end
|
296
340
|
#hex
|
297
|
-
if v[pos] == 0x30 and (v[pos+1] == 0x78 || v[pos+1] == 0x58) and
|
341
|
+
if v[pos] == 0x30 and (v[pos+1] == 0x78 || v[pos+1] == 0x58) and hex_digit?(v[pos+2])
|
298
342
|
base = 16
|
299
343
|
pos += 2
|
300
344
|
pos0 = pos
|
301
345
|
while true
|
302
346
|
break if v[pos].nil?
|
303
|
-
if
|
347
|
+
if hex_digit?(v[pos])
|
304
348
|
pos += 1
|
305
349
|
else
|
306
350
|
break
|
@@ -499,6 +543,8 @@ module Minjs
|
|
499
543
|
return "-Infinity"
|
500
544
|
end
|
501
545
|
t0 = to_ecma262_string
|
546
|
+
t0.sub!(/^0\./, '.')
|
547
|
+
|
502
548
|
t = @integer.nil? ? "" : @integer.dup.to_s
|
503
549
|
|
504
550
|
d = @decimal.to_s
|
@@ -526,6 +572,10 @@ module Minjs
|
|
526
572
|
t.length <= t0.length ? t : t0
|
527
573
|
end
|
528
574
|
|
575
|
+
def left_hand_side_exp?
|
576
|
+
true
|
577
|
+
end
|
578
|
+
|
529
579
|
def to_i
|
530
580
|
to_ecma262_string.to_i
|
531
581
|
end
|
@@ -649,6 +699,10 @@ module Minjs
|
|
649
699
|
def to_js(options = {})
|
650
700
|
"/#{@body}/#{@flags}"
|
651
701
|
end
|
702
|
+
|
703
|
+
def left_hand_side_exp?
|
704
|
+
true
|
705
|
+
end
|
652
706
|
end
|
653
707
|
|
654
708
|
LITERAL_TRUE = Boolean.new(:true)
|
@@ -679,6 +733,11 @@ module Minjs
|
|
679
733
|
def to_js(options = {})
|
680
734
|
"[" + @val.collect{|x| x.to_s}.join(",") + "]"
|
681
735
|
end
|
736
|
+
|
737
|
+
def left_hand_side_exp?
|
738
|
+
true
|
739
|
+
end
|
740
|
+
|
682
741
|
def to_ecma262_boolean
|
683
742
|
true
|
684
743
|
end
|
@@ -693,18 +752,6 @@ module Minjs
|
|
693
752
|
@val = val
|
694
753
|
end
|
695
754
|
|
696
|
-
#=>Ctype
|
697
|
-
# def idname?(name)
|
698
|
-
# return false if name.length == 0
|
699
|
-
# s = name.codepoints
|
700
|
-
# return false unless identifier_start?(s[0])
|
701
|
-
# s.unshift
|
702
|
-
# s.each do |code|
|
703
|
-
# return false unless identifier_part?(code)
|
704
|
-
# end
|
705
|
-
# return true
|
706
|
-
# end
|
707
|
-
|
708
755
|
def deep_dup
|
709
756
|
self.class.new(@val.collect{|x, y| [x.deep_dup, y ? y.deep_dup : y]})
|
710
757
|
end
|
@@ -722,38 +769,32 @@ module Minjs
|
|
722
769
|
end
|
723
770
|
|
724
771
|
def to_js(options = {})
|
725
|
-
"{" + @val.collect{|x, y|
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
772
|
+
concat(options, "{" + @val.collect{|x, y|
|
773
|
+
if y.kind_of? StFunc and (y.getter? || y.setter?)
|
774
|
+
if y.name.val == :get
|
775
|
+
t = concat options, "get", x.val, "()", "{", y.statements, "}"
|
776
|
+
else
|
777
|
+
t = concat options, "set", x.val, "(", y.args[0], ")", "{", y.statements, "}"
|
778
|
+
end
|
779
|
+
else
|
780
|
+
if x.kind_of? ECMA262Numeric
|
781
|
+
t = concat options, x.to_ecma262_string, ":", y
|
782
|
+
elsif idname?(x.val.to_s)
|
783
|
+
t = concat options, x.val, ":", y
|
784
|
+
else
|
785
|
+
t = concat options, x, ":", y
|
786
|
+
end
|
787
|
+
end
|
788
|
+
}.join(","), "}")
|
789
|
+
end
|
790
|
+
|
791
|
+
def left_hand_side_exp?
|
792
|
+
true
|
744
793
|
end
|
794
|
+
|
745
795
|
def to_ecma262_boolean
|
746
796
|
true
|
747
797
|
end
|
748
|
-
# def ecma262_eval(type)
|
749
|
-
#
|
750
|
-
# case type
|
751
|
-
# when :boolean
|
752
|
-
# to_ecma262_boolean
|
753
|
-
# else
|
754
|
-
# nil
|
755
|
-
# end
|
756
|
-
# end
|
757
798
|
end
|
758
799
|
|
759
800
|
class SingleLineComment < Literal
|
@@ -780,27 +821,21 @@ module Minjs
|
|
780
821
|
|
781
822
|
class MultiLineComment < Literal
|
782
823
|
attr_reader :comment, :has_lf
|
824
|
+
include Ctype
|
783
825
|
|
784
|
-
def initialize(comment
|
826
|
+
def initialize(comment)
|
785
827
|
@comment = comment
|
786
|
-
@has_lf = has_lf
|
787
828
|
end
|
788
829
|
|
789
830
|
def traverse(parent, &block)
|
790
831
|
end
|
791
832
|
|
792
833
|
def ==(obj)
|
793
|
-
self.class == obj.class and
|
794
|
-
@comment == obj.comment and
|
795
|
-
@has_lf == obj.has_lf
|
834
|
+
self.class == obj.class and @comment == obj.comment
|
796
835
|
end
|
797
836
|
|
798
837
|
def to_js(options)
|
799
|
-
|
800
|
-
"/*#{@comment}*/"
|
801
|
-
else
|
802
|
-
"/*#{@comment}*/"
|
803
|
-
end
|
838
|
+
"/*#{@comment}*/"
|
804
839
|
end
|
805
840
|
|
806
841
|
def ws?
|
@@ -808,7 +843,10 @@ module Minjs
|
|
808
843
|
end
|
809
844
|
|
810
845
|
def lt?
|
811
|
-
@
|
846
|
+
@comment.codepoints.each{|char|
|
847
|
+
return true if line_terminator?(char)
|
848
|
+
}
|
849
|
+
false
|
812
850
|
end
|
813
851
|
end
|
814
852
|
|
@@ -824,7 +862,11 @@ module Minjs
|
|
824
862
|
end
|
825
863
|
|
826
864
|
def self.get(context, val)
|
827
|
-
|
865
|
+
if reserved?(val)
|
866
|
+
@@sym[val] ||= self.new(context, val)
|
867
|
+
else
|
868
|
+
self.new(context, val)
|
869
|
+
end
|
828
870
|
end
|
829
871
|
|
830
872
|
RESERVED_WORD = Set.new [
|
@@ -861,6 +903,10 @@ module Minjs
|
|
861
903
|
val.to_s
|
862
904
|
end
|
863
905
|
|
906
|
+
def left_hand_side_exp?
|
907
|
+
true
|
908
|
+
end
|
909
|
+
|
864
910
|
def binding_env(type = :var)
|
865
911
|
return nil if context.nil?
|
866
912
|
if type == :var
|
@@ -907,10 +953,11 @@ module Minjs
|
|
907
953
|
ID_CATCH = IdentifierName.get(nil, :catch)
|
908
954
|
ID_FINALLY = IdentifierName.get(nil, :finally)
|
909
955
|
ID_DEBUGGER = IdentifierName.get(nil, :debugger)
|
910
|
-
ID_GET = IdentifierName.get(nil, :get)
|
911
|
-
ID_SET = IdentifierName.get(nil, :set)
|
912
956
|
ID_CASE = IdentifierName.get(nil, :case)
|
913
957
|
ID_DEFAULT = IdentifierName.get(nil, :default)
|
958
|
+
# Note: get and set are not reserved word
|
959
|
+
ID_GET = IdentifierName.get(nil, :get)
|
960
|
+
ID_SET = IdentifierName.get(nil, :set)
|
914
961
|
|
915
962
|
end
|
916
963
|
end
|
data/lib/minjs/ecma262/punc.rb
CHANGED
@@ -31,12 +31,16 @@ module Minjs
|
|
31
31
|
val.to_s
|
32
32
|
end
|
33
33
|
|
34
|
+
def to_js
|
35
|
+
val.to_s
|
36
|
+
end
|
37
|
+
|
34
38
|
def ==(obj)
|
35
39
|
self.class == obj.class and self.val == obj.val
|
36
40
|
end
|
37
41
|
end
|
38
42
|
PUNC_CONDIF = Punctuator.get('?')
|
39
|
-
PUNC_CONDELSE = Punctuator.get(':')
|
43
|
+
#PUNC_CONDELSE = Punctuator.get(':')
|
40
44
|
PUNC_LET = Punctuator.get('=')
|
41
45
|
PUNC_DIVLET = Punctuator.get('/=')
|
42
46
|
PUNC_MULLET = Punctuator.get('*=')
|
@@ -81,7 +85,7 @@ module Minjs
|
|
81
85
|
PUNC_LCURLYBRAC = Punctuator.get('{')
|
82
86
|
PUNC_RCURLYBRAC = Punctuator.get('}')
|
83
87
|
PUNC_COMMA = Punctuator.get(',')
|
84
|
-
PUNC_COLON = Punctuator.get(':')
|
88
|
+
PUNC_COLON = Punctuator.get(':') #= same as PUNC_CONDELSE
|
85
89
|
PUNC_SEMICOLON = Punctuator.get(';')
|
86
90
|
PUNC_PERIOD = Punctuator.get('.')
|
87
91
|
end
|
data/lib/minjs/ecma262/st.rb
CHANGED
@@ -1237,8 +1237,8 @@ module Minjs
|
|
1237
1237
|
end
|
1238
1238
|
|
1239
1239
|
#
|
1240
|
-
# 13 function
|
1241
|
-
#
|
1240
|
+
# 13 function declaration
|
1241
|
+
# 13 function expression
|
1242
1242
|
# 11.1.5 getter/setter
|
1243
1243
|
#
|
1244
1244
|
class StFunc < St
|
@@ -1287,7 +1287,7 @@ module Minjs
|
|
1287
1287
|
def to_js(options = {})
|
1288
1288
|
_args = @args.collect{|x|x.to_js(options)}.join(",")
|
1289
1289
|
if @getter
|
1290
|
-
concat options, :get, @name,
|
1290
|
+
concat options, :get, @name, "()", "{", @statements, "}"
|
1291
1291
|
elsif @setter
|
1292
1292
|
concat options, :set, @name, '(', _args, ")", "{", @statements, "}"
|
1293
1293
|
else
|
@@ -1295,6 +1295,10 @@ module Minjs
|
|
1295
1295
|
end
|
1296
1296
|
end
|
1297
1297
|
|
1298
|
+
def left_hand_side_exp?
|
1299
|
+
true
|
1300
|
+
end
|
1301
|
+
|
1298
1302
|
def getter?
|
1299
1303
|
@getter
|
1300
1304
|
end
|