| ︙ | | | ︙ | |
632
633
634
635
636
637
638
639
640
641
642
643
644
645
|
SCOPE_UNEXPORTED, /* User said -scope unexported */
#ifdef TCLOO_SUPPORT_LOCALPRIVATE_SCOPE_IN_INFO_METHODS
SCOPE_LOCALPRIVATE, /* User said -scope localprivate (not enabled) */
#endif
SCOPE_NONE = -1 /* No scope set. Use old semantics. */
};
static inline int
ParseMethodsArgs(
Tcl_Interp *interp,
int objc,
Tcl_Obj *const objv[],
int *recursePtr,
int *flagPtr,
|
>
>
>
>
>
>
>
>
>
|
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
|
SCOPE_UNEXPORTED, /* User said -scope unexported */
#ifdef TCLOO_SUPPORT_LOCALPRIVATE_SCOPE_IN_INFO_METHODS
SCOPE_LOCALPRIVATE, /* User said -scope localprivate (not enabled) */
#endif
SCOPE_NONE = -1 /* No scope set. Use old semantics. */
};
/*
* ----------------------------------------------------------------------
*
* ParseMethodsArgs --
*
* Parse the options to [info class methods] and [info object methods].
*
* ----------------------------------------------------------------------
*/
static inline int
ParseMethodsArgs(
Tcl_Interp *interp,
int objc,
Tcl_Obj *const objv[],
int *recursePtr,
int *flagPtr,
|
| ︙ | | | ︙ | |
728
729
730
731
732
733
734
735
736
737
738
739
740
741
|
case SCOPE_UNEXPORTED:
*flagPtr = 0;
break;
}
}
return TCL_OK;
}
/*
* ----------------------------------------------------------------------
*
* InfoObjectMethodsCmd --
*
* Implements [info object methods $objName ?$option ...?]
*
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
|
case SCOPE_UNEXPORTED:
*flagPtr = 0;
break;
}
}
return TCL_OK;
}
/*
* ----------------------------------------------------------------------
*
* ListLocalMatchingMethods --
*
* Get the method names out of a hash table of methods where the methods
* match the given filter options. Used by [info class methods] and
* [info object methods] when not recursing through the inheritance
* hierarchy.
*
* ----------------------------------------------------------------------
*/
static inline Tcl_Obj *
ListLocalMatchingMethods(
Tcl_HashTable *methodsPtr, /* Hash table of methods. */
int scope, /* Sought scope. */
int flag) /* Sought flag. */
{
FOREACH_HASH_DECLS;
Tcl_Obj *namePtr, *resultObj;
Method *mPtr;
/*
* Can't pre-allocate the list buffer; not sure how many elements there
* are going to be yet.
*/
TclNewObj(resultObj);
if (scope == SCOPE_NONE) {
/*
* Handle legacy-mode matching. [Bug 36e5517a6850]
*/
int scopeFilter = flag | TRUE_PRIVATE_METHOD;
FOREACH_HASH(namePtr, mPtr, methodsPtr) {
if (mPtr->typePtr && (mPtr->flags & scopeFilter) == flag) {
Tcl_ListObjAppendElement(NULL, resultObj, namePtr);
}
}
} else {
FOREACH_HASH(namePtr, mPtr, methodsPtr) {
if (mPtr->typePtr && (mPtr->flags & SCOPE_FLAGS) == flag) {
Tcl_ListObjAppendElement(NULL, resultObj, namePtr);
}
}
}
return resultObj;
}
/*
* ----------------------------------------------------------------------
*
* InfoObjectMethodsCmd --
*
* Implements [info object methods $objName ?$option ...?]
*
|
| ︙ | | | ︙ | |
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
|
&names);
if (numNames > 0) {
Tcl_SetObjResult(interp, Tcl_NewListObj(numNames, names));
Tcl_Free((void *) names);
}
} else if (oPtr->methodsPtr) {
FOREACH_HASH_DECLS;
Tcl_Obj *namePtr, *resultObj;
Method *mPtr;
/*
* Can't pre-allocate the list buffer; not sure how many elements there
* are going to be yet.
*/
TclNewObj(resultObj);
if (scope == SCOPE_NONE) {
/*
* Handle legacy-mode matching. [Bug 36e5517a6850]
*/
int scopeFilter = flag | TRUE_PRIVATE_METHOD;
FOREACH_HASH(namePtr, mPtr, oPtr->methodsPtr) {
if (mPtr->typePtr && (mPtr->flags & scopeFilter) == flag) {
Tcl_ListObjAppendElement(NULL, resultObj, namePtr);
}
}
} else {
FOREACH_HASH(namePtr, mPtr, oPtr->methodsPtr) {
if (mPtr->typePtr && (mPtr->flags & SCOPE_FLAGS) == flag) {
Tcl_ListObjAppendElement(NULL, resultObj, namePtr);
}
}
}
Tcl_SetObjResult(interp, resultObj);
}
return TCL_OK;
}
/*
* ----------------------------------------------------------------------
*
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
>
|
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
|
&names);
if (numNames > 0) {
Tcl_SetObjResult(interp, Tcl_NewListObj(numNames, names));
Tcl_Free((void *) names);
}
} else if (oPtr->methodsPtr) {
Tcl_SetObjResult(interp,
ListLocalMatchingMethods(oPtr->methodsPtr, scope, flag));
}
return TCL_OK;
}
/*
* ----------------------------------------------------------------------
*
|
| ︙ | | | ︙ | |
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
|
Tcl_Size numNames = TclOOGetSortedClassMethodList(clsPtr, flag, &names);
if (numNames > 0) {
Tcl_SetObjResult(interp, Tcl_NewListObj(numNames, names));
Tcl_Free((void *)names);
}
} else {
Tcl_Obj *namePtr, *resultObj;
Method *mPtr;
FOREACH_HASH_DECLS;
TclNewObj(resultObj);
if (scope == SCOPE_NONE) {
/*
* Handle legacy-mode matching. [Bug 36e5517a6850]
*/
int scopeFilter = flag | TRUE_PRIVATE_METHOD;
FOREACH_HASH(namePtr, mPtr, &clsPtr->classMethods) {
if (mPtr->typePtr && (mPtr->flags & scopeFilter) == flag) {
Tcl_ListObjAppendElement(NULL, resultObj, namePtr);
}
}
} else {
FOREACH_HASH(namePtr, mPtr, &clsPtr->classMethods) {
if (mPtr->typePtr && (mPtr->flags & SCOPE_FLAGS) == flag) {
Tcl_ListObjAppendElement(NULL, resultObj, namePtr);
}
}
}
Tcl_SetObjResult(interp, resultObj);
}
return TCL_OK;
}
/*
* ----------------------------------------------------------------------
*
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
>
|
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
|
Tcl_Size numNames = TclOOGetSortedClassMethodList(clsPtr, flag, &names);
if (numNames > 0) {
Tcl_SetObjResult(interp, Tcl_NewListObj(numNames, names));
Tcl_Free((void *)names);
}
} else {
Tcl_SetObjResult(interp,
ListLocalMatchingMethods(&clsPtr->classMethods, scope, flag));
}
return TCL_OK;
}
/*
* ----------------------------------------------------------------------
*
|
| ︙ | | | ︙ | |