func visitDeref(inst *ssa.UnOp, fr *frame) { ptr := inst.X val := inst if _, ok := ptr.(*ssa.Global); ok { fr.locals[ptr] = fr.env.globals[ptr] fmt.Fprintf(os.Stderr, " %s = *%s (global) of type %s\n", cyan(reg(val)), ptr.Name(), ptr.Type().String()) fmt.Fprintf(os.Stderr, " ^ i.e. %s\n", fr.locals[ptr].String()) switch deref(fr.locals[ptr].Var.Type()).(type) { case *types.Array, *types.Slice: if _, ok := fr.env.arrays[fr.env.globals[ptr]]; !ok { fr.env.arrays[fr.env.globals[ptr]] = make(Elems) } case *types.Struct: if _, ok := fr.env.structs[fr.env.globals[ptr]]; !ok { fr.env.structs[fr.env.globals[ptr]] = make(Fields) } } } switch vd, kind := fr.get(ptr); kind { case Array, LocalArray: fr.locals[val] = vd fmt.Fprintf(os.Stderr, " %s = *%s (array)\n", cyan(reg(val)), ptr.Name()) case Struct, LocalStruct: fr.locals[val] = vd fmt.Fprintf(os.Stderr, " %s = *%s (struct)\n", cyan(reg(val)), ptr.Name()) case Chan: fr.locals[val] = vd fmt.Fprintf(os.Stderr, " %s = *%s (previously initalised Chan)\n", cyan(reg(val)), ptr.Name()) case Nothing: fmt.Fprintf(os.Stderr, " # %s = *%s (not found)\n", red(inst.String()), red(inst.X.String())) if _, ok := val.Type().Underlying().(*types.Chan); ok { fmt.Fprintf(os.Stderr, " ^ channel (not allocated, must be initialised by MakeChan)") } default: fmt.Fprintf(os.Stderr, " # %s = *%s/%s (not found, type=%s)\n", red(inst.String()), red(inst.X.String()), reg(inst.X), inst.Type().String()) } }