trace(1) bug

new topic     » topic index » view thread      » older message » newer message

Using Eu 3.1 official:
with trace
trace(1)
for i=1 to 3 do
?i
end for
for i=1 to 2 do
?i
end for
integer i i=5
?0


Step into program until in second loop. The current value of i is displayed
correctly.
Then enter "?i": the correct value is erased, and "i=3" is incorrectly
displayed, at a different screen location.
Keep stepping forward to the second last statement, and enter "?i" again. You'll
get "i=3" displayed, instead of the expected "not defined at this point" message.
This will happen whether you performed the first "?i" or not.
Press enter to last stateĆ¹ment and do "?i" again. You'll get "i=3" instead of
"i=5".

Reason: the logic of RTLookup() in be_symtab.c wrongly assumes that it should
return the first maching top level loop index, while several with the same name
are likely to be defined. And it has no idea whether an SC_GLOOP_VAR var is in
scope at the current trace location, or that a local var may override loop
indexes.

Tentative fix: 
1/ keep track of the last matching variable in file instead of returning on
first found. When <var>stop</var> is reached, if any was found, then return it.
2/ to fix the middle problem ("i=3" instead of "not defined"), the ENDFOR_*
opcodes should set the loop var to NOVALUE, which never happens during its
observable life span. The "not defined" message could be displayed then for loop
indexes, and "<no value>" for other vars that just didn't get a value yet.
3/ apply same strategy for private symbols, but you can return when a SC_PRIVATE
is found. Otherwise return last defined index instead of first.

I don't have a C compiler at work; I'll try to submit a tested fix ASAP.

CChris

new topic     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu