0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

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>
This commit is contained in:
Yegappan Lakshmanan
2023-09-10 18:19:06 +02:00
committed by Christian Brabandt
parent 0661033075
commit f36bbcd402
9 changed files with 437 additions and 317 deletions

View File

@@ -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;
}
}