summaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2023-09-10 18:19:06 +0200
committerChristian Brabandt <cb@256bit.org>2023-09-10 18:19:06 +0200
commitf36bbcd402c6ee5a27bcab3b20b6362ab93b8898 (patch)
tree1ab46f6dbc574548c8a9dea4ca6a661b36475899 /src/eval.c
parent066103307534f81de08a092aac3a15e864a5a25f (diff)
patch 9.0.1890: Vim9: lookup code for class/object repaeatedv9.0.1890
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>
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c94
1 files changed, 40 insertions, 54 deletions
diff --git a/src/eval.c b/src/eval.c
index ec8d3baf9c..dd7b8d8f33 100644
--- 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;
}
}