diff options
| author | Björn Steinbrink <bsteinbr@gmail.com> | 2013-06-28 01:40:27 +0200 |
|---|---|---|
| committer | Björn Steinbrink <bsteinbr@gmail.com> | 2013-06-29 19:27:40 +0200 |
| commit | 765a2901d58625f5995c9cf4a32c85b6573e12b0 (patch) | |
| tree | 810b2dfef4daefc6bcbcb7dd1b69f10c248efc88 /src/rt/rust_kernel.cpp | |
| parent | ba922a4027f407dd28ab0e699837109ca99ff1ae (diff) | |
| download | rust-765a2901d58625f5995c9cf4a32c85b6573e12b0.tar.gz rust-765a2901d58625f5995c9cf4a32c85b6573e12b0.zip | |
Avoid double indirection for the "self" arg in methods
Currently we pass all "self" arguments by reference, for the pointer variants this means that we end up with double indirection which causes a unnecessary performance hit. The fix itself is pretty straight-forward and just means that "self" needs to be handled like any other argument, except for by-value "self" which still needs to be passed by reference. This is because non-pointer types can't just be stuffed into the environment slot which is used to pass "self". What made things tricky is that there was also a bug in the typechecker where the method map entries are created. For type impls, that stored the base type instead of the actual self-type in the method map, e.g. Foo instead of &Foo for &self. That worked with pass-by-reference, but fails with pass-by-value which needs the real type. Code that makes use of methods seems to be about 10% faster with this change. Also, build times are reduced by about 4%. Fixes #4355, #4402, #5280, #4406 and #7285
Diffstat (limited to 'src/rt/rust_kernel.cpp')
0 files changed, 0 insertions, 0 deletions
