Name |
Last commit
|
Last update |
---|---|---|
.. | ||
all_test.go | ||
deepequal.go | ||
example_test.go | ||
export_test.go | ||
makefunc.go | ||
makefunc_ffi.go | ||
makefunc_ffi_c.c | ||
set_test.go | ||
swapper.go | ||
tostring_test.go | ||
type.go | ||
value.go |
Currently, the compiler already generates common symbols for type descriptors, so the type descriptors are unique. However, when a type is created through reflection, it is not deduplicated with compiler-generated types. As a consequence, we cannot assume type descriptors are unique, and cannot use pointer equality to compare them. Also, when constructing a reflect.Type, it has to go through a canonicalization map, which introduces overhead to reflect.TypeOf, and lock contentions in concurrent programs. In order for the reflect package to deduplicate types with compiler-created types, we register all the compiler-created type descriptors at startup time. The reflect package, when it needs to create a type, looks up the registry of compiler-created types before creates a new one. There is no lock contention since the registry is read-only after initialization. This lets us get rid of the canonicalization map, and also makes it possible to compare type descriptors with pointer equality. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/179598 From-SVN: r271894
Name |
Last commit
|
Last update |
---|---|---|
.. | ||
all_test.go | Loading commit data... | |
deepequal.go | Loading commit data... | |
example_test.go | Loading commit data... | |
export_test.go | Loading commit data... | |
makefunc.go | Loading commit data... | |
makefunc_ffi.go | Loading commit data... | |
makefunc_ffi_c.c | Loading commit data... | |
set_test.go | Loading commit data... | |
swapper.go | Loading commit data... | |
tostring_test.go | Loading commit data... | |
type.go | Loading commit data... | |
value.go | Loading commit data... |