diff options
Diffstat (limited to 'data/vim/patches/8.1.1044')
-rw-r--r-- | data/vim/patches/8.1.1044 | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1044 b/data/vim/patches/8.1.1044 new file mode 100644 index 000000000..334298971 --- /dev/null +++ b/data/vim/patches/8.1.1044 @@ -0,0 +1,296 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.1044 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.1044 +Problem: No way to check the reference count of objects. +Solution: Add test_refcount(). (Ozaki Kiichi, closes #4124) +Files: runtime/doc/eval.txt, src/evalfunc.c, + src/testdir/test_vimscript.vim + + +*** ../vim-8.1.1043/runtime/doc/eval.txt 2019-03-17 16:39:01.562006195 +0100 +--- runtime/doc/eval.txt 2019-03-23 14:11:43.603170194 +0100 +*************** +*** 2645,2650 **** +--- 2672,2678 ---- + test_null_string() String null value for testing + test_option_not_set({name}) none reset flag indicating option was set + test_override({expr}, {val}) none test with Vim internal overrides ++ test_refcount({expr}) Number get the reference count of {expr} + test_scrollbar({which}, {value}, {dragging}) + none scroll in the GUI for testing + test_settime({expr}) none set current time for testing +*************** +*** 9532,9537 **** +--- 9590,9600 ---- + < The value of "starting" is saved. It is restored by: > + call test_override('starting', 0) + ++ test_refcount({expr}) *test_refcount()* ++ Return the reference count of {expr}. When {expr} is of a ++ type that does not have a reference count, returns -1. Only ++ to be used for testing. ++ + test_scrollbar({which}, {value}, {dragging}) *test_scrollbar()* + Pretend using scrollbar {which} to move it to position + {value}. {which} can be: +*** ../vim-8.1.1043/src/evalfunc.c 2019-03-22 17:03:01.783689365 +0100 +--- src/evalfunc.c 2019-03-23 14:09:39.184057626 +0100 +*************** +*** 428,433 **** +--- 428,434 ---- + static void f_test_feedinput(typval_T *argvars, typval_T *rettv); + static void f_test_option_not_set(typval_T *argvars, typval_T *rettv); + static void f_test_override(typval_T *argvars, typval_T *rettv); ++ static void f_test_refcount(typval_T *argvars, typval_T *rettv); + static void f_test_garbagecollect_now(typval_T *argvars, typval_T *rettv); + static void f_test_ignore_error(typval_T *argvars, typval_T *rettv); + static void f_test_null_blob(typval_T *argvars, typval_T *rettv); +*************** +*** 952,958 **** + {"test_feedinput", 1, 1, f_test_feedinput}, + {"test_garbagecollect_now", 0, 0, f_test_garbagecollect_now}, + {"test_ignore_error", 1, 1, f_test_ignore_error}, +! {"test_null_blob", 0, 0, f_test_null_blob}, + #ifdef FEAT_JOB_CHANNEL + {"test_null_channel", 0, 0, f_test_null_channel}, + #endif +--- 953,959 ---- + {"test_feedinput", 1, 1, f_test_feedinput}, + {"test_garbagecollect_now", 0, 0, f_test_garbagecollect_now}, + {"test_ignore_error", 1, 1, f_test_ignore_error}, +! {"test_null_blob", 0, 0, f_test_null_blob}, + #ifdef FEAT_JOB_CHANNEL + {"test_null_channel", 0, 0, f_test_null_channel}, + #endif +*************** +*** 964,970 **** + {"test_null_partial", 0, 0, f_test_null_partial}, + {"test_null_string", 0, 0, f_test_null_string}, + {"test_option_not_set", 1, 1, f_test_option_not_set}, +! {"test_override", 2, 2, f_test_override}, + #ifdef FEAT_GUI + {"test_scrollbar", 3, 3, f_test_scrollbar}, + #endif +--- 965,972 ---- + {"test_null_partial", 0, 0, f_test_null_partial}, + {"test_null_string", 0, 0, f_test_null_string}, + {"test_option_not_set", 1, 1, f_test_option_not_set}, +! {"test_override", 2, 2, f_test_override}, +! {"test_refcount", 1, 1, f_test_refcount}, + #ifdef FEAT_GUI + {"test_scrollbar", 3, 3, f_test_scrollbar}, + #endif +*************** +*** 13847,13852 **** +--- 13849,13915 ---- + } + + /* ++ * "test_refcount({expr})" function ++ */ ++ static void ++ f_test_refcount(typval_T *argvars, typval_T *rettv) ++ { ++ int retval = -1; ++ ++ switch (argvars[0].v_type) ++ { ++ case VAR_UNKNOWN: ++ case VAR_NUMBER: ++ case VAR_FLOAT: ++ case VAR_SPECIAL: ++ case VAR_STRING: ++ break; ++ case VAR_JOB: ++ #ifdef FEAT_JOB_CHANNEL ++ if (argvars[0].vval.v_job != NULL) ++ retval = argvars[0].vval.v_job->jv_refcount - 1; ++ #endif ++ break; ++ case VAR_CHANNEL: ++ #ifdef FEAT_JOB_CHANNEL ++ if (argvars[0].vval.v_channel != NULL) ++ retval = argvars[0].vval.v_channel->ch_refcount - 1; ++ #endif ++ break; ++ case VAR_FUNC: ++ if (argvars[0].vval.v_string != NULL) ++ { ++ ufunc_T *fp; ++ ++ fp = find_func(argvars[0].vval.v_string); ++ if (fp != NULL) ++ retval = fp->uf_refcount; ++ } ++ break; ++ case VAR_PARTIAL: ++ if (argvars[0].vval.v_partial != NULL) ++ retval = argvars[0].vval.v_partial->pt_refcount - 1; ++ break; ++ case VAR_BLOB: ++ if (argvars[0].vval.v_blob != NULL) ++ retval = argvars[0].vval.v_blob->bv_refcount - 1; ++ break; ++ case VAR_LIST: ++ if (argvars[0].vval.v_list != NULL) ++ retval = argvars[0].vval.v_list->lv_refcount - 1; ++ break; ++ case VAR_DICT: ++ if (argvars[0].vval.v_dict != NULL) ++ retval = argvars[0].vval.v_dict->dv_refcount - 1; ++ break; ++ } ++ ++ rettv->v_type = VAR_NUMBER; ++ rettv->vval.v_number = retval; ++ ++ } ++ ++ /* + * "test_garbagecollect_now()" function + */ + static void +*** ../vim-8.1.1043/src/testdir/test_vimscript.vim 2019-03-02 11:57:06.159125888 +0100 +--- src/testdir/test_vimscript.vim 2019-03-23 14:21:08.991161181 +0100 +*************** +*** 1556,1561 **** +--- 1556,1670 ---- + let @/ = '' + endfunc + ++ func Test_refcount() ++ " Immediate values ++ call assert_equal(-1, test_refcount(1)) ++ call assert_equal(-1, test_refcount('s')) ++ call assert_equal(-1, test_refcount(v:true)) ++ call assert_equal(0, test_refcount([])) ++ call assert_equal(0, test_refcount({})) ++ call assert_equal(0, test_refcount(0zff)) ++ call assert_equal(0, test_refcount({-> line('.')})) ++ if has('float') ++ call assert_equal(-1, test_refcount(0.1)) ++ endif ++ if has('job') ++ call assert_equal(0, test_refcount(job_start([&shell, &shellcmdflag, 'echo .']))) ++ endif ++ ++ " No refcount types ++ let x = 1 ++ call assert_equal(-1, test_refcount(x)) ++ let x = 's' ++ call assert_equal(-1, test_refcount(x)) ++ let x = v:true ++ call assert_equal(-1, test_refcount(x)) ++ if has('float') ++ let x = 0.1 ++ call assert_equal(-1, test_refcount(x)) ++ endif ++ ++ " Check refcount ++ let x = [] ++ call assert_equal(1, test_refcount(x)) ++ ++ let x = {} ++ call assert_equal(1, test_refcount(x)) ++ ++ let x = 0zff ++ call assert_equal(1, test_refcount(x)) ++ ++ let X = {-> line('.')} ++ call assert_equal(1, test_refcount(X)) ++ let Y = X ++ call assert_equal(2, test_refcount(X)) ++ ++ if has('job') ++ let job = job_start([&shell, &shellcmdflag, 'echo .']) ++ call assert_equal(1, test_refcount(job)) ++ call assert_equal(1, test_refcount(job_getchannel(job))) ++ call assert_equal(1, test_refcount(job)) ++ endif ++ ++ " Function arguments, copying and unassigning ++ func ExprCheck(x, i) ++ let i = a:i + 1 ++ call assert_equal(i, test_refcount(a:x)) ++ let Y = a:x ++ call assert_equal(i + 1, test_refcount(a:x)) ++ call assert_equal(test_refcount(a:x), test_refcount(Y)) ++ let Y = 0 ++ call assert_equal(i, test_refcount(a:x)) ++ endfunc ++ call ExprCheck([], 0) ++ call ExprCheck({}, 0) ++ call ExprCheck(0zff, 0) ++ call ExprCheck({-> line('.')}, 0) ++ if has('job') ++ call ExprCheck(job, 1) ++ call ExprCheck(job_getchannel(job), 1) ++ call job_stop(job) ++ endif ++ delfunc ExprCheck ++ ++ " Regarding function ++ func Func(x) abort ++ call assert_equal(2, test_refcount(function('Func'))) ++ call assert_equal(0, test_refcount(funcref('Func'))) ++ endfunc ++ call assert_equal(1, test_refcount(function('Func'))) ++ call assert_equal(0, test_refcount(function('Func', [1]))) ++ call assert_equal(0, test_refcount(funcref('Func'))) ++ call assert_equal(0, test_refcount(funcref('Func', [1]))) ++ let X = function('Func') ++ let Y = X ++ call assert_equal(1, test_refcount(X)) ++ let X = function('Func', [1]) ++ let Y = X ++ call assert_equal(2, test_refcount(X)) ++ let X = funcref('Func') ++ let Y = X ++ call assert_equal(2, test_refcount(X)) ++ let X = funcref('Func', [1]) ++ let Y = X ++ call assert_equal(2, test_refcount(X)) ++ unlet X ++ unlet Y ++ call Func(1) ++ delfunc Func ++ ++ " Function with dict ++ func DictFunc() dict ++ call assert_equal(3, test_refcount(self)) ++ endfunc ++ let d = {'Func': function('DictFunc')} ++ call assert_equal(1, test_refcount(d)) ++ call assert_equal(0, test_refcount(d.Func)) ++ call d.Func() ++ unlet d ++ delfunc DictFunc ++ endfunc ++ + "------------------------------------------------------------------------------- + " Modelines {{{1 + " vim: ts=8 sw=4 tw=80 fdm=marker +*** ../vim-8.1.1043/src/version.c 2019-03-23 13:56:30.189804811 +0100 +--- src/version.c 2019-03-23 14:10:54.583519509 +0100 +*************** +*** 777,778 **** +--- 777,780 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1044, + /**/ + +-- +A meeting is an event at which the minutes are kept and the hours are lost. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |