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