From 9d779c514f821f550a356dc804819ed81aaf8490 Mon Sep 17 00:00:00 2001 From: Ernie Rael Date: Sun, 7 Jul 2024 20:41:44 +0200 Subject: patch 9.1.0542: Vim9: confusing string() output for object functions Problem: Vim9: confusing string() output for object functions Solution: improve the output for object functions (Ernie Rael) fixes: #15129 closes: #15143 Signed-off-by: Ernie Rael Signed-off-by: Christian Brabandt --- src/eval.c | 37 ++++++++++++++++++++++++++++++++++++- src/testdir/test_vim9_class.vim | 14 ++++++++++++++ src/version.c | 2 ++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/eval.c b/src/eval.c index 66c9562953..049834650f 100644 --- a/src/eval.c +++ b/src/eval.c @@ -5922,6 +5922,37 @@ func_tv2string(typval_T *tv, char_u **tofree, int echo_style) return r; } +/* + * Return a textual representation of the object method in "tv", a VAR_PARTIAL. + * If the memory is allocated "tofree" is set to it, otherwise NULL. + * When "echo_style" is FALSE, put quotes around the function name as + * "function()", otherwise does not put quotes around function name. + * May return NULL. + */ + static char_u * +method_tv2string(typval_T *tv, char_u **tofree, int echo_style) +{ + char_u buf[MAX_FUNC_NAME_LEN]; + partial_T *pt = tv->vval.v_partial; + + size_t len = vim_snprintf((char *)buf, sizeof(buf), "%d_%s.%s", + pt->pt_func->uf_script_ctx.sc_sid, + pt->pt_func->uf_class->class_name, + pt->pt_func->uf_name); + if (len >= sizeof(buf)) + { + if (echo_style) + { + *tofree = NULL; + return (char_u *)"function()"; + } + else + return *tofree = string_quote((char_u*)"", TRUE); + } + + return *tofree = echo_style ? vim_strsave(buf) : string_quote(buf, TRUE); +} + /* * Return a textual representation of a partial in "tv". * If the memory is allocated "tofree" is set to it, otherwise NULL. @@ -6241,7 +6272,11 @@ echo_string_core( break; case VAR_PARTIAL: - r = partial_tv2string(tv, tofree, numbuf, copyID); + if (tv->vval.v_partial == NULL + || tv->vval.v_partial->pt_obj == NULL) + r = partial_tv2string(tv, tofree, numbuf, copyID); + else + r = method_tv2string(tv, tofree, echo_style); break; case VAR_BLOB: diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim index 4f75a945ad..4654598465 100644 --- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -10466,6 +10466,20 @@ func Test_object_string() call v9.CheckSourceSuccess(lines) endfunc +" Test for using the string() builtin method with an object's method +def Test_method_string() + var lines =<< trim END + vim9script + class A + def F() + enddef + endclass + assert_match('function(''\d\+_A\.F'')', string(A.new().F)) + END + v9.CheckScriptSuccess(lines) +enddef + + " Test for using a class in the class definition def Test_Ref_Class_Within_Same_Class() var lines =<< trim END diff --git a/src/version.c b/src/version.c index f9efacf3c4..dffc63c1f4 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 542, /**/ 541, /**/ -- cgit v1.2.3