Defer statement may need to allocate a thunk. When it is not
inside a loop, this can be stack allocated, as it runs before
the function finishes.
Reviewed-on: https://go-review.googlesource.com/85639
From-SVN: r256410
-d5774539b17112d9ce709a1fe722daf68eb8594f
+7c5e4d67041e3529a055a923b2b9f5ef09aa72a3
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
case Statement::STATEMENT_DEFER:
if (this->context_->loop_depth() == 1)
- break;
+ {
+ // Defer statement may need to allocate a thunk. When it is
+ // not inside a loop, this can be stack allocated, as it
+ // runs before the function finishes.
+ Node* n = Node::make_node(s);
+ n->set_encoding(Node::ESCAPE_NONE);
+ break;
+ }
// fallthrough
case Statement::STATEMENT_GO:
// Allocate the initialized struct on the heap.
constructor = Expression::make_heap_expression(constructor, location);
+ if ((Node::make_node(this)->encoding() & ESCAPE_MASK) == Node::ESCAPE_NONE)
+ constructor->heap_expression()->set_allocate_on_stack();
// Throw an error if the function is nil. This is so that for `go
// nil` we get a backtrace from the go statement, rather than a