Skip to content
  • Yuta Saito's avatar
    dff70b50
    [wasm] vm.c: stop unwinding to main for every vm_exec call by setjmp · dff70b50
    Yuta Saito authored
    the original rb_wasm_setjmp implementation always unwinds to the root
    call frame to have setjmp compatible interface, and simulate sjlj's
    undefined behavior. Therefore, every vm_exec call unwinds to main, and
    a deep call stack makes setjmp call very expensive. The following
    snippet from optcarrot takes 5s even though it takes less than 0.3s on
    native.
    
    ```
    [0x0, 0x4, 0x8, 0xc].map do |attr|
      (0..7).map do |j|
        (0...0x10000).map do |i|
          clr = i[15 - j] * 2 + i[7 - j]
          clr != 0 ? attr | clr : 0
        end
      end
    end
    ```
    
    This patch adds a WASI specialized vm_exec which uses lightweight
    try-catch API without unwinding to the root frame. After this patch, the
    above snippet takes only 0.5s.
    dff70b50
    [wasm] vm.c: stop unwinding to main for every vm_exec call by setjmp
    Yuta Saito authored
    the original rb_wasm_setjmp implementation always unwinds to the root
    call frame to have setjmp compatible interface, and simulate sjlj's
    undefined behavior. Therefore, every vm_exec call unwinds to main, and
    a deep call stack makes setjmp call very expensive. The following
    snippet from optcarrot takes 5s even though it takes less than 0.3s on
    native.
    
    ```
    [0x0, 0x4, 0x8, 0xc].map do |attr|
      (0..7).map do |j|
        (0...0x10000).map do |i|
          clr = i[15 - j] * 2 + i[7 - j]
          clr != 0 ? attr | clr : 0
        end
      end
    end
    ```
    
    This patch adds a WASI specialized vm_exec which uses lightweight
    try-catch API without unwinding to the root frame. After this patch, the
    above snippet takes only 0.5s.
Loading