Ticket UUID: | 1037357 | |||
Title: | Speedup for [uplevel] and [upvar] | |||
Type: | Patch | Version: | None | |
Submitter: | dkf | Created on: | 2004-09-29 22:59:22 | |
Subsystem: | 22. [proc] and [uplevel] | Assigned To: | dkf | |
Priority: | 5 Medium | Severity: | ||
Status: | Closed | Last Modified: | 2004-10-01 19:46:02 | |
Resolution: | Accepted | Closed By: | dkf | |
Closed on: | 2004-10-01 12:46:02 | |||
Description: |
This patch speeds up [uplevel] and [upvar] by caching the result of parsing the string form of the level indicator in the Tcl_Obj argument instead of always working with the string form for everything. | |||
User Comments: |
dkf added on 2004-10-01 19:46:02:
Logged In: YES user_id=79902 Applied to HEAD dgp added on 2004-09-30 22:52:03: Logged In: YES user_id=80530 revised patch tests ok. dkf added on 2004-09-30 22:37:12: File Deleted - 103249: dkf added on 2004-09-30 22:36:52: File Added - 103339: 1037357_2.patch dkf added on 2004-09-30 22:36:51: Logged In: YES user_id=79902 Here's a version that shouldn't have problems with shimmering all over the place. Causes no new test failures. No idea (formally) what happens in tclbench, but looks good in informal trials. ;^) dkf added on 2004-09-30 15:13:51: Logged In: YES user_id=79902 Thanks for the review; I'll have to write a new version that is aware of numeric types and avoids the conversion in those situations. I suspected I needed to do this anyway ;^) dgp added on 2004-09-30 09:31:12: Logged In: YES user_id=80530 This patch should be checked against tclbench. I suspect that whatever is being saved by repeated use of $level by multiple [uplevel]s and [upvar]s is more than being lost by the greatly increased shimmering of the literal constant "1" in so many logical expressions. `make test` sure feels a lot slower anyway. dgp added on 2004-09-30 08:48:33: Logged In: YES user_id=80530 Root of the problem appears to be line 1965 of tcltest.tcl where the literal "1" appears twice. First as the "level" argument to [uplevel] and second as an argument in the command to be evaluated up a level. Something isn't shimmering right, I'd suspect. As a check, if I remove the second "1" from that line (and accept the default value of that argument, which is 1), then the problem goes away. dgp added on 2004-09-30 08:10:58: Logged In: YES user_id=80530 something about the patch breaks tcltest: dict.test Test file error: can't rename "::tcltest::Replace::Puts": command doesn't exist while executing "rename [namespace current]::Replace::Puts ::puts" (procedure "::tcltest::Eval" line 16) invoked from within "::tcltest::Eval {::tcltest::RunTest dict-18.2 {# Test that the dictionary is a valid list set d [dict create "abc def" 0 "a\{b" 1 "c\}d" 2] ..." ("uplevel" body line 1) invoked from within "uplevel 1 [list [namespace origin Eval] $command 1]" (procedure "test" line 126) invoked from within "test dict-18.2 {dict-list relationship} { -body { # Test that the dictionary is a valid list set d [dict create "abc def" 0 "a\{b"..." (file "/local/src/tcl/tests/dict.test" line 726) dgp added on 2004-09-30 07:15:49: File Deleted - 103256: File Added - 103261: 1037357.patch Logged In: YES user_id=80530 updated patch takes care of comments and allows `make genstubs` to succeed. dgp added on 2004-09-30 06:47:46: Logged In: YES user_id=80530 The comments in Tcl*GetFrame say "modify the interpreter", but neither routine actually does that. dgp added on 2004-09-30 06:42:13: File Added - 103256: 1037357.patch Logged In: YES user_id=80530 corrected patch applies and compiles. dkf added on 2004-09-30 05:59:22: File Added - 103249: objup.diff |