diff src/eval.c @ 33233:108d890d887f v9.0.1890

patch 9.0.1890: Vim9: lookup code for class/object repaeated Commit: https://github.com/vim/vim/commit/f36bbcd402c6ee5a27bcab3b20b6362ab93b8898 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Sun Sep 10 18:19:06 2023 +0200 patch 9.0.1890: Vim9: lookup code for class/object repaeated Problem: Vim9: lookup code for class/object repaeated Solution: Refactor and make use of lookup functions closes: #13067 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author Christian Brabandt <cb@256bit.org>
date Sun, 10 Sep 2023 18:30:04 +0200
parents 1e649fd371cd
children aba1fa2b7d1e
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -1540,71 +1540,57 @@ get_lval(
 		    // round 1: class functions (skipped for an object)
 		    // round 2: object methods
 		    for (int round = v_type == VAR_OBJECT ? 2 : 1;
-							   round <= 2; ++round)
+							round <= 2; ++round)
 		    {
-			int count = round == 1
-					    ? cl->class_class_function_count
-					    : cl->class_obj_method_count;
-			ufunc_T **funcs = round == 1
-					    ? cl->class_class_functions
-					    : cl->class_obj_methods;
-			for (int i = 0; i < count; ++i)
+			int	m_idx;
+			ufunc_T	*fp;
+
+			fp = method_lookup(cl,
+				round == 1 ? VAR_CLASS : VAR_OBJECT,
+				key, p - key, &m_idx);
+			if (fp != NULL)
 			{
-			    ufunc_T *fp = funcs[i];
-			    char_u *ufname = (char_u *)fp->uf_name;
-			    if (STRNCMP(ufname, key, p - key) == 0
-						     && ufname[p - key] == NUL)
-			    {
-				lp->ll_ufunc = fp;
-				lp->ll_valtype = fp->uf_func_type;
-				round = 3;
-				break;
-			    }
+			    lp->ll_ufunc = fp;
+			    lp->ll_valtype = fp->uf_func_type;
+			    break;
 			}
 		    }
 		}
 
 		if (lp->ll_valtype == NULL)
 		{
-		    int count = v_type == VAR_OBJECT
-					    ? cl->class_obj_member_count
-					    : cl->class_class_member_count;
-		    ocmember_T *members = v_type == VAR_OBJECT
-					    ? cl->class_obj_members
-					    : cl->class_class_members;
-		    for (int i = 0; i < count; ++i)
+		    int		m_idx;
+		    ocmember_T	*om;
+
+		    om = member_lookup(cl, v_type, key, p - key, &m_idx);
+		    if (om != NULL)
 		    {
-			ocmember_T *om = members + i;
-			if (STRNCMP(om->ocm_name, key, p - key) == 0
-					       && om->ocm_name[p - key] == NUL)
+			switch (om->ocm_access)
 			{
-			    switch (om->ocm_access)
-			    {
-				case VIM_ACCESS_PRIVATE:
-					semsg(_(e_cannot_access_private_member_str),
-								 om->ocm_name);
-					return NULL;
-				case VIM_ACCESS_READ:
-					if ((flags & GLV_READ_ONLY) == 0)
-					{
-					    semsg(_(e_member_is_not_writable_str),
-								 om->ocm_name);
-					    return NULL;
-					}
-					break;
-				case VIM_ACCESS_ALL:
-					break;
-			    }
-
-			    lp->ll_valtype = om->ocm_type;
-
-			    if (v_type == VAR_OBJECT)
-				lp->ll_tv = ((typval_T *)(
-					    lp->ll_tv->vval.v_object + 1)) + i;
-			    else
-				lp->ll_tv = &cl->class_members_tv[i];
-			    break;
+			    case VIM_ACCESS_PRIVATE:
+				semsg(_(e_cannot_access_private_member_str),
+					om->ocm_name);
+				return NULL;
+			    case VIM_ACCESS_READ:
+				if ((flags & GLV_READ_ONLY) == 0)
+				{
+				    semsg(_(e_member_is_not_writable_str),
+					    om->ocm_name);
+				    return NULL;
+				}
+				break;
+			    case VIM_ACCESS_ALL:
+				break;
 			}
+
+			lp->ll_valtype = om->ocm_type;
+
+			if (v_type == VAR_OBJECT)
+			    lp->ll_tv = ((typval_T *)(
+					lp->ll_tv->vval.v_object + 1)) + m_idx;
+			else
+			    lp->ll_tv = &cl->class_members_tv[m_idx];
+			break;
 		    }
 		}