Policy for exposing range structs
Adam D. Ruppe via Digitalmars-d
digitalmars-d at puremagic.com
Thu Mar 31 06:38:51 PDT 2016
On Thursday, 31 March 2016 at 13:10:49 UTC, Steven Schveighoffer
wrote:
> Voldemort types are what cause the bloat, templates inside
> templates aren't as much of a problem.
So here's an idea of other things don't work out: voldemort types
don't have a name that can be said... that could be true in the
mangle too.
We could potentially just hash it to some fixed length. Take the
existing name, SHA1 it, and call the mangle
function_containing_type$that_hash. Demangling the inside is
useless anyway, so we lose nothing from that.
For example, a function foo.bar() returning a voldemort type
might have the mangle:
_D3foo3barv$55ca6286e3e4f4fba5d0448333fa99fc5a404a73
where that's the hash of whatever filth the compiler makes up for
it.
and methods on the voldemort type would start with that too:
_D503foo3barv$55ca6286e3e4f4fba5d0448333fa99fc5a404a735empty
That's getting messy to see as an example, but it took the name
of the function + the voldemort as a whole to be the public name
of the type.
A demangler could scan that for the $ and recognize it as
ugliness and slice it off, printing the name as a somewhat
human-readable
foo.bar().empty
perhaps, so we can see it is a method on the return value of that
function. It isn't completely impossible like demanging a whole
hash; should be short in the binary and readable enough to make
sense of in a stack trace.
I actually recall something like this being done at some point in
the past, but I don't remember the details. I think it just
truncated the name though, it didn't attempt to remain
semi-reversible.
Of course, a chain of voldemort types will still include that
type as a template argument in the next call, so names as a whole
can still be very long, but how long are your chains? I can see
this becoming a 10 KB long name in extreme circumstances (still
yikes) but not megabytes.
And, still, having to run over the names to build the hash is
going to be a memory/speed thing in the compiler, but SHA1ing a
few megabytes isn't as slow as writing it out to disk over and
over again.
Another thing to consider is what my D to Javascript thing did:
abbreviate EVERYTHING in the object file. You can't demangle that
at all, but it leads to much smaller binaries. This probably
isn't that useful for D in general, but might solve Weka's
problem since they can use internal hacks.
More information about the Digitalmars-d
mailing list