Mercurial > vim
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; } }