diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2023-09-10 18:19:06 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-09-10 18:19:06 +0200 |
commit | f36bbcd402c6ee5a27bcab3b20b6362ab93b8898 (patch) | |
tree | 1ab46f6dbc574548c8a9dea4ca6a661b36475899 /src/eval.c | |
parent | 066103307534f81de08a092aac3a15e864a5a25f (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.c | 94 |
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; } } |