]> git.lizzy.rs Git - rust.git/commit
Utilize discriminant_value for more efficient deriving
authorMarkus <marwes91@gmail.com>
Fri, 12 Jun 2015 07:41:06 +0000 (09:41 +0200)
committerMarkus Westerlind <marwes91@gmail.com>
Sat, 13 Jun 2015 18:40:59 +0000 (20:40 +0200)
commit7721d46bd76967e73a04b7944651094d3d2f9274
tree0b0bdab1dfce71aa270ea0e1cd670acbed31c4f5
parenta9f1e29c4ef68d09f3a926462e4be946d0749042
Utilize discriminant_value for more efficient deriving

The new code generated for deriving on enums looks something like this:

```rust
let __self0_vi = unsafe {
    std::intrinsics::discriminant_value(&self) } as i32;
let __self1_vi = unsafe {
    std::intrinsics::discriminant_value(&__arg1) } as i32;
let __self2_vi = unsafe {
    std::intrinsics::discriminant_value(&__arg2) } as i32;
///
if __self0_vi == __self1_vi && __self0_vi == __self2_vi && ... {
    match (...) {
        (Variant1, Variant1, ...) => Body1
        (Variant2, Variant2, ...) => Body2,
        ...
        _ => ::core::intrinsics::unreachable()
    }
}
else {
    ... // catch-all remainder can inspect above variant index values.
}
```
This helps massively for C-like enums since they will be compiled as a
single comparison giving observed speedups of up to 8x. For more complex
enums the speedup is more difficult to measure but it should not be
slower to generate code this way regardless.
src/libsyntax/ext/deriving/generic/mod.rs