mirror of https://github.com/golang/go.git
runtime: coalesce 0-size allocations
Fixes #3996. R=ken2 CC=golang-dev https://golang.org/cl/7001052
This commit is contained in:
parent
295a4d8e64
commit
ec59b840f9
|
|
@ -697,14 +697,22 @@ runtime·new(Type *typ, uint8 *ret)
|
|||
|
||||
if(raceenabled)
|
||||
m->racepc = runtime·getcallerpc(&typ);
|
||||
flag = typ->kind&KindNoPointers ? FlagNoPointers : 0;
|
||||
ret = runtime·mallocgc(typ->size, flag, 1, 1);
|
||||
|
||||
if(UseSpanType && !flag) {
|
||||
if(false) {
|
||||
runtime·printf("new %S: %p\n", *typ->string, ret);
|
||||
if(typ->size == 0) {
|
||||
// All 0-length allocations use this pointer.
|
||||
// The language does not require the allocations to
|
||||
// have distinct values.
|
||||
ret = (uint8*)&runtime·zerobase;
|
||||
} else {
|
||||
flag = typ->kind&KindNoPointers ? FlagNoPointers : 0;
|
||||
ret = runtime·mallocgc(typ->size, flag, 1, 1);
|
||||
|
||||
if(UseSpanType && !flag) {
|
||||
if(false) {
|
||||
runtime·printf("new %S: %p\n", *typ->string, ret);
|
||||
}
|
||||
runtime·settype(ret, (uintptr)typ | TypeInfo_SingleObject);
|
||||
}
|
||||
runtime·settype(ret, (uintptr)typ | TypeInfo_SingleObject);
|
||||
}
|
||||
|
||||
FLUSH(&ret);
|
||||
|
|
@ -719,15 +727,24 @@ runtime·cnew(Type *typ)
|
|||
|
||||
if(raceenabled)
|
||||
m->racepc = runtime·getcallerpc(&typ);
|
||||
flag = typ->kind&KindNoPointers ? FlagNoPointers : 0;
|
||||
ret = runtime·mallocgc(typ->size, flag, 1, 1);
|
||||
|
||||
if(UseSpanType && !flag) {
|
||||
if(false) {
|
||||
runtime·printf("new %S: %p\n", *typ->string, ret);
|
||||
if(typ->size == 0) {
|
||||
// All 0-length allocations use this pointer.
|
||||
// The language does not require the allocations to
|
||||
// have distinct values.
|
||||
ret = (uint8*)&runtime·zerobase;
|
||||
} else {
|
||||
flag = typ->kind&KindNoPointers ? FlagNoPointers : 0;
|
||||
ret = runtime·mallocgc(typ->size, flag, 1, 1);
|
||||
|
||||
if(UseSpanType && !flag) {
|
||||
if(false) {
|
||||
runtime·printf("new %S: %p\n", *typ->string, ret);
|
||||
}
|
||||
runtime·settype(ret, (uintptr)typ | TypeInfo_SingleObject);
|
||||
}
|
||||
runtime·settype(ret, (uintptr)typ | TypeInfo_SingleObject);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue