namespace; include rt, run; // printing any struct with no printing code: the heap knows each object's // type, and reflection walks its fields struct person { char* name; int age; }; struct item { char* name; int count; person* owner; }; void dump(p) { let t = rt.typeof_obj(p), i = 0; if (!t) { rt.put_s("?"); return; } run.tprint(t); rt.put_s(" { "); while (i < run.tnfields(t)) { let ft = run.tftype(t, i), v = p[run.tfoff(t, i)]; if (i) rt.put_s(", "); rt.put_s(run.tfname(t, i)); rt.put_s(": "); if (run.tkind(ft) == run.TY_PTR && run.telem(ft) == typeof(char)) { rt.put_c('"'); rt.put_s(v); rt.put_c('"'); } else if (run.tkind(ft) == run.TY_PTR) { if (v) dump(v); else rt.put_s("null"); } else rt.put_n(v); i++; } rt.put_s(" }"); return; } void main() { person* ana = rt.new(person); ana.name = "ana"; ana.age = 30; item* lamp = rt.new(item); lamp.name = "lamp"; lamp.count = 3; lamp.owner = ana; dump(lamp); rt.put_c(10); rt.free(lamp); return; }