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:
committed by
Christian Brabandt
parent
0661033075
commit
f36bbcd402
94
src/eval.c
94
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user