[Issue 15831] IFTI voldemort type exploding bloat

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Fri Mar 25 15:03:16 PDT 2016


https://issues.dlang.org/show_bug.cgi?id=15831

--- Comment #1 from Anon <3g5o3v+4kzxpixqyfgsicckylm60badawevzw9upy4e1qrrcmdizcxk734n07il at spam4.me> ---
As I posted on the newsgroup, I would suggest the following changes to the
mangling:

1) `LName`s of length 0 (which currently cannot exist) mean to repeat the
previous `LName` of the current symbol.

2) N `Number` is added as a valid `Type`, meaning "Type Back Reference".
Basically, all instances of a struct/class/interface/enum type in a symbol's
mangling get counted (starting from zero), and subsequent instances of that
type can be referred to by N0, N1, N2, etc.

Given:

```
module mod;
struct Foo;
Foo* func(Foo* a, Foo* b);
```

`func` currently mangles as:
_D3mod4funcFPS3mod3FooPS3mod3FooZPS3mod3Foo

It would instead mangle as:
_D3mod4funcFPS3mod3FooPN0ZPN0

Nested template declarations would get numbered depth first as follows:

S7!(S2!(S0, S1), S6!(S3, S5!(S4)))

This, on its own, won't eliminate the recursive expansion bloat, but (based on
manual experiments I've now done), takes foo's mangled name length almost
linear with respect to the number of recursions:

Recursive calls to s() before x.foo :  1 |  2 |   3 |   4 |   5
Current mangle length of foo (bytes): 39 | 90 | 192 | 397 | 807 
Same, with proposed mangling changes: 38 | 64 |  90 | 116 | 148

As I said on the newsgroup, I have another idea relating to template string
value mangling, but that is only tangentially related to this bug (in that both
reducing mangle bloat). I'll post that separately once it is ready.

--


More information about the Digitalmars-d-bugs mailing list