On Wed, May 9, 2018 at 7:45 PM Robert Griesemer <[email protected]> wrote:
> PS: Here's an example where we (humans) can obviously compute the size of
a type, yet neither cmd/compile, gccgo, nor go/types have any success in
doing so:
>
> type T struct {
> a [10]int
> b [len(T{}.a)]int
> }
> The problem is that all implementations have an "eager" (depth-first)
approach somewhere leading to requiring all of T to be set up before we can
determine the size of T.a. Specifically, when determining
> the size of T.b we must be careful to not look at the size of T (which is
in the process of being determined), and only at the size of T.a (which we
can obviously tell). Furthermore, we must use an
> algorithm that computes the size of T.a "on demand", not in the order as
the fields appear (otherwise it wouldn't work if b was before a).
Sure, as you wrote, size of T.b does not depend on size of T. It depends on
len([10]int) only - or the type of T.a in a more general view.
I agree with the quoted above completely. Do not compute the size of a
struct until needed - that's the only way I can think of how to avoid the
(existing) problems of correctly detecting invalid transitively
self-referential types. Later on, any possibly unused types will get their
sizes determined only after type checking is completed - to ensure they're
valid. Exported or not.
> All these things make size computation more complicated and expensive.
That question is: Is it worth the extra cost? Or are these cases esoteric
and don't show up in real code? And if we use simpler
> algorithms, is there an easy way to describe which types are accepted and
which aren't?
It does not sound hard to me to implement it this way. Performance-wise,
it'd surprise me to have noticeable higher run-time cost. Actually, not
having to construct and maintain the type stack can possibly improve
performance (also b/c of less allocations). But I guess it's not trivial to
change the existing implementation to the different approach.
--
-j
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.