@matheusbsbs / matheus-bagliano / commits / 3891a84ccd
Fork 0

git-gui: create a new namespace for chord script evaluation

Evaluating the script in the same namespace as the chord itself creates potential for variable name collision. And in that case the script would unknowingly use the chord's variables. For example, say the script has a variable called 'is_completed', which also exists in the chord's namespace. The script then calls 'eval' and sets 'is_completed' to 1 thinking it is setting its own variable, completely unaware of how the chord works behind the scenes. This leads to the chord never actually executing because it sees 'is_completed' as true and thinks it has already completed. Avoid the potential collision by creating a separate namespace for the script that is a child of the chord's namespace. Signed-off-by: Pratyush Yadav <me@yadavpratyush.com>

Pratyush Yadav committed Mar 15, 2020 at 03:08 UTC 3891a84ccdad249c426c3e036d4fb086c388b4ce
1 file changed +4 -2
lib/chord.tcl
+4 -2
@@ -64,6 +64,7 @@ class SimpleChord {
64 field notes
65 field body
66 field is_completed
67 + field eval_ns
68
69 # Constructor:
70 # set chord [SimpleChord::new {body}]
@@ -74,6 +75,7 @@ class SimpleChord {
75 set notes [list]
76 set body $i_body
77 set is_completed 0
78 + set eval_ns "[namespace qualifiers $this]::eval"
79 return $this
80 }
81
@@ -83,7 +85,7 @@ class SimpleChord {
85 # the chord body will be evaluated. This can be used to set variable
86 # values for the chord body to use.
87 method eval {script} {
86 - namespace eval [namespace qualifiers $this] $script
88 + namespace eval $eval_ns $script
89 }
90
91 # Method:
@@ -111,7 +113,7 @@ class SimpleChord {
113
114 set is_completed 1
115
114 - namespace eval [namespace qualifiers $this] $body
116 + namespace eval $eval_ns $body
117 delete_this
118 }
119 }