If an expression is addressable, we compute its address then load, rather than extracting the value of subelements. For aggregates this avoids large copies. Example: var x [2]struct{y [3]int} print(x[1].y[2]) Was: t0 = local [3]struct{x [5]int} (x) *[3]struct{x [5]int} t1 = *t0 [3]struct{x [5]int} t2 = t1[1:int] struct{x [5]int} t3 = t2.x [#0] [5]int t4 = t3[2:int] int Now: t1 = &t0[1:int] *struct{x [5]int} t2 = &t1.x [#0] *[5]int t3 = &t2[2:int] *int t4 = *t3 int Also: - make emitFieldSelections responsible for calling emitDebugRef, as one of its two calls was forgetting to do it. - relax the specification of (*Program).VarValue because not all subexpressions are materalized as values now. - fix up the objlookup.go test expectations to match. go/ssa/interp test runs 10% faster. Thanks to Peter Collingbourne for pointing this out. LGTM=pcc R=pcc, gri CC=golang-codereviews https://golang.org/cl/109710043 |
||
---|---|---|
.. | ||
objlookup.go | ||
valueforexpr.go |