def math_log(wrapper, arguments, traverser): """Return a better value than the standard python log function.""" args = [traverser._traverse_node(a) for a in arguments] if not args: return JSWrapper(0, traverser=traverser) arg = actions._get_as_num(args[0].get_literal_value()) if arg == 0: return JSWrapper(float('-inf'), traverser=traverser) if arg < 0: return JSWrapper(traverser=traverser) arg = math.log(arg) return JSWrapper(arg, traverser=traverser)
def math_round(wrapper, arguments, traverser): """Return a better value than the standard python round function.""" args = [traverser._traverse_node(a) for a in arguments] if not args: return JSWrapper(0, traverser=traverser) arg = actions._get_as_num(args[0].get_literal_value()) # Prevent nasty infinity tracebacks. if abs(arg) == float('inf'): return args[0] # Python rounds away from zero, JS rounds "up". if arg < 0 and int(arg) != arg: arg += 0.0000000000000001 arg = round(arg) return JSWrapper(arg, traverser=traverser)
def contains(self, value): """Serves 'in' for BinaryOperators for lists and dictionaries""" # Unwrap the rvalue. if isinstance(value, JSWrapper): value = value.get_literal_value() if isinstance(self.value, JSArray): from actions import _get_as_num index = int(_get_as_num(value)) if len(self.value.elements) > index >= 0: return True if isinstance(self.value, (JSArray, JSObject, JSPrototype)): return self.value.has_var(value) # Nothing else supports "in" return False
def _process_literal(type_, literal): if type_ == 'string': return actions._get_as_str(literal) elif type_ == 'num': return actions._get_as_num(literal) return literal
def _process_literal(type_, literal): if type_ == "string": return actions._get_as_str(literal) elif type_ == "num": return actions._get_as_num(literal) return literal