about summary refs log tree commit diff
path: root/src/rt/rust_kernel.cpp
diff options
context:
space:
mode:
authorBjörn Steinbrink <bsteinbr@gmail.com>2013-06-28 01:40:27 +0200
committerBjörn Steinbrink <bsteinbr@gmail.com>2013-06-29 19:27:40 +0200
commit765a2901d58625f5995c9cf4a32c85b6573e12b0 (patch)
tree810b2dfef4daefc6bcbcb7dd1b69f10c248efc88 /src/rt/rust_kernel.cpp
parentba922a4027f407dd28ab0e699837109ca99ff1ae (diff)
downloadrust-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