summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/eval.c4
-rw-r--r--src/evalfunc.c17
-rw-r--r--src/testdir/test_vim9_class.vim46
-rw-r--r--src/version.c2
-rw-r--r--src/vim9type.c8
5 files changed, 67 insertions, 10 deletions
diff --git a/src/eval.c b/src/eval.c
index 51ee604319..21ba1bcfcd 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 20649828e0..742c5f8e79 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 ed3aac0be2..0a48b822df 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 739f01fc42..183c388ef7 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 385,
+/**/
384,
/**/
383,
diff --git a/src/vim9type.c b/src/vim9type.c
index 775291e743..ab7efce7a0 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;