Mercurial > vim
diff src/vim9expr.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 | 3672d3d13524 |
children | 877dddec681f |
line wrap: on
line diff
--- a/src/vim9expr.c +++ b/src/vim9expr.c @@ -394,39 +394,32 @@ compile_class_object_index(cctx_T *cctx, if (type->tt_type == VAR_OBJECT) { - for (int i = 0; i < cl->class_obj_member_count; ++i) + int m_idx = object_member_idx(cl, name, len); + if (m_idx >= 0) { - ocmember_T *m = &cl->class_obj_members[i]; - if (STRNCMP(name, m->ocm_name, len) == 0 && m->ocm_name[len] == NUL) + ocmember_T *m = &cl->class_obj_members[m_idx]; + if (*name == '_' && !inside_class(cctx, cl)) { - if (*name == '_' && !inside_class(cctx, cl)) - { - semsg(_(e_cannot_access_private_member_str), m->ocm_name); - return FAIL; - } - - *arg = name_end; - if (cl->class_flags & (CLASS_INTERFACE | CLASS_EXTENDED)) - return generate_GET_ITF_MEMBER(cctx, cl, i, m->ocm_type, + semsg(_(e_cannot_access_private_member_str), m->ocm_name); + return FAIL; + } + + *arg = name_end; + if (cl->class_flags & (CLASS_INTERFACE | CLASS_EXTENDED)) + return generate_GET_ITF_MEMBER(cctx, cl, m_idx, m->ocm_type, FALSE); - return generate_GET_OBJ_MEMBER(cctx, i, m->ocm_type, FALSE); - } + return generate_GET_OBJ_MEMBER(cctx, m_idx, m->ocm_type, FALSE); } // Could be a function reference: "obj.Func". - for (int i = 0; i < cl->class_obj_method_count; ++i) + m_idx = object_method_idx(cl, name, len); + if (m_idx >= 0) { - ufunc_T *fp = cl->class_obj_methods[i]; - // Use a separate pointer to avoid that ASAN complains about - // uf_name[] only being 4 characters. - char_u *ufname = (char_u *)fp->uf_name; - if (STRNCMP(name, ufname, len) == 0 && ufname[len] == NUL) - { - if (type->tt_type == VAR_OBJECT - && (cl->class_flags & (CLASS_INTERFACE | CLASS_EXTENDED))) - return generate_FUNCREF(cctx, fp, cl, i, NULL); - return generate_FUNCREF(cctx, fp, NULL, 0, NULL); - } + ufunc_T *fp = cl->class_obj_methods[m_idx]; + if (type->tt_type == VAR_OBJECT + && (cl->class_flags & (CLASS_INTERFACE | CLASS_EXTENDED))) + return generate_FUNCREF(cctx, fp, cl, m_idx, NULL); + return generate_FUNCREF(cctx, fp, NULL, 0, NULL); } semsg(_(e_member_not_found_on_object_str_str), cl->class_name, name); @@ -435,28 +428,22 @@ compile_class_object_index(cctx_T *cctx, { // load class member int idx; - for (idx = 0; idx < cl->class_class_member_count; ++idx) + ocmember_T *m = class_member_lookup(cl, name, len, &idx); + if (m != NULL) { - ocmember_T *m = &cl->class_class_members[idx]; - if (STRNCMP(name, m->ocm_name, len) == 0 && m->ocm_name[len] == NUL) + // Note: type->tt_type = VAR_CLASS + if ((cl->class_flags & CLASS_INTERFACE) != 0) { - // Note: type->tt_type = VAR_CLASS - if ((cl->class_flags & CLASS_INTERFACE) != 0) - { - semsg(_(e_interface_static_direct_access_str), - cl->class_name, m->ocm_name); - return FAIL; - } - if (*name == '_' && !inside_class(cctx, cl)) - { - semsg(_(e_cannot_access_private_member_str), m->ocm_name); - return FAIL; - } - break; + semsg(_(e_interface_static_direct_access_str), + cl->class_name, m->ocm_name); + return FAIL; } - } - if (idx < cl->class_class_member_count) - { + if (*name == '_' && !inside_class(cctx, cl)) + { + semsg(_(e_cannot_access_private_member_str), m->ocm_name); + return FAIL; + } + *arg = name_end; return generate_CLASSMEMBER(cctx, TRUE, cl, idx); } @@ -773,7 +760,7 @@ compile_load( else gen_load = TRUE; } - else if ((idx = class_member_index(*arg, len, &cl, cctx)) >= 0) + else if ((idx = cctx_class_member_idx(cctx, *arg, len, &cl)) >= 0) { // Referencing a class member without the class name. Infer // the class from the def function context. @@ -1141,7 +1128,7 @@ compile_call( goto theend; } } - else if ((mi = class_method_index(name, varlen, &cl, cctx)) >= 0) + else if ((mi = cctx_class_method_idx(cctx, name, varlen, &cl)) >= 0) { // Class method invocation without the class name. The // generate_CALL() function expects the class type at the top of