mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/gc, runtime: refactor interface inlining decision into compiler
We need to change the interface value representation for concurrent garbage collection, so that there is no ambiguity about whether the data word holds a pointer or scalar. This CL does NOT make any representation changes. Instead, it removes representation assumptions from various pieces of code throughout the tree. The isdirectiface function in cmd/gc/subr.c is now the only place that decides that policy. The policy propagates out from there in the reflect metadata, as a new flag in the internal kind value. A follow-up CL will change the representation by changing the isdirectiface function. If that CL causes problems, it will be easy to roll back. Update #8405. LGTM=iant R=golang-codereviews, iant CC=golang-codereviews, r https://golang.org/cl/129090043
This commit is contained in:
parent
2e2beb567c
commit
1806a5732b
18 changed files with 230 additions and 105 deletions
|
|
@ -585,7 +585,7 @@ adjustpointers(byte **scanp, BitVector *bv, AdjustInfo *adjinfo, Func *f)
|
|||
break;
|
||||
case BitsEface:
|
||||
t = (Type*)scanp[i];
|
||||
if(t != nil && (t->size > PtrSize || (t->kind & KindNoPointers) == 0)) {
|
||||
if(t != nil && ((t->kind & KindDirectIface) == 0 || (t->kind & KindNoPointers) == 0)) {
|
||||
p = scanp[i+1];
|
||||
if(minp <= p && p < maxp) {
|
||||
if(StackDebug >= 3)
|
||||
|
|
@ -602,7 +602,7 @@ adjustpointers(byte **scanp, BitVector *bv, AdjustInfo *adjinfo, Func *f)
|
|||
if(tab != nil) {
|
||||
t = tab->type;
|
||||
//runtime·printf(" type=%p\n", t);
|
||||
if(t->size > PtrSize || (t->kind & KindNoPointers) == 0) {
|
||||
if((t->kind & KindDirectIface) == 0 || (t->kind & KindNoPointers) == 0) {
|
||||
p = scanp[i+1];
|
||||
if(minp <= p && p < maxp) {
|
||||
if(StackDebug >= 3)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue