Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Big enum code gen causes rustc 1.45.0 stack overflow #2244

Closed
0xd4d opened this issue Jul 17, 2020 · 1 comment
Closed

Big enum code gen causes rustc 1.45.0 stack overflow #2244

0xd4d opened this issue Jul 17, 2020 · 1 comment
Labels

Comments

@0xd4d
Copy link

0xd4d commented Jul 17, 2020

Describe the Bug

I'm posting it here since it generates the code, but if you think it should be moved to the rustc repo, let me know.

If you have a big enough enum, the wasm-bdingen generated code causes rustc to stack overflow. This didn't happen in rustc 1.44.1, but does happen in 1.45.0.

Code:

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub enum Code {
    A0,
    A1,
    A2,
    A3,
    A4,
    A5,
...
    A3997,
    A3998,
    A3999,
    A4000,
}

Steps to Reproduce

# works
cargo +1.44.1 check
# stack overflow
cargo +1.45.0 check

Expected Behavior

It compiles

Actual Behavior

Stack overflow in rustc

Additional Context

Add any other context about the problem here.

It generates code like this:

pub enum Code
{
    A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16,
    A17, A18, A19, A20, A21, A22, A23, A24, A25, A26, A27, A28, A29, A30, A31,
    A32, A33, A34, A35, A36, A37, A38, A39, A40, A41, A42, A43, A44, A45, A46,
...
    A3994, A3995, A3996, A3997, A3998, A3999, A4000,
} # [allow(clippy :: all)] impl wasm_bindgen :: convert :: IntoWasmAbi for
Code { type Abi = u32 ; # [inline] fn into_abi(self) -> u32 { self as u32 } }
# [allow(clippy :: all)] impl wasm_bindgen :: convert :: FromWasmAbi for Code
{
    type Abi = u32 ; # [inline] unsafe fn from_abi(js : u32) -> Self
    {
        if js == Code :: A0 as u32 { Code :: A0 } else if js == Code :: A1 as
        u32 { Code :: A1 } else if js == Code :: A2 as u32 { Code :: A2 } else
        if js == Code :: A3 as u32 { Code :: A3 } else if js == Code :: A4 as
        u32 { Code :: A4 } else if js == Code :: A5 as u32 { Code :: A5 } else
        if js == Code :: A6 as u32 { Code :: A6 } else if js == Code :: A7 as
        u32 { Code :: A7 } else if js == Code :: A8 as u32 { Code :: A8 } else
...
        { Code :: A3998 } else if js == Code :: A3999 as u32 { Code :: A3999 }
        else if js == Code :: A4000 as u32 { Code :: A4000 } else
        { wasm_bindgen :: throw_str("invalid enum value passed") }
    }
} # [allow(clippy :: all)] impl wasm_bindgen :: convert :: OptionFromWasmAbi

Crashes on Win10 and WSL. Didn't test any other OS.

The generated code could be turned into a simple transmute (IIRC, that's what the compiler will generate if it doesn't stack overflow)

@alexcrichton
Copy link
Contributor

Thanks for the report! I believe this is an issue with rustc, not wasm-bindgen, so I've opened up rust-lang/rust#74564

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant