summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2012-11-16 15:35:22 (GMT)
committerdgp <dgp@users.sourceforge.net>2012-11-16 15:35:22 (GMT)
commit758a0f5c2e969817509e566bad7546a9d9c66a49 (patch)
tree722371c376c77a67d407c22ccea5c8b8aba2d75a
parente0ad3b3ebfef863621c1cdd5ca28546b9a4caea3 (diff)
downloadtcl-758a0f5c2e969817509e566bad7546a9d9c66a49.zip
tcl-758a0f5c2e969817509e566bad7546a9d9c66a49.tar.gz
tcl-758a0f5c2e969817509e566bad7546a9d9c66a49.tar.bz2
3587651 fix [info functions] (Re-implementation in Tcl)
-rw-r--r--generic/tclCmdIL.c39
-rw-r--r--tests/cmdIL.test10
2 files changed, 41 insertions, 8 deletions
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c
index af7fe60..152e61d 100644
--- a/generic/tclCmdIL.c
+++ b/generic/tclCmdIL.c
@@ -1338,19 +1338,42 @@ InfoFunctionsCmd(
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
- char *pattern;
+ Tcl_Obj *script;
+ int code;
- if (objc == 1) {
- pattern = NULL;
- } else if (objc == 2) {
- pattern = TclGetString(objv[1]);
- } else {
+ if (objc > 2) {
Tcl_WrongNumArgs(interp, 1, objv, "?pattern?");
return TCL_ERROR;
}
- Tcl_SetObjResult(interp, Tcl_ListMathFuncs(interp, pattern));
- return TCL_OK;
+ script = Tcl_NewStringObj(
+" ::apply [::list {{pattern *}} {\n"
+" ::set cmds {}\n"
+" ::foreach cmd [::info commands ::tcl::mathfunc::$pattern] {\n"
+" ::lappend cmds [::namespace tail $cmd]\n"
+" }\n"
+" ::foreach cmd [::info commands tcl::mathfunc::$pattern] {\n"
+" ::set cmd [::namespace tail $cmd]\n"
+" ::if {$cmd ni $cmds} {\n"
+" ::lappend cmds $cmd\n"
+" }\n"
+" }\n"
+" ::return $cmds\n"
+" } [::namespace current]] ", -1);
+
+ if (objc == 2) {
+ Tcl_Obj *arg = Tcl_NewListObj(1, &(objv[1]));
+
+ Tcl_AppendObjToObj(script, arg);
+ Tcl_DecrRefCount(arg);
+ }
+
+ Tcl_IncrRefCount(script);
+ code = Tcl_EvalObjEx(interp, script, 0);
+
+ Tcl_DecrRefCount(script);
+
+ return code;
}
/*
diff --git a/tests/cmdIL.test b/tests/cmdIL.test
index aed4264..b387e71 100644
--- a/tests/cmdIL.test
+++ b/tests/cmdIL.test
@@ -769,6 +769,16 @@ test cmdIL-7.8 {lreverse command - shared intrep [Bug 1675044]} -setup {
rename K {}
} -result 1
+# This belongs in info test, but adding tests there breaks tests
+# that compute source file line numbers.
+test info-20.6 {Bug 3587651} -setup {
+ namespace eval my {namespace eval tcl {namespace eval mathfunc {
+ proc demo x {return 42}
+ }}}} -body { namespace eval my {expr {"demo" in [info functions]}}} -cleanup {
+ namespace delete my
+} -result 1
+
+
# cleanup
::tcltest::cleanupTests
return