summaryrefslogtreecommitdiffstats
path: root/generic/tclBasic.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2012-11-16 16:19:54 (GMT)
committerdgp <dgp@users.sourceforge.net>2012-11-16 16:19:54 (GMT)
commit2bf2abcb4f1c88fbddc3ce4d5800c438851aaf95 (patch)
treeb9d6e4c30112049fb102fc3f80bfe43375e5d21a /generic/tclBasic.c
parenta5e261f15f06a283ad8a648611f1a9eb5b8127e1 (diff)
parent10dd9595a33e80ac7ab8ae5ff11b6b6ef3059b20 (diff)
downloadtcl-2bf2abcb4f1c88fbddc3ce4d5800c438851aaf95.zip
tcl-2bf2abcb4f1c88fbddc3ce4d5800c438851aaf95.tar.gz
tcl-2bf2abcb4f1c88fbddc3ce4d5800c438851aaf95.tar.bz2
3587651 Fix [info functions] and Tcl_ListMathFuncs().
Diffstat (limited to 'generic/tclBasic.c')
-rw-r--r--generic/tclBasic.c49
1 files changed, 18 insertions, 31 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index bce6479..562cca6 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -3756,41 +3756,28 @@ Tcl_ListMathFuncs(
Tcl_Interp *interp,
const char *pattern)
{
- Namespace *globalNsPtr = (Namespace *) Tcl_GetGlobalNamespace(interp);
- Namespace *nsPtr;
- Namespace *dummy1NsPtr;
- Namespace *dummy2NsPtr;
- const char *dummyNamePtr;
- Tcl_Obj *result = Tcl_NewObj();
-
- TclGetNamespaceForQualName(interp, "::tcl::mathfunc",
- globalNsPtr, TCL_FIND_ONLY_NS | TCL_GLOBAL_ONLY,
- &nsPtr, &dummy1NsPtr, &dummy2NsPtr, &dummyNamePtr);
- if (nsPtr == NULL) {
- return result;
+ Tcl_Obj *script = Tcl_NewStringObj("::info functions ", -1);
+ Tcl_Obj *result;
+ Tcl_InterpState state;
+
+ if (pattern) {
+ Tcl_Obj *patternObj = Tcl_NewStringObj(pattern, -1);
+ Tcl_Obj *arg = Tcl_NewListObj(1, &patternObj);
+
+ Tcl_AppendObjToObj(script, arg);
+ Tcl_DecrRefCount(arg); /* Should tear down patternObj too */
}
- if ((pattern != NULL) && TclMatchIsTrivial(pattern)) {
- if (Tcl_FindHashEntry(&nsPtr->cmdTable, pattern) != NULL) {
- Tcl_ListObjAppendElement(NULL, result,
- Tcl_NewStringObj(pattern, -1));
- }
+ state = Tcl_SaveInterpState(interp, TCL_OK);
+ Tcl_IncrRefCount(script);
+ if (TCL_OK == Tcl_EvalObjEx(interp, script, 0)) {
+ result = Tcl_DuplicateObj(Tcl_GetObjResult(interp));
} else {
- Tcl_HashSearch cmdHashSearch;
- Tcl_HashEntry *cmdHashEntry =
- Tcl_FirstHashEntry(&nsPtr->cmdTable,&cmdHashSearch);
-
- for (; cmdHashEntry != NULL;
- cmdHashEntry = Tcl_NextHashEntry(&cmdHashSearch)) {
- const char *cmdNamePtr =
- Tcl_GetHashKey(&nsPtr->cmdTable, cmdHashEntry);
-
- if (pattern == NULL || Tcl_StringMatch(cmdNamePtr, pattern)) {
- Tcl_ListObjAppendElement(NULL, result,
- Tcl_NewStringObj(cmdNamePtr, -1));
- }
- }
+ result = Tcl_NewObj();
}
+ Tcl_DecrRefCount(script);
+ Tcl_RestoreInterpState(interp, state);
+
return result;
}