@@ -25,6 +25,9 @@ static Tcl_NRPostProc FinalizeEval;
2525static Tcl_NRPostProc NextRestoreFrame ;
2626static Tcl_NRPostProc MarkAsSingleton ;
2727static Tcl_NRPostProc UpdateClassDelegatesAfterClone ;
28+
29+ #define CurrentlyInvoked (contextPtr ) \
30+ ((contextPtr)->callPtr->chain[(contextPtr)->index])
2831
2932/*
3033 * ----------------------------------------------------------------------
@@ -857,8 +860,7 @@ TclOO_Object_Unknown(
857860
858861 if (framePtr -> isProcCallFrame & FRAME_IS_METHOD ) {
859862 CallContext * callerContext = (CallContext * ) framePtr -> clientData ;
860- Method * mPtr = callerContext -> callPtr -> chain [
861- callerContext -> index ].mPtr ;
863+ Method * mPtr = CurrentlyInvoked (callerContext ).mPtr ;
862864
863865 if (mPtr -> declaringObjectPtr ) {
864866 if (oPtr == mPtr -> declaringObjectPtr ) {
@@ -1072,8 +1074,7 @@ TclOOLookupObjectVar(
10721074 if (framePtr -> isProcCallFrame & FRAME_IS_METHOD ) {
10731075 Object * oPtr = (Object * ) object ;
10741076 CallContext * callerContext = (CallContext * ) framePtr -> clientData ;
1075- Method * mPtr = callerContext -> callPtr -> chain [
1076- callerContext -> index ].mPtr ;
1077+ Method * mPtr = CurrentlyInvoked (callerContext ).mPtr ;
10771078 PrivateVariableMapping * pvPtr ;
10781079 Tcl_Size i ;
10791080
@@ -1426,6 +1427,53 @@ NextRestoreFrame(
14261427 return result ;
14271428}
14281429
1430+ /*
1431+ * ----------------------------------------------------------------------
1432+ *
1433+ * MethodName --
1434+ *
1435+ * Helper for TclOOSelfObjCmd to generate the correct name for a method.
1436+ *
1437+ * ----------------------------------------------------------------------
1438+ */
1439+ static inline Tcl_Obj *
1440+ MethodName (
1441+ Foundation * fPtr ,
1442+ CallContext * contextPtr ,
1443+ Method * mPtr )
1444+ {
1445+ switch (contextPtr -> callPtr -> flags & (CONSTRUCTOR | DESTRUCTOR )) {
1446+ case CONSTRUCTOR :
1447+ return fPtr -> constructorName ;
1448+ case DESTRUCTOR :
1449+ return fPtr -> destructorName ;
1450+ default :
1451+ return mPtr -> namePtr ;
1452+ }
1453+ }
1454+
1455+ /*
1456+ * ----------------------------------------------------------------------
1457+ *
1458+ * Declarer --
1459+ *
1460+ * Helper for TclOOSelfObjCmd to get the (named) entity declaring a method.
1461+ *
1462+ * ----------------------------------------------------------------------
1463+ */
1464+ static inline Object *
1465+ Declarer (
1466+ Method * mPtr )
1467+ {
1468+ if (mPtr -> declaringClassPtr != NULL ) {
1469+ return mPtr -> declaringClassPtr -> thisPtr ;
1470+ } else if (mPtr -> declaringObjectPtr != NULL ) {
1471+ return mPtr -> declaringObjectPtr ;
1472+ } else {
1473+ TCL_UNREACHABLE ();
1474+ }
1475+ }
1476+
14291477/*
14301478 * ----------------------------------------------------------------------
14311479 *
@@ -1453,13 +1501,11 @@ TclOOSelfObjCmd(
14531501 SELF_NEXT , SELF_OBJECT , SELF_TARGET
14541502 } index ;
14551503 Interp * iPtr = (Interp * ) interp ;
1504+ Foundation * fPtr = (Foundation * ) iPtr -> objectFoundation ;
14561505 CallFrame * framePtr = iPtr -> varFramePtr ;
14571506 CallContext * contextPtr ;
14581507 Tcl_Obj * result [3 ];
14591508
1460- #define CurrentlyInvoked (contextPtr ) \
1461- ((contextPtr)->callPtr->chain[(contextPtr)->index])
1462-
14631509 /*
14641510 * Start with sanity checks on the calling context and the method context.
14651511 */
@@ -1507,14 +1553,8 @@ TclOOSelfObjCmd(
15071553 return TCL_OK ;
15081554 }
15091555 case SELF_METHOD :
1510- if (contextPtr -> callPtr -> flags & CONSTRUCTOR ) {
1511- Tcl_SetObjResult (interp , contextPtr -> oPtr -> fPtr -> constructorName );
1512- } else if (contextPtr -> callPtr -> flags & DESTRUCTOR ) {
1513- Tcl_SetObjResult (interp , contextPtr -> oPtr -> fPtr -> destructorName );
1514- } else {
1515- Tcl_SetObjResult (interp ,
1516- CurrentlyInvoked (contextPtr ).mPtr -> namePtr );
1517- }
1556+ Tcl_SetObjResult (interp , MethodName (fPtr , contextPtr ,
1557+ CurrentlyInvoked (contextPtr ).mPtr ));
15181558 return TCL_OK ;
15191559 case SELF_FILTER :
15201560 if (!CurrentlyInvoked (contextPtr ).isFilter ) {
@@ -1551,51 +1591,21 @@ TclOOSelfObjCmd(
15511591 } else {
15521592 CallContext * callerPtr = (CallContext * )
15531593 framePtr -> callerVarPtr -> clientData ;
1554- Method * mPtr = callerPtr -> callPtr -> chain [callerPtr -> index ].mPtr ;
1555- Object * declarerPtr ;
1556-
1557- if (mPtr -> declaringClassPtr != NULL ) {
1558- declarerPtr = mPtr -> declaringClassPtr -> thisPtr ;
1559- } else if (mPtr -> declaringObjectPtr != NULL ) {
1560- declarerPtr = mPtr -> declaringObjectPtr ;
1561- } else {
1562- TCL_UNREACHABLE ();
1563- }
1594+ Method * mPtr = CurrentlyInvoked (callerPtr ).mPtr ;
15641595
1565- result [0 ] = TclOOObjectName (interp , declarerPtr );
1596+ result [0 ] = TclOOObjectName (interp , Declarer ( mPtr ) );
15661597 result [1 ] = TclOOObjectName (interp , callerPtr -> oPtr );
1567- if (callerPtr -> callPtr -> flags & CONSTRUCTOR ) {
1568- result [2 ] = declarerPtr -> fPtr -> constructorName ;
1569- } else if (callerPtr -> callPtr -> flags & DESTRUCTOR ) {
1570- result [2 ] = declarerPtr -> fPtr -> destructorName ;
1571- } else {
1572- result [2 ] = mPtr -> namePtr ;
1573- }
1598+ result [2 ] = MethodName (fPtr , callerPtr , mPtr );
15741599 Tcl_SetObjResult (interp , Tcl_NewListObj (3 , result ));
15751600 return TCL_OK ;
15761601 }
15771602 case SELF_NEXT :
15781603 if (contextPtr -> index < contextPtr -> callPtr -> numChain - 1 ) {
15791604 Method * mPtr =
15801605 contextPtr -> callPtr -> chain [contextPtr -> index + 1 ].mPtr ;
1581- Object * declarerPtr ;
15821606
1583- if (mPtr -> declaringClassPtr != NULL ) {
1584- declarerPtr = mPtr -> declaringClassPtr -> thisPtr ;
1585- } else if (mPtr -> declaringObjectPtr != NULL ) {
1586- declarerPtr = mPtr -> declaringObjectPtr ;
1587- } else {
1588- TCL_UNREACHABLE ();
1589- }
1590-
1591- result [0 ] = TclOOObjectName (interp , declarerPtr );
1592- if (contextPtr -> callPtr -> flags & CONSTRUCTOR ) {
1593- result [1 ] = declarerPtr -> fPtr -> constructorName ;
1594- } else if (contextPtr -> callPtr -> flags & DESTRUCTOR ) {
1595- result [1 ] = declarerPtr -> fPtr -> destructorName ;
1596- } else {
1597- result [1 ] = mPtr -> namePtr ;
1598- }
1607+ result [0 ] = TclOOObjectName (interp , Declarer (mPtr ));
1608+ result [1 ] = MethodName (fPtr , contextPtr , mPtr );
15991609 Tcl_SetObjResult (interp , Tcl_NewListObj (2 , result ));
16001610 }
16011611 return TCL_OK ;
@@ -1607,7 +1617,6 @@ TclOOSelfObjCmd(
16071617 return TCL_ERROR ;
16081618 } else {
16091619 Method * mPtr ;
1610- Object * declarerPtr ;
16111620 Tcl_Size i ;
16121621
16131622 for (i = contextPtr -> index ; i < contextPtr -> callPtr -> numChain ; i ++ ) {
@@ -1619,15 +1628,8 @@ TclOOSelfObjCmd(
16191628 Tcl_Panic ("filtering call chain without terminal non-filter" );
16201629 }
16211630 mPtr = contextPtr -> callPtr -> chain [i ].mPtr ;
1622- if (mPtr -> declaringClassPtr != NULL ) {
1623- declarerPtr = mPtr -> declaringClassPtr -> thisPtr ;
1624- } else if (mPtr -> declaringObjectPtr != NULL ) {
1625- declarerPtr = mPtr -> declaringObjectPtr ;
1626- } else {
1627- TCL_UNREACHABLE ();
1628- }
1629- result [0 ] = TclOOObjectName (interp , declarerPtr );
1630- result [1 ] = mPtr -> namePtr ;
1631+ result [0 ] = TclOOObjectName (interp , Declarer (mPtr ));
1632+ result [1 ] = MethodName (fPtr , contextPtr , mPtr );
16311633 Tcl_SetObjResult (interp , Tcl_NewListObj (2 , result ));
16321634 return TCL_OK ;
16331635 }
0 commit comments