Mercurial > vim
comparison src/testdir/test_vim9_class.vim @ 33587:c470d4fd5eba v9.0.2038
patch 9.0.2038: Vim9: object method funcref not cleaned up after use
Commit: https://github.com/vim/vim/commit/f3eac695bfe3453fe2a8b980601c55835406f14b
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Tue Oct 17 11:00:45 2023 +0200
patch 9.0.2038: Vim9: object method funcref not cleaned up after use
Problem: Vim9: object method funcref not cleaned up after use
Solution: Clean up type stack after using object method funcref,
remove now longer used ISN_DEFEROBJ instrunction
closes: #13360
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 17 Oct 2023 11:15:06 +0200 |
parents | 4db948057fa6 |
children | 1fcb7c9dc546 |
comparison
equal
deleted
inserted
replaced
33586:fd76c227e266 | 33587:c470d4fd5eba |
---|---|
8020 assert_equal(200, A.Cb(20)) | 8020 assert_equal(200, A.Cb(20)) |
8021 END | 8021 END |
8022 v9.CheckSourceSuccess(lines) | 8022 v9.CheckSourceSuccess(lines) |
8023 enddef | 8023 enddef |
8024 | 8024 |
8025 " Test for using object methods as popup callback functions | |
8026 def Test_objmethod_popup_callback() | |
8027 # Use the popup from the script level | |
8028 var lines =<< trim END | |
8029 vim9script | |
8030 | |
8031 class A | |
8032 this.selection: number = -1 | |
8033 this.filterkeys: list<string> = [] | |
8034 | |
8035 def PopupFilter(id: number, key: string): bool | |
8036 add(this.filterkeys, key) | |
8037 return popup_filter_yesno(id, key) | |
8038 enddef | |
8039 | |
8040 def PopupCb(id: number, result: number) | |
8041 this.selection = result ? 100 : 200 | |
8042 enddef | |
8043 endclass | |
8044 | |
8045 var a = A.new() | |
8046 feedkeys('', 'xt') | |
8047 var winid = popup_create('Y/N?', | |
8048 {filter: a.PopupFilter, callback: a.PopupCb}) | |
8049 feedkeys('y', 'xt') | |
8050 popup_close(winid) | |
8051 assert_equal(100, a.selection) | |
8052 assert_equal(['y'], a.filterkeys) | |
8053 feedkeys('', 'xt') | |
8054 winid = popup_create('Y/N?', | |
8055 {filter: a.PopupFilter, callback: a.PopupCb}) | |
8056 feedkeys('n', 'xt') | |
8057 popup_close(winid) | |
8058 assert_equal(200, a.selection) | |
8059 assert_equal(['y', 'n'], a.filterkeys) | |
8060 END | |
8061 v9.CheckSourceSuccess(lines) | |
8062 | |
8063 # Use the popup from a def function | |
8064 lines =<< trim END | |
8065 vim9script | |
8066 | |
8067 class A | |
8068 this.selection: number = -1 | |
8069 this.filterkeys: list<string> = [] | |
8070 | |
8071 def PopupFilter(id: number, key: string): bool | |
8072 add(this.filterkeys, key) | |
8073 return popup_filter_yesno(id, key) | |
8074 enddef | |
8075 | |
8076 def PopupCb(id: number, result: number) | |
8077 this.selection = result ? 100 : 200 | |
8078 enddef | |
8079 endclass | |
8080 | |
8081 def Foo() | |
8082 var a = A.new() | |
8083 feedkeys('', 'xt') | |
8084 var winid = popup_create('Y/N?', | |
8085 {filter: a.PopupFilter, callback: a.PopupCb}) | |
8086 feedkeys('y', 'xt') | |
8087 popup_close(winid) | |
8088 assert_equal(100, a.selection) | |
8089 assert_equal(['y'], a.filterkeys) | |
8090 feedkeys('', 'xt') | |
8091 winid = popup_create('Y/N?', | |
8092 {filter: a.PopupFilter, callback: a.PopupCb}) | |
8093 feedkeys('n', 'xt') | |
8094 popup_close(winid) | |
8095 assert_equal(200, a.selection) | |
8096 assert_equal(['y', 'n'], a.filterkeys) | |
8097 enddef | |
8098 Foo() | |
8099 END | |
8100 v9.CheckSourceSuccess(lines) | |
8101 enddef | |
8102 | |
8103 " Test for using class methods as popup callback functions | |
8104 def Test_classmethod_popup_callback() | |
8105 # Use the popup from the script level | |
8106 var lines =<< trim END | |
8107 vim9script | |
8108 | |
8109 class A | |
8110 static selection: number = -1 | |
8111 static filterkeys: list<string> = [] | |
8112 | |
8113 static def PopupFilter(id: number, key: string): bool | |
8114 add(filterkeys, key) | |
8115 return popup_filter_yesno(id, key) | |
8116 enddef | |
8117 | |
8118 static def PopupCb(id: number, result: number) | |
8119 selection = result ? 100 : 200 | |
8120 enddef | |
8121 endclass | |
8122 | |
8123 feedkeys('', 'xt') | |
8124 var winid = popup_create('Y/N?', | |
8125 {filter: A.PopupFilter, callback: A.PopupCb}) | |
8126 feedkeys('y', 'xt') | |
8127 popup_close(winid) | |
8128 assert_equal(100, A.selection) | |
8129 assert_equal(['y'], A.filterkeys) | |
8130 feedkeys('', 'xt') | |
8131 winid = popup_create('Y/N?', | |
8132 {filter: A.PopupFilter, callback: A.PopupCb}) | |
8133 feedkeys('n', 'xt') | |
8134 popup_close(winid) | |
8135 assert_equal(200, A.selection) | |
8136 assert_equal(['y', 'n'], A.filterkeys) | |
8137 END | |
8138 v9.CheckSourceSuccess(lines) | |
8139 | |
8140 # Use the popup from a def function | |
8141 lines =<< trim END | |
8142 vim9script | |
8143 | |
8144 class A | |
8145 static selection: number = -1 | |
8146 static filterkeys: list<string> = [] | |
8147 | |
8148 static def PopupFilter(id: number, key: string): bool | |
8149 add(filterkeys, key) | |
8150 return popup_filter_yesno(id, key) | |
8151 enddef | |
8152 | |
8153 static def PopupCb(id: number, result: number) | |
8154 selection = result ? 100 : 200 | |
8155 enddef | |
8156 endclass | |
8157 | |
8158 def Foo() | |
8159 feedkeys('', 'xt') | |
8160 var winid = popup_create('Y/N?', | |
8161 {filter: A.PopupFilter, callback: A.PopupCb}) | |
8162 feedkeys('y', 'xt') | |
8163 popup_close(winid) | |
8164 assert_equal(100, A.selection) | |
8165 assert_equal(['y'], A.filterkeys) | |
8166 feedkeys('', 'xt') | |
8167 winid = popup_create('Y/N?', | |
8168 {filter: A.PopupFilter, callback: A.PopupCb}) | |
8169 feedkeys('n', 'xt') | |
8170 popup_close(winid) | |
8171 assert_equal(200, A.selection) | |
8172 assert_equal(['y', 'n'], A.filterkeys) | |
8173 enddef | |
8174 Foo() | |
8175 END | |
8176 v9.CheckSourceSuccess(lines) | |
8177 enddef | |
8178 | |
8179 " Test for using an object method as a timer callback function | |
8180 def Test_objmethod_timer_callback() | |
8181 # Use the timer callback from script level | |
8182 var lines =<< trim END | |
8183 vim9script | |
8184 | |
8185 class A | |
8186 this.timerTick: number = -1 | |
8187 def TimerCb(timerID: number) | |
8188 this.timerTick = 6 | |
8189 enddef | |
8190 endclass | |
8191 | |
8192 var a = A.new() | |
8193 timer_start(0, a.TimerCb) | |
8194 var maxWait = 5 | |
8195 while maxWait > 0 && a.timerTick == -1 | |
8196 :sleep 10m | |
8197 maxWait -= 1 | |
8198 endwhile | |
8199 assert_equal(6, a.timerTick) | |
8200 END | |
8201 v9.CheckSourceSuccess(lines) | |
8202 | |
8203 # Use the timer callback from a def function | |
8204 lines =<< trim END | |
8205 vim9script | |
8206 | |
8207 class A | |
8208 this.timerTick: number = -1 | |
8209 def TimerCb(timerID: number) | |
8210 this.timerTick = 6 | |
8211 enddef | |
8212 endclass | |
8213 | |
8214 def Foo() | |
8215 var a = A.new() | |
8216 timer_start(0, a.TimerCb) | |
8217 var maxWait = 5 | |
8218 while maxWait > 0 && a.timerTick == -1 | |
8219 :sleep 10m | |
8220 maxWait -= 1 | |
8221 endwhile | |
8222 assert_equal(6, a.timerTick) | |
8223 enddef | |
8224 Foo() | |
8225 END | |
8226 v9.CheckSourceSuccess(lines) | |
8227 enddef | |
8228 | |
8229 " Test for using a class method as a timer callback function | |
8230 def Test_classmethod_timer_callback() | |
8231 # Use the timer callback from script level | |
8232 var lines =<< trim END | |
8233 vim9script | |
8234 | |
8235 class A | |
8236 static timerTick: number = -1 | |
8237 static def TimerCb(timerID: number) | |
8238 timerTick = 6 | |
8239 enddef | |
8240 endclass | |
8241 | |
8242 timer_start(0, A.TimerCb) | |
8243 var maxWait = 5 | |
8244 while maxWait > 0 && A.timerTick == -1 | |
8245 :sleep 10m | |
8246 maxWait -= 1 | |
8247 endwhile | |
8248 assert_equal(6, A.timerTick) | |
8249 END | |
8250 v9.CheckSourceSuccess(lines) | |
8251 | |
8252 # Use the timer callback from a def function | |
8253 lines =<< trim END | |
8254 vim9script | |
8255 | |
8256 class A | |
8257 static timerTick: number = -1 | |
8258 static def TimerCb(timerID: number) | |
8259 timerTick = 6 | |
8260 enddef | |
8261 endclass | |
8262 | |
8263 def Foo() | |
8264 timer_start(0, A.TimerCb) | |
8265 var maxWait = 5 | |
8266 while maxWait > 0 && A.timerTick == -1 | |
8267 :sleep 10m | |
8268 maxWait -= 1 | |
8269 endwhile | |
8270 assert_equal(6, A.timerTick) | |
8271 enddef | |
8272 Foo() | |
8273 END | |
8274 v9.CheckSourceSuccess(lines) | |
8275 enddef | |
8276 | |
8025 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker | 8277 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker |