parent
							
								
									7d9028db56
								
							
						
					
					
						commit
						d1b0ce9e0c
					
				| 
						 | 
				
			
			@ -7367,7 +7367,7 @@ static inline $interface_name I_${cctype}_to_Interface_${interface_name}($cctype
 | 
			
		|||
					// .speak = Cat_speak_Interface_Animal_method_wrapper
 | 
			
		||||
					method_call += iwpostfix
 | 
			
		||||
				}
 | 
			
		||||
				if g.pref.build_mode != .build_module {
 | 
			
		||||
				if g.pref.build_mode != .build_module && st != ast.voidptr_type {
 | 
			
		||||
					methods_struct.writeln('\t\t._method_${c_name(method.name)} = (void*) $method_call,')
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1141,6 +1141,19 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {
 | 
			
		|||
		}
 | 
			
		||||
		if typ != ast.string_type {
 | 
			
		||||
			expr := node.args[0].expr
 | 
			
		||||
			typ_sym := g.table.get_type_symbol(typ)
 | 
			
		||||
			if typ_sym.kind == .interface_ && (typ_sym.info as ast.Interface).defines_method('str') {
 | 
			
		||||
				g.write('${c_name(print_method)}(')
 | 
			
		||||
				rec_type_name := util.no_dots(g.cc_type(typ, false))
 | 
			
		||||
				g.write('${c_name(rec_type_name)}_name_table[')
 | 
			
		||||
				g.expr(expr)
 | 
			
		||||
				dot := if typ.is_ptr() { '->' } else { '.' }
 | 
			
		||||
				g.write('${dot}_typ]._method_str(')
 | 
			
		||||
				g.expr(expr)
 | 
			
		||||
				g.write('${dot}_object')
 | 
			
		||||
				g.writeln('));')
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			if g.is_autofree && !typ.has_flag(.optional) {
 | 
			
		||||
				// Create a temporary variable so that the value can be freed
 | 
			
		||||
				tmp := g.new_tmp_var()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -125,6 +125,7 @@ fn (mut g Gen) str_val(node ast.StringInterLiteral, i int) {
 | 
			
		|||
	expr := node.exprs[i]
 | 
			
		||||
 | 
			
		||||
	typ := g.unwrap_generic(node.expr_types[i])
 | 
			
		||||
	typ_sym := g.table.get_type_symbol(typ)
 | 
			
		||||
	if typ == ast.string_type {
 | 
			
		||||
		if g.inside_vweb_tmpl {
 | 
			
		||||
			g.write('vweb__filter(')
 | 
			
		||||
| 
						 | 
				
			
			@ -139,6 +140,15 @@ fn (mut g Gen) str_val(node ast.StringInterLiteral, i int) {
 | 
			
		|||
			}
 | 
			
		||||
			g.expr(expr)
 | 
			
		||||
		}
 | 
			
		||||
	} else if typ_sym.kind == .interface_ && (typ_sym.info as ast.Interface).defines_method('str') {
 | 
			
		||||
		rec_type_name := util.no_dots(g.cc_type(typ, false))
 | 
			
		||||
		g.write('${c_name(rec_type_name)}_name_table[')
 | 
			
		||||
		g.expr(expr)
 | 
			
		||||
		dot := if typ.is_ptr() { '->' } else { '.' }
 | 
			
		||||
		g.write('${dot}_typ]._method_str(')
 | 
			
		||||
		g.expr(expr)
 | 
			
		||||
		g.write('${dot}_object')
 | 
			
		||||
		g.write(')')
 | 
			
		||||
	} else if node.fmts[i] == `s` || typ.has_flag(.variadic) {
 | 
			
		||||
		mut exp_typ := typ
 | 
			
		||||
		if expr is ast.Ident && g.comptime_var_type_map.len > 0 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
interface Str {
 | 
			
		||||
	str() string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct St {}
 | 
			
		||||
 | 
			
		||||
fn (s St) str() string {
 | 
			
		||||
	return 's'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn printer(s Str) string {
 | 
			
		||||
	println(s)
 | 
			
		||||
	return '$s'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_interface_str_method() {
 | 
			
		||||
	s := St{}
 | 
			
		||||
	ret := printer(s)
 | 
			
		||||
	assert ret == 's'
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue