patch 9.1.0385: Vim9: crash with null_class and null_object Commit: https://github.com/vim/vim/commit/b2e42b9be0ffa193ef32ad5a5846ef46f5cc4e8c Author: Yegappan Lakshmanan <yegap...@yahoo.com> Date: Wed May 1 11:44:17 2024 +0200
patch 9.1.0385: Vim9: crash with null_class and null_object Problem: Vim9: crash with null_class and null_object (Aliaksei Budavei) Solution: Handle null_class and null_object correctly (Yegappan Lakshmanan) fixes: #14678 closes: #14681 Signed-off-by: Yegappan Lakshmanan <yegap...@yahoo.com> Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/src/eval.c b/src/eval.c index 51ee60431..21ba1bcfc 100644 --- a/src/eval.c +++ b/src/eval.c @@ -6403,9 +6403,9 @@ echo_string_core( { class_T *cl = tv->vval.v_class; char *s = "class"; - if (IS_INTERFACE(cl)) + if (cl && IS_INTERFACE(cl)) s = "interface"; - else if (IS_ENUM(cl)) + else if (cl && IS_ENUM(cl)) s = "enum"; size_t len = STRLEN(s) + 1 + (cl == NULL ? 9 : STRLEN(cl->class_name)) + 1; diff --git a/src/evalfunc.c b/src/evalfunc.c index 20649828e..742c5f8e7 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -11497,7 +11497,7 @@ f_type(typval_T *argvars, typval_T *rettv) case VAR_CLASS: { class_T *cl = argvars[0].vval.v_class; - if (IS_ENUM(cl)) + if (cl && IS_ENUM(cl)) n = VAR_TYPE_ENUM; else n = VAR_TYPE_CLASS; @@ -11505,11 +11505,18 @@ f_type(typval_T *argvars, typval_T *rettv) } case VAR_OBJECT: { - class_T *cl = argvars[0].vval.v_object->obj_class; - if (IS_ENUM(cl)) - n = VAR_TYPE_ENUMVALUE; - else + object_T *obj = argvars[0].vval.v_object; + + if (obj == NULL) n = VAR_TYPE_OBJECT; + else + { + class_T *cl = argvars[0].vval.v_object->obj_class; + if (IS_ENUM(cl)) + n = VAR_TYPE_ENUMVALUE; + else + n = VAR_TYPE_OBJECT; + } break; } case VAR_UNKNOWN: diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim index ed3aac0be..0a48b822d 100644 --- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -545,6 +545,52 @@ def Test_using_null_class() @_ = null_class.member END v9.CheckDefExecAndScriptFailure(lines, ['E715: Dictionary required', 'E1363: Incomplete type']) + + # Test for using a null class as a value + lines =<< trim END + vim9script + echo empty(null_class) + END + v9.CheckSourceFailure(lines, 'E1405: Class "" cannot be used as a value', 2) + + # Test for using a null class with string() + lines =<< trim END + vim9script + assert_equal('class [unknown]', string(null_class)) + END + v9.CheckSourceSuccess(lines) + + # Test for using a null class with string() + lines =<< trim END + vim9script + assert_equal(12, type(null_class)) + assert_equal('class<Unknown>', typename(null_class)) + END + v9.CheckSourceSuccess(lines) +enddef + +def Test_using_null_object() + # Test for using a null object as a value + var lines =<< trim END + vim9script + assert_equal(1, empty(null_object)) + END + v9.CheckSourceSuccess(lines) + + # Test for using a null object with string() + lines =<< trim END + vim9script + assert_equal('object of [unknown]', string(null_object)) + END + v9.CheckSourceSuccess(lines) + + # Test for using a null object with string() + lines =<< trim END + vim9script + assert_equal(13, type(null_object)) + assert_equal('object<Unknown>', typename(null_object)) + END + v9.CheckSourceSuccess(lines) enddef def Test_class_interface_wrong_end() diff --git a/src/version.c b/src/version.c index 739f01fc4..183c388ef 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 */ +/**/ + 385, /**/ 384, /**/ diff --git a/src/vim9type.c b/src/vim9type.c index 775291e74..ab7efce7a 100644 --- a/src/vim9type.c +++ b/src/vim9type.c @@ -2091,10 +2091,12 @@ check_typval_is_value(typval_T *tv) case VAR_CLASS: { class_T *cl = tv->vval.v_class; - if (IS_ENUM(cl)) - semsg(_(e_using_enum_as_value_str), cl->class_name); + char_u *class_name = (cl == NULL) ? (char_u *)"" + : cl->class_name; + if (cl && IS_ENUM(cl)) + semsg(_(e_using_enum_as_value_str), class_name); else - semsg(_(e_using_class_as_value_str), cl->class_name); + semsg(_(e_using_class_as_value_str), class_name); } return FAIL; -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/vim_dev/E1s26kw-008UJd-HV%40256bit.org.