diff options
author | dgp <dgp@users.sourceforge.net> | 2012-11-16 15:35:22 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2012-11-16 15:35:22 (GMT) |
commit | 758a0f5c2e969817509e566bad7546a9d9c66a49 (patch) | |
tree | 722371c376c77a67d407c22ccea5c8b8aba2d75a | |
parent | e0ad3b3ebfef863621c1cdd5ca28546b9a4caea3 (diff) | |
download | tcl-758a0f5c2e969817509e566bad7546a9d9c66a49.zip tcl-758a0f5c2e969817509e566bad7546a9d9c66a49.tar.gz tcl-758a0f5c2e969817509e566bad7546a9d9c66a49.tar.bz2 |
3587651 fix [info functions] (Re-implementation in Tcl)
-rw-r--r-- | generic/tclCmdIL.c | 39 | ||||
-rw-r--r-- | tests/cmdIL.test | 10 |
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 |