def div(viper_ast: ViperAST, dividend, divisor, pos=None, info=None): # We need a special division function because Vyper uses truncating division # instead of Viper's floor division mdiv = mangled.MATH_DIV domain = mangled.MATH_DOMAIN # We pass the Viper floor division as a third argument to trigger a correct # division by 0 error instead of an assertion failure if divisor == 0 args = [dividend, divisor, viper_ast.Div(dividend, divisor, pos)] return viper_ast.DomainFuncApp(mdiv, args, viper_ast.Int, pos, info, domain)
def w_div(viper_ast: ViperAST, first, second, pos=None, info=None): if isinstance(viper_ast, WrappedViperAST): viper_ast = viper_ast.viper_ast wi_div = mangled.WRAPPED_INT_DIV domain = mangled.WRAPPED_INT_DOMAIN args = [first, second] func_app = viper_ast.DomainFuncApp(wi_div, args, wrapped_int_type(viper_ast), pos, info, domain) is_div_zero = viper_ast.EqCmp(viper_ast.IntLit(0), w_unwrap(viper_ast, second, pos, info), pos, info) artificial_div_zero = w_wrap( viper_ast, viper_ast.Div(w_unwrap(viper_ast, first, pos, info), w_unwrap(viper_ast, second, pos, info), pos, info), pos, info) return viper_ast.CondExp(is_div_zero, artificial_div_zero, func_app, pos, info)