Example #1
0
 def struct_literals(expr, name, context):
     o = {}
     members = {}
     for key, value in zip(expr.keys, expr.values):
         if not isinstance(key, ast.Name):
             raise TypeMismatchException(
                 "Invalid member variable for struct: %r" %
                 vars(key).get('id', key),
                 key,
             )
         check_valid_varname(
             key.id,
             context.custom_units,
             context.structs,
             context.constants,
             "Invalid member variable for struct",
         )
         if key.id in o:
             raise TypeMismatchException(
                 "Member variable duplicated: " + key.id, key)
         o[key.id] = Expr(value, context).lll_node
         members[key.id] = o[key.id].typ
     return LLLnode.from_list(
         ["multi"] + [o[key] for key in (list(o.keys()))],
         typ=StructType(members, name, is_literal=True),
         pos=getpos(expr),
     )
Example #2
0
 def struct_literals(expr, name, context):
     member_subs = {}
     member_typs = {}
     for key, value in zip(expr.keys, expr.values):
         if not isinstance(key, vy_ast.Name):
             raise TypeMismatch(
                 f"Invalid member variable for struct: {getattr(key, 'id', '')}",
                 key,
             )
         check_valid_varname(
             key.id,
             context.structs,
             context.constants,
             "Invalid member variable for struct",
         )
         if key.id in member_subs:
             raise TypeMismatch("Member variable duplicated: " + key.id,
                                key)
         sub = Expr(value, context).lll_node
         member_subs[key.id] = sub
         member_typs[key.id] = sub.typ
     return LLLnode.from_list(
         ["multi"] + [member_subs[key] for key in member_subs.keys()],
         typ=StructType(member_typs, name, is_literal=True),
         pos=getpos(expr),
     )
Example #3
0
 def struct_literals(expr, name, context):
     member_subs = {}
     member_typs = {}
     for key, value in zip(expr.keys, expr.values):
         if not isinstance(key, vy_ast.Name):
             return
         if key.id in member_subs:
             return
         sub = Expr(value, context).lll_node
         member_subs[key.id] = sub
         member_typs[key.id] = sub.typ
     return LLLnode.from_list(
         ["multi"] + [member_subs[key] for key in member_subs.keys()],
         typ=StructType(member_typs, name, is_literal=True),
         pos=getpos(expr),
     )
Example #4
0
 def struct_literals(self):
     o = {}
     members = {}
     for key, value in zip(self.expr.keys, self.expr.values):
         if not isinstance(key, ast.Name) or not is_varname_valid(key.id):
             raise TypeMismatchException(
                 "Invalid member variable for struct: %r" %
                 vars(key).get('id', key), key)
         if key.id in o:
             raise TypeMismatchException(
                 "Member variable duplicated: " + key.id, key)
         o[key.id] = Expr(value, self.context).lll_node
         members[key.id] = o[key.id].typ
     return LLLnode.from_list(["multi"] +
                              [o[key] for key in sorted(list(o.keys()))],
                              typ=StructType(members),
                              pos=getpos(self.expr))
Example #5
0
def test_get_size_of_type():
    assert get_size_of_type(BaseType('int128')) == 1
    assert get_size_of_type(ByteArrayType(12)) == 3
    assert get_size_of_type(ByteArrayType(33)) == 4
    assert get_size_of_type(ListType(BaseType('int128'), 10)) == 10

    _tuple = TupleType([BaseType('int128'), BaseType('decimal')])
    assert get_size_of_type(_tuple) == 2

    _struct = StructType({'a': BaseType('int128'), 'b': BaseType('decimal')})
    assert get_size_of_type(_struct) == 2

    # Don't allow unknow types.
    with raises(Exception):
        get_size_of_type(int)

    # Maps are not supported for function arguments or outputs
    with raises(Exception):
        get_size_of_type(MappingType(BaseType('int128'), BaseType('int128')))
Example #6
0
def test_get_size_of_type():
    assert get_size_of_type(BaseType("int128")) == 1
    assert get_size_of_type(ByteArrayType(12)) == 3
    assert get_size_of_type(ByteArrayType(33)) == 4
    assert get_size_of_type(ListType(BaseType("int128"), 10)) == 10

    _tuple = TupleType([BaseType("int128"), BaseType("decimal")])
    assert get_size_of_type(_tuple) == 2

    _struct = StructType({
        "a": BaseType("int128"),
        "b": BaseType("decimal")
    }, "Foo")
    assert get_size_of_type(_struct) == 2

    # Don't allow unknown types.
    with raises(Exception):
        get_size_of_type(int)

    # Maps are not supported for function arguments or outputs
    with raises(Exception):
        get_size_of_type(MappingType(BaseType("int128"), BaseType("int128")))
Example #7
0
    def call(self):
        from vyper.functions import (
            dispatch_table, )

        if isinstance(self.expr.func, ast.Name):
            function_name = self.expr.func.id

            if function_name in dispatch_table:
                return dispatch_table[function_name](self.expr, self.context)

            # Struct constructors do not need `self` prefix.
            elif function_name in self.context.structs:
                if not self.context.in_assignment:
                    raise StructureException(
                        "Struct constructor must be called in RHS of assignment.",
                        self.expr)
                args = self.expr.args
                if len(args) != 1:
                    raise StructureException(
                        "Struct constructor is called with one argument only",
                        self.expr)

                arg = args[0]
                if not isinstance(arg, ast.Dict):
                    raise TypeMismatchException(
                        "Struct can only be constructed with a dict",
                        self.expr)
                sub = Expr.struct_literals(arg, self.context)
                if sub.typ.name is not None:
                    raise TypeMismatchException(
                        "Struct can only be constructed with a dict",
                        self.expr)

                typ = StructType(sub.typ.members, function_name)

                # OR:
                # sub.typ = typ
                # return sub
                return LLLnode(sub.value,
                               typ=typ,
                               args=sub.args,
                               location=sub.location,
                               pos=getpos(self.expr),
                               add_gas_estimate=sub.add_gas_estimate,
                               valency=sub.valency,
                               annotation=function_name)

            else:
                err_msg = "Not a top-level function: {}".format(function_name)
                if function_name in [
                        x.split('(')[0]
                        for x, _ in self.context.sigs['self'].items()
                ]:
                    err_msg += ". Did you mean self.{}?".format(function_name)
                raise StructureException(err_msg, self.expr)
        elif isinstance(self.expr.func, ast.Attribute) and isinstance(
                self.expr.func.value,
                ast.Name) and self.expr.func.value.id == "self":
            return self_call.make_call(self.expr, self.context)
        else:
            return external_call.make_external_call(self.expr, self.context)