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.
@@ -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
- #;; means empty statement that must not be deleted
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 == "}"
@@ -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 = ExpPare.new(@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 = ExpPare.new(@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?
@@ -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 hex_number?(v[pos+2])
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 hex_number?(v[pos])
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
- if y.kind_of? StFunc and (y.getter? || y.setter?)
727
- if y.name.val == :get
728
- t = "get #{x.val.to_s}(){#{y.statements.to_js(options)}}"
729
- else
730
- t = "set #{x.val.to_s}(#{y.args[0].to_js(options)}){#{y.statements.to_js(options)}}"
731
- end
732
- else
733
- if x.kind_of? ECMA262Numeric
734
- a = "#{x.to_ecma262_string}"
735
- t = a
736
- elsif idname?(x.val.to_s)
737
- t = "#{x.val.to_s}"
738
- else
739
- t = "#{x.to_js(options)}"
740
- end
741
- t << ":#{y.to_js(options)}"
742
- end
743
- }.join(",") + "}"
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, has_lf)
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
- if lt?
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
- @has_lf ? true : false
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
- @@sym[val] ||= self.new(context, val)
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
@@ -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
@@ -1237,8 +1237,8 @@ module Minjs
1237
1237
  end
1238
1238
 
1239
1239
  #
1240
- # 13 function / function expression
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, '(', _args, ")", "{", @statements, "}"
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