Skip to content

Commit f36bbcd

Browse files
yegappanchrisbra
authored andcommitted
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 <[email protected]> Co-authored-by: Yegappan Lakshmanan <[email protected]>
1 parent 0661033 commit f36bbcd

9 files changed

Lines changed: 428 additions & 308 deletions

File tree

src/eval.c

Lines changed: 40 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,71 +1540,57 @@ get_lval(
15401540
// round 1: class functions (skipped for an object)
15411541
// round 2: object methods
15421542
for (int round = v_type == VAR_OBJECT ? 2 : 1;
1543-
round <= 2; ++round)
1543+
round <= 2; ++round)
15441544
{
1545-
int count = round == 1
1546-
? cl->class_class_function_count
1547-
: cl->class_obj_method_count;
1548-
ufunc_T **funcs = round == 1
1549-
? cl->class_class_functions
1550-
: cl->class_obj_methods;
1551-
for (int i = 0; i < count; ++i)
1545+
int m_idx;
1546+
ufunc_T *fp;
1547+
1548+
fp = method_lookup(cl,
1549+
round == 1 ? VAR_CLASS : VAR_OBJECT,
1550+
key, p - key, &m_idx);
1551+
if (fp != NULL)
15521552
{
1553-
ufunc_T *fp = funcs[i];
1554-
char_u *ufname = (char_u *)fp->uf_name;
1555-
if (STRNCMP(ufname, key, p - key) == 0
1556-
&& ufname[p - key] == NUL)
1557-
{
1558-
lp->ll_ufunc = fp;
1559-
lp->ll_valtype = fp->uf_func_type;
1560-
round = 3;
1561-
break;
1562-
}
1553+
lp->ll_ufunc = fp;
1554+
lp->ll_valtype = fp->uf_func_type;
1555+
break;
15631556
}
15641557
}
15651558
}
15661559

15671560
if (lp->ll_valtype == NULL)
15681561
{
1569-
int count = v_type == VAR_OBJECT
1570-
? cl->class_obj_member_count
1571-
: cl->class_class_member_count;
1572-
ocmember_T *members = v_type == VAR_OBJECT
1573-
? cl->class_obj_members
1574-
: cl->class_class_members;
1575-
for (int i = 0; i < count; ++i)
1562+
int m_idx;
1563+
ocmember_T *om;
1564+
1565+
om = member_lookup(cl, v_type, key, p - key, &m_idx);
1566+
if (om != NULL)
15761567
{
1577-
ocmember_T *om = members + i;
1578-
if (STRNCMP(om->ocm_name, key, p - key) == 0
1579-
&& om->ocm_name[p - key] == NUL)
1568+
switch (om->ocm_access)
15801569
{
1581-
switch (om->ocm_access)
1582-
{
1583-
case VIM_ACCESS_PRIVATE:
1584-
semsg(_(e_cannot_access_private_member_str),
1585-
om->ocm_name);
1586-
return NULL;
1587-
case VIM_ACCESS_READ:
1588-
if ((flags & GLV_READ_ONLY) == 0)
1589-
{
1590-
semsg(_(e_member_is_not_writable_str),
1591-
om->ocm_name);
1592-
return NULL;
1593-
}
1594-
break;
1595-
case VIM_ACCESS_ALL:
1596-
break;
1597-
}
1598-
1599-
lp->ll_valtype = om->ocm_type;
1600-
1601-
if (v_type == VAR_OBJECT)
1602-
lp->ll_tv = ((typval_T *)(
1603-
lp->ll_tv->vval.v_object + 1)) + i;
1604-
else
1605-
lp->ll_tv = &cl->class_members_tv[i];
1606-
break;
1570+
case VIM_ACCESS_PRIVATE:
1571+
semsg(_(e_cannot_access_private_member_str),
1572+
om->ocm_name);
1573+
return NULL;
1574+
case VIM_ACCESS_READ:
1575+
if ((flags & GLV_READ_ONLY) == 0)
1576+
{
1577+
semsg(_(e_member_is_not_writable_str),
1578+
om->ocm_name);
1579+
return NULL;
1580+
}
1581+
break;
1582+
case VIM_ACCESS_ALL:
1583+
break;
16071584
}
1585+
1586+
lp->ll_valtype = om->ocm_type;
1587+
1588+
if (v_type == VAR_OBJECT)
1589+
lp->ll_tv = ((typval_T *)(
1590+
lp->ll_tv->vval.v_object + 1)) + m_idx;
1591+
else
1592+
lp->ll_tv = &cl->class_members_tv[m_idx];
1593+
break;
16081594
}
16091595
}
16101596

src/proto/vim9class.pro

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,16 @@ void ex_enum(exarg_T *eap);
66
void ex_type(exarg_T *eap);
77
int class_object_index(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int verbose);
88
ufunc_T *find_class_func(char_u **arg);
9-
int class_member_index(char_u *name, size_t len, class_T **cl_ret, cctx_T *cctx);
10-
int class_method_index(char_u *name, size_t len, class_T **cl_ret, cctx_T *cctx);
9+
int class_member_idx(class_T *cl, char_u *name, size_t namelen);
10+
ocmember_T *class_member_lookup(class_T *cl, char_u *name, size_t namelen, int *idx);
11+
int class_method_idx(class_T *cl, char_u *name, size_t namelen);
12+
ufunc_T *class_method_lookup(class_T *cl, char_u *name, size_t namelen, int *idx);
13+
int object_member_idx(class_T *cl, char_u *name, size_t namelen);
14+
ocmember_T *object_member_lookup(class_T *cl, char_u *name, size_t namelen, int *idx);
15+
int object_method_idx(class_T *cl, char_u *name, size_t namelen);
16+
ufunc_T *object_method_lookup(class_T *cl, char_u *name, size_t namelen, int *idx);
17+
ocmember_T *member_lookup(class_T *cl, vartype_T v_type, char_u *name, size_t namelen, int *idx);
18+
ufunc_T *method_lookup(class_T *cl, vartype_T v_type, char_u *name, size_t namelen, int *idx);
1119
int inside_class(cctx_T *cctx_arg, class_T *cl);
1220
void copy_object(typval_T *from, typval_T *to);
1321
void object_unref(object_T *obj);

src/proto/vim9compile.pro

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ int arg_exists(char_u *name, size_t len, int *idxp, type_T **type, int *gen_load
44
void update_script_var_block_id(char_u *name, int block_id);
55
int script_is_vim9(void);
66
int script_var_exists(char_u *name, size_t len, cctx_T *cctx, cstack_T *cstack);
7+
int cctx_class_method_idx(cctx_T *cctx, char_u *name, size_t len, class_T **cl_ret);
8+
int cctx_class_member_idx(cctx_T *cctx, char_u *name, size_t len, class_T **cl_ret);
79
int check_defined(char_u *p, size_t len, cctx_T *cctx, cstack_T *cstack, int is_arg);
810
int need_type_where(type_T *actual, type_T *expected, int number_ok, int offset, where_T where, cctx_T *cctx, int silent, int actual_is_const);
911
int need_type(type_T *actual, type_T *expected, int number_ok, int offset, int arg_idx, cctx_T *cctx, int silent, int actual_is_const);

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,8 @@ static char *(features[]) =
699699

700700
static int included_patches[] =
701701
{ /* Add new patch number below this line */
702+
/**/
703+
1890,
702704
/**/
703705
1889,
704706
/**/

0 commit comments

Comments
 (0)