@@ -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
0 commit comments