def toBoolean(self, v): if v.isUndefined(): return Value(Value.false) if v.isNull(): return Value(Value.false) if v.isBoolean(): return v if v.isInt(): return Value.boolean(v.toInt()) obj = v.toObject() if obj.isObject(): return Value(Value.true) if obj.isString(): return Value.boolean(obj.toString()) assert obj.isDouble() double = obj.toDouble() if math.isnan(double): return Value(Value.false) return Value.boolean(double)
def add(self, left, right): left = self.toPrimitive(left) right = self.toPrimitive(right) ltype = self.type(left) rtype = self.type(right) if ltype == ecma_type['string'] or rtype == ecma_type['string']: left = self.toString(left) right = self.toString(right) lstr = left.toObject().toString() rstr = right.toObject().toString() return Value.object(new_string(lstr + rstr)) left = self.toNumber(left) right = self.toNumber(right) number = self.numberConvert(left) + self.numberConvert(right) return Value(boxed_number(number).value)
def declare_vars(self, vars): for var in vars: self.ctx.object.addProperty(var.name, Value(Value.undefined))