cgen: use heuristic to detect circular reference in auto str (#11090)
							parent
							
								
									7d3476cbca
								
							
						
					
					
						commit
						c560d58f1e
					
				| 
						 | 
					@ -834,6 +834,9 @@ fn (mut g Gen) gen_str_for_struct(info ast.Struct, styp string, str_fn_name stri
 | 
				
			||||||
			if field.typ in ast.charptr_types {
 | 
								if field.typ in ast.charptr_types {
 | 
				
			||||||
				fn_builder.write_string('tos2((byteptr)$func)')
 | 
									fn_builder.write_string('tos2((byteptr)$func)')
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
 | 
									if field.typ.is_ptr() && sym.kind == .struct_ {
 | 
				
			||||||
 | 
										fn_builder.write_string('(indent_count > 25) ? _SLIT("<probably circular>") : ')
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
				fn_builder.write_string(func)
 | 
									fn_builder.write_string(func)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					[heap]
 | 
				
			||||||
 | 
					struct Aa {
 | 
				
			||||||
 | 
					mut:
 | 
				
			||||||
 | 
						bs []Bb
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct Bb {
 | 
				
			||||||
 | 
					mut:
 | 
				
			||||||
 | 
						a &Aa
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn test_circular() {
 | 
				
			||||||
 | 
						mut b := Bb{
 | 
				
			||||||
 | 
							a: &Aa{
 | 
				
			||||||
 | 
								bs: []Bb{cap: 1}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						b.a.bs << b
 | 
				
			||||||
 | 
						s := b.str()
 | 
				
			||||||
 | 
						assert s.len < 3500
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue