lib/minjs/ecma262/exp.rb in minjs-0.2.0 vs lib/minjs/ecma262/exp.rb in minjs-0.2.1

- old
+ new

@@ -230,10 +230,16 @@ def add_paren self end + def to_ecma262_boolean + return nil unless @val.respond_to? :to_ecma262_boolean + return nil if @val.to_ecma262_boolean.nil? + @val.to_ecma262_boolean + end + def ecma262_typeof if @val.respond_to? :ecma262_typeof @val.ecma262_typeof else nil @@ -674,11 +680,10 @@ def priority PRIORITY_UNARY end - #feature def reduce(parent) if @val.kind_of? ECMA262Numeric and (@val.to_js == "0" || @val.to_js == "1") return end @@ -693,10 +698,24 @@ @val.val.ecma262_typeof == :boolean parent.replace(self, @val.val) end end + def to_ecma262_boolean + return nil unless @val.respond_to? :to_ecma262_boolean + return nil if @val.to_ecma262_boolean.nil? + !@val.to_ecma262_boolean + end + + def to_ecma262_number + if @val.respond_to? :to_ecma262_number + v = @val.to_ecma262_number + return nil if v.nil? + v == 0 ? 1 : 0 + end + end + def ecma262_eval(type) if @val.respond_to? :ecma262_eval e = @val.ecma262_eval(type) if e.nil? return nil @@ -731,34 +750,18 @@ @val = @val2 @val2 = t end def reduce(parent) - # a * 1 => a - if @val.kind_of? ECMA262Numeric and @val2.kind_of? ECMA262Numeric and @val.to_num == 1 - parent.replace(self, @val2) - end - # 1 * b => b - if @val.kind_of? ECMA262Numeric and @val2.kind_of? ECMA262Numeric and @val2.to_num == 1 - parent.replace(self, @val) - end - # N * M => (N * M) - if @val.kind_of? ECMA262Numeric and @val2.kind_of? ECMA262Numeric and @val.integer? and @val2.integer? - parent.replace(self, ECMA262Numeric.new(@val.to_num * @val2.to_num)) - end -=begin - # ((a * N) * M) or ((N * a) * M) - if @val2.kind_of? ECMA262Numeric and @val2.integer? and @val.kind_of? ExpMul - if @val.val2.kind_of? ECMA262Numeric and @val.val2.integer? - @val2 = ECMA262Numeric.new(@val.val2.to_num * @val2.to_num) - @val = @val.val - elsif @val.val.kind_of? ECMA262Numeric and @val.val.integer? - @val2 = ECMA262Numeric.new(@val.val.to_num * @val2.to_num) - @val = @val.val2 + # A * B + if @val.respond_to? :to_ecma262_number and @val2.respond_to? :to_ecma262_number + v = @val.to_ecma262_number + v2 = @val2.to_ecma262_number + if !v.nil? and !v2.nil? + parent.replace(self, ECMA262Numeric.new(v * v2)) end end -=end end def ecma262_typeof :number end @@ -813,22 +816,36 @@ @val = @val2 @val2 = t end def reduce(parent) - # a + 0 => a - if @val.kind_of? ECMA262Numeric and @val2.kind_of? ECMA262Numeric and @val.to_num == 0 - parent.replace(self, @val2) + # + # String + String/ + # a + b = a.concat(b) + if @val.kind_of? ECMA262String or @val2.kind_of? ECMA262String + if @val.respond_to? :to_ecma262_string and @val2.respond_to? :to_ecma262_string + v = @val.to_ecma262_string + v2 = @val2.to_ecma262_string + if !v.nil? and !v2.nil? + new_str = ECMA262String.new(v + v2) + parent.replace(self, new_str) + end + end + # + # Numeric + Numeric + # + elsif @val.respond_to? :to_ecma262_number and @val2.respond_to? :to_ecma262_number + # + #11.6.3 Applying the Additive Operators to Numbers(TODO) + # + # N + M => (N + M) + v = @val.to_ecma262_number + v2 = @val2.to_ecma262_number + if !v.nil? and !v2.nil? + parent.replace(self, ECMA262Numeric.new(v + v2)) + end end - # 0 + b => b - if @val.kind_of? ECMA262Numeric and @val2.kind_of? ECMA262Numeric and @val2.to_num == 0 - parent.replace(self, @val) - end - # N + M => (N + M) - if @val.kind_of? ECMA262Numeric and @val2.kind_of? ECMA262Numeric and @val.integer? and @val2.integer? - parent.replace(self, ECMA262Numeric.new(@val.to_num + @val2.to_num)) - end end end # # 11.6.2 The Subtraction Operator ( - ) # @@ -842,22 +859,18 @@ def priority PRIORITY_ADDITIVE end def reduce(parent) - # a - 0 => a - if @val.kind_of? ECMA262Numeric and @val2.kind_of? ECMA262Numeric and @val.to_num == 0 - parent.replace(self, @val2) + # A - B + if @val.respond_to? :to_ecma262_number and @val2.respond_to? :to_ecma262_number + v = @val.to_ecma262_number + v2 = @val2.to_ecma262_number + if !v.nil? and !v2.nil? + parent.replace(self, ECMA262Numeric.new(v - v2)) + end end - # 0 - b => b - if @val2.kind_of? ECMA262Numeric and @val.kind_of? ECMA262Numeric and @val2.to_num == 0 - parent.replace(self, @val) - end - # N - M => (N - M) - if @val.kind_of? ECMA262Numeric and @val2.kind_of? ECMA262Numeric and @val.integer? and @val2.integer? - parent.replace(self, ECMA262Numeric.new(@val.to_num - @val2.to_num)) - end end def ecma262_typeof :number end @@ -1178,10 +1191,23 @@ def priority PRIORITY_LOGICAL_AND end + def to_ecma262_boolean + if @val.respond_to? :to_ecma262_boolean and @val2.respond_to? :to_ecma262_boolean + return nil if @val.to_ecma262_boolean == nil or @val2.to_ecma262_boolean == nil + if @val.to_ecma262_boolean and @val2.to_ecma262_boolean + true + else + false + end + else + nil + end + end + def ecma262_typeof if @val.respond_to? :ecma262_typeof and @val2.respond_to? :ecma262_typeof if @val.ecma262_typeof == @val2.ecma262_typeof return @val.ecma262_typeof end @@ -1196,9 +1222,22 @@ "||" end def priority PRIORITY_LOGICAL_OR + end + + def to_ecma262_boolean + if @val.respond_to? :to_ecma262_boolean and @val2.respond_to? :to_ecma262_boolean + return nil if @val.to_ecma262_boolean == nil or @val2.to_ecma262_boolean == nil + if @val.to_ecma262_boolean or @val2.to_ecma262_boolean + true + else + false + end + else + nil + end end def ecma262_typeof if @val.respond_to? :ecma262_typeof and @val2.respond_to? :ecma262_typeof if @val.ecma262_typeof == @val2.ecma262_typeof