示例#1
0
def ceil(viper_ast: ViperAST, dec, scaling_factor: int, pos=None, info=None):
    mceil = mangled.MATH_CEIL
    domain = mangled.MATH_DOMAIN
    scaling_factor_lit = viper_ast.IntLit(scaling_factor, pos)
    args = [dec, scaling_factor_lit]
    return viper_ast.DomainFuncApp(mceil, args, viper_ast.Int, pos, info,
                                   domain)
示例#2
0
def floor(viper_ast: ViperAST, dec, scaling_factor: int, pos=None, info=None):
    mfloor = mangled.MATH_FLOOR
    domain = mangled.MATH_DOMAIN
    scaling_factor_lit = viper_ast.IntLit(scaling_factor, pos)
    args = [dec, scaling_factor_lit]
    return viper_ast.DomainFuncApp(mfloor, args, viper_ast.Int, pos, info,
                                   domain)
示例#3
0
def method_id(viper_ast: ViperAST, method, len: int, pos=None, info=None):
    mid = mangled.BLOCKCHAIN_METHOD_ID
    domain = mangled.BLOCKCHAIN_DOMAIN
    rl = viper_ast.IntLit(len, pos)
    return viper_ast.DomainFuncApp(mid, [method, rl],
                                   viper_ast.SeqType(viper_ast.Int), pos, info,
                                   domain)
示例#4
0
def struct_type_tag(viper_ast: ViperAST, ref, pos=None, info=None):
    """
    Returns the type tag of a struct which we store at index -1 of a struct
    """
    domain = mangled.STRUCT_OPS_DOMAIN
    idx = viper_ast.IntLit(mangled.STRUCT_TYPE_LOC)
    field = struct_loc(viper_ast, ref, idx, pos)
    getter = mangled.STRUCT_GET
    type_type = viper_ast.Int
    type_map = _struct_type_var_map(viper_ast, type_type)
    return viper_ast.DomainFuncApp(getter, [field], type_type, pos, info,
                                   domain, type_map)
示例#5
0
def implements(viper_ast: ViperAST,
               address,
               interface: str,
               ctx: Context,
               pos=None,
               info=None):
    impl = mangled.IMPLEMENTS
    domain = mangled.CONTRACT_DOMAIN
    intf = viper_ast.IntLit(
        first_index(lambda i: i == interface, ctx.program.interfaces), pos)
    return viper_ast.DomainFuncApp(impl, [address, intf], viper_ast.Bool, pos,
                                   info, domain)
示例#6
0
def struct_get_idx(viper_ast: ViperAST,
                   ref,
                   idx: Union[int, Expr],
                   viper_type,
                   pos=None,
                   info=None):
    domain = mangled.STRUCT_OPS_DOMAIN
    idx_lit = viper_ast.IntLit(idx) if isinstance(idx, int) else idx
    field = struct_loc(viper_ast, ref, idx_lit, pos, info)
    getter = mangled.STRUCT_GET
    type_map = _struct_type_var_map(viper_ast, viper_type)
    return viper_ast.DomainFuncApp(getter, [field], viper_type, pos, info,
                                   domain, type_map)
示例#7
0
def array_init(viper_ast: ViperAST,
               arg,
               size: int,
               element_type,
               pos=None,
               info=None):
    arr_type = array_type(viper_ast, element_type)
    type_vars = {viper_ast.TypeVar(mangled.ARRAY_ELEMENT_VAR): element_type}
    size = viper_ast.IntLit(size, pos, info)
    init = mangled.ARRAY_INIT
    domain = mangled.ARRAY_DOMAIN
    return viper_ast.DomainFuncApp(init, [arg, size], arr_type, pos, info,
                                   domain, type_vars)
示例#8
0
def struct_set_idx(viper_ast: ViperAST,
                   ref,
                   val,
                   idx: int,
                   member_type,
                   pos=None,
                   info=None):
    setter = mangled.STRUCT_SET
    s_type = struct_type(viper_ast)
    domain = mangled.STRUCT_OPS_DOMAIN
    idx = viper_ast.IntLit(idx)
    type_map = _struct_type_var_map(viper_ast, member_type)
    return viper_ast.DomainFuncApp(setter, [ref, idx, val], s_type, pos, info,
                                   domain, type_map)
示例#9
0
def struct_get(viper_ast: ViperAST,
               ref,
               member: str,
               member_type,
               struct_type: StructType,
               pos=None,
               info=None):
    domain = mangled.STRUCT_OPS_DOMAIN
    idx = viper_ast.IntLit(struct_type.member_indices[member])
    field = struct_loc(viper_ast, ref, idx, pos, info)
    getter = mangled.STRUCT_GET
    type_map = _struct_type_var_map(viper_ast, member_type)
    return viper_ast.DomainFuncApp(getter, [field], member_type, pos, info,
                                   domain, type_map)
示例#10
0
def struct_set(viper_ast: ViperAST,
               ref,
               val,
               member: str,
               member_type,
               type: StructType,
               pos=None,
               info=None):
    setter = mangled.STRUCT_SET
    s_type = struct_type(viper_ast)
    domain = mangled.STRUCT_OPS_DOMAIN
    idx = viper_ast.IntLit(type.member_indices[member])
    type_map = _struct_type_var_map(viper_ast, member_type)
    return viper_ast.DomainFuncApp(setter, [ref, idx, val], s_type, pos, info,
                                   domain, type_map)
示例#11
0
def w_mod(viper_ast: ViperAST, first, second, pos=None, info=None):
    if isinstance(viper_ast, WrappedViperAST):
        viper_ast = viper_ast.viper_ast
    wi_mod = mangled.WRAPPED_INT_MOD
    domain = mangled.WRAPPED_INT_DOMAIN
    args = [first, second]
    func_app = viper_ast.DomainFuncApp(wi_mod, 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.Mod(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)