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

elseif 行のプロファイル結果がおかしい #1134

Closed
ichizok opened this Issue Dec 21, 2017 · 8 comments

Comments

Projects
None yet
2 participants
@ichizok
Member

ichizok commented Dec 21, 2017

再現手順

func.vim:

func! Foo()
  if 0
    let x = 0
  elseif 1
    let x = 1
  endif
endfunc
call Foo()

vim --clean +'profile start prof.log' +'profile func Foo' +'so func.vim' +'qall!'

prof.log:

FUNCTION  Foo()
Called 1 time
Total time:   0.000026
 Self time:   0.000026

count  total (s)   self (s)
    1              0.000007   if 0
                                let x = 0
                              elseif 1
    1              0.000004     let x = 1
    1              0.000003   endif

(snip)

通ったはずの elseif 1 の行がカウントされていない。

原因

https://github.com/vim/vim/blob/ae6f865/src/ex_docmd.c#L2018-L2021

ここで func_line_exec を通った場合に、その行はプロファイリング対象になる。
問題は if 条件文の ea.skip の値で、

https://github.com/vim/vim/blob/ae6f865/src/ex_docmd.c#L2009-L2010

直上のここで計算される。エラーや例外発生を除けば、基本的に直前の状態による。

cstack->cs_flags[cstack->cs_idx] の値を見ていくと

if 0            " CSF_ACTIVE -[条件判定]-> 0 (false)
  let x = 0     " 0
elseif 1        " 0 -[条件判定]-> CSF_ACTIVE|CSF_TRUE (true)
  let x = 1     " CSF_ACTIVE|CSF_TRUE
endif           " CSF_ACTIVE

elseif 1 の行に入る時点で cstack->cs_flags[cstack->cs_idx]==0 => ea.skip==TRUE なので、elseif 1 の行はプロファイリング対象にならない。

ea.skip の計算時に、 :elseif :else 行を考慮する必要があると思われる。

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Dec 21, 2017

Member

https://github.com/vim/vim/compare/master...ichizok:fix/profile-line.diff

find_command() を前に持ってきて、行が :elseif :else :endif の時は ea.skip の計算方法を変える。

Member

ichizok commented Dec 21, 2017

https://github.com/vim/vim/compare/master...ichizok:fix/profile-line.diff

find_command() を前に持ってきて、行が :elseif :else :endif の時は ea.skip の計算方法を変える。

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Dec 22, 2017

Member

catch finally も考慮する必要がある。
endfor endwhile は以下のようなケースをどうするか。

count
    1   while 0
    0     "
    0   endwhile

    1   while 1
    1     return
    0   endwhile

実行経路を区別できるようにするため、前者の endwhile は1回カウントした方がいいのではないか。

Member

ichizok commented Dec 22, 2017

catch finally も考慮する必要がある。
endfor endwhile は以下のようなケースをどうするか。

count
    1   while 0
    0     "
    0   endwhile

    1   while 1
    1     return
    0   endwhile

実行経路を区別できるようにするため、前者の endwhile は1回カウントした方がいいのではないか。

@thinca

This comment has been minimized.

Show comment
Hide comment
@thinca

thinca Dec 22, 2017

Member

loop が発生すれば while の行のカウントが増えるはずなので、実行経路の区別はできそうな気がします。

Member

thinca commented Dec 22, 2017

loop が発生すれば while の行のカウントが増えるはずなので、実行経路の区別はできそうな気がします。

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Dec 22, 2017

Member

すみません、例がおかしかったんですが、

func! Foo1()
  while 1
    break
  endwhile
endfunc

func! Foo2()
  while 1
    return
  endwhile
endfunc

こういう場合に、今はどちらも endwhile は0回になるけど前者は1回にしたいという意見でした。

Member

ichizok commented Dec 22, 2017

すみません、例がおかしかったんですが、

func! Foo1()
  while 1
    break
  endwhile
endfunc

func! Foo2()
  while 1
    return
  endwhile
endfunc

こういう場合に、今はどちらも endwhile は0回になるけど前者は1回にしたいという意見でした。

@thinca

This comment has been minimized.

Show comment
Hide comment
@thinca

thinca Dec 25, 2017

Member

なるほど。区別したい場合があるかはちょっとわからないですが、実際の動作を考えると妥当な気がします。 👍

Member

thinca commented Dec 25, 2017

なるほど。区別したい場合があるかはちょっとわからないですが、実際の動作を考えると妥当な気がします。 👍

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Dec 26, 2017

Member

vim/vim#2499
投げました。

Member

ichizok commented Dec 26, 2017

vim/vim#2499
投げました。

@ichizok

This comment has been minimized.

Show comment
Hide comment
Member

ichizok commented May 21, 2018

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok
Member

ichizok commented Aug 22, 2018

8.1.0309
vim/vim@7feb35e

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment