summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/proto/vim9class.pro1
-rw-r--r--src/typval.c19
-rw-r--r--src/version.c2
-rw-r--r--src/vim9class.c28
4 files changed, 33 insertions, 17 deletions
diff --git a/src/proto/vim9class.pro b/src/proto/vim9class.pro
index 1b5800cc58..4c733d5235 100644
--- a/src/proto/vim9class.pro
+++ b/src/proto/vim9class.pro
@@ -40,6 +40,7 @@ int is_class_name(char_u *name, typval_T *rettv);
void protected_method_access_errmsg(char_u *method_name);
int object_empty(object_T *obj);
int object_len(object_T *obj);
+int object_equal(object_T *o1, object_T *o2, int ic, int recursive);
char_u *object2string(object_T *obj, char_u *numbuf, int copyID, int echo_style, int restore_copyID, int composite_val);
int class_instance_of(class_T *cl, class_T *other_cl);
void f_instanceof(typval_T *argvars, typval_T *rettv);
diff --git a/src/typval.c b/src/typval.c
index 76ce405a70..d1fa227d1d 100644
--- a/src/typval.c
+++ b/src/typval.c
@@ -1742,14 +1742,6 @@ typval_compare_object(
return OK;
}
- class_T *cl1 = tv1->vval.v_object->obj_class;
- class_T *cl2 = tv2->vval.v_object->obj_class;
- if (cl1 != cl2 || cl1 == NULL || cl2 == NULL)
- {
- *res = !res_match;
- return OK;
- }
-
object_T *obj1 = tv1->vval.v_object;
object_T *obj2 = tv2->vval.v_object;
if (type == EXPR_IS || type == EXPR_ISNOT)
@@ -1758,14 +1750,7 @@ typval_compare_object(
return OK;
}
- for (int i = 0; i < cl1->class_obj_member_count; ++i)
- if (!tv_equal((typval_T *)(obj1 + 1) + i,
- (typval_T *)(obj2 + 1) + i, ic, TRUE))
- {
- *res = !res_match;
- return OK;
- }
- *res = res_match;
+ *res = object_equal(obj1, obj2, ic, FALSE) ? res_match : !res_match;
return OK;
}
@@ -2115,7 +2100,7 @@ tv_equal(
case VAR_OBJECT:
++recursive_cnt;
- (void)typval_compare_object(tv1, tv2, EXPR_EQUAL, ic, &r);
+ r = object_equal(tv1->vval.v_object, tv2->vval.v_object, ic, TRUE);
--recursive_cnt;
return r;
diff --git a/src/version.c b/src/version.c
index e8f6a2d0d1..391ac7365e 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 */
/**/
+ 514,
+/**/
513,
/**/
512,
diff --git a/src/vim9class.c b/src/vim9class.c
index f66aa68ec7..4d0b4e8dd6 100644
--- a/src/vim9class.c
+++ b/src/vim9class.c
@@ -3842,6 +3842,34 @@ object_len(object_T *obj)
}
/*
+ * Return TRUE when two objects have exactly the same values.
+ */
+ int
+object_equal(
+ object_T *o1,
+ object_T *o2,
+ int ic, // ignore case for strings
+ int recursive) // TRUE when used recursively
+{
+ class_T *cl1, *cl2;
+
+ if (o1 == o2)
+ return TRUE;
+
+ cl1 = o1->obj_class;
+ cl2 = o2->obj_class;
+
+ if (cl1 != cl2 || cl1 == NULL || cl2 == NULL)
+ return FALSE;
+
+ for (int i = 0; i < cl1->class_obj_member_count; ++i)
+ if (!tv_equal((typval_T *)(o1 + 1) + i, (typval_T *)(o2 + 1) + i, ic, recursive))
+ return FALSE;
+
+ return TRUE;
+}
+
+/*
* Return a textual representation of object "obj"
*/
char_u *