]> Cypherpunks repositories - gostls13.git/commit
exp/ssa: make invokation of deferred procedure calls explicit.
authorAlan Donovan <adonovan@google.com>
Wed, 27 Feb 2013 15:35:23 +0000 (10:35 -0500)
committerAlan Donovan <adonovan@google.com>
Wed, 27 Feb 2013 15:35:23 +0000 (10:35 -0500)
commit5a09f1b3be354ebb69a9124076236cb7aa83edc9
tree9fdee0ef26cd8e0c4d5550d3f9a51dc17156d2de
parent3fc8cd054a4dd1bb4eb60da76a595cd509bb20ac
exp/ssa: make invokation of deferred procedure calls explicit.

The correct semantics of named result parameters and deferred
procedures cannot be implemented with the existing Ret
instruction alone, since the required sequence is:
(1) evaluate return operands and parallel-assign them to
    named result parameters
(2) invoke deferred procedures
(3) load named result parameters to form result tuple.

We introduce a new 'rundefers' instruction that explicitly
invokes the deferred procedure calls, and we generate code
that follows the sequence above.

Most functions do not use deferred procedures but this cannot
be known in a single pass.  So, we add an optimisation to
eliminate redundant 'rundefers'; it is piggybacked on the
existing pass done for "lifting".

Added tests.

R=gri
CC=golang-dev
https://golang.org/cl/7411043
src/pkg/exp/ssa/builder.go
src/pkg/exp/ssa/emit.go
src/pkg/exp/ssa/func.go
src/pkg/exp/ssa/interp/interp.go
src/pkg/exp/ssa/interp/testdata/coverage.go
src/pkg/exp/ssa/lift.go
src/pkg/exp/ssa/print.go
src/pkg/exp/ssa/sanity.go
src/pkg/exp/ssa/ssa.go