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), )
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), )
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), )
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))
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')))
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")))
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)