Ok, many thanks to all Wolfgang i suggest you to explain this LRESPR's "limit" in the next version of the SMSQ/E manual.
Giorgio 2017-02-23 6:19 GMT+01:00 Wolf <w...@wlenerz.com>: > Hi, > > Even if never fixed, any chance you could share what you found as the >> cause? >> >> > Sure thing. > > This is how I see the error arises: > > First > When you call the vector to initialise new keywords, the corresponding > routine (at label "sb_inipr" in smsq_sbas_inipr_asm) allocates new memory > for the new name table and much other information, shuffles the content of > the old into the new, de-allocates the old and does quite some more > shuffling/updating pointers. > > Second > Whenever one is in a procedure, at the end of the procedure, you come to > label "bo_return" (in the file smsq_sbas_iprocb_asm). Following the flow of > that you will arrive at the following code: > > bor_lvlend > cmp.l d4,d5 ; bottom of locals yet? > bgt.s bor_lvloop ; ... no > > move.l rt_def(a6,a2.l),d0 > neg.l d0 ; address of definition > > Unfortunately, the address D0 now points to (which is then copied into A4 > and used later) is now wrong. It still seems to point into some of the old > memory that was deallocated. > > Now, with a bit of luck, the content of that memory hasn't been re-used > between the call to sb_inipr and this point in the code, so that the > program can continue normally. If not, you will most likely get > into a heap error later: > > After the above code, just before you get to the loop at label > "bor_fploop", the adress in A4 is used to get the number of parameters to > treat. This is most likely wrong, so the loop counter for the loop is (in > the case I observed) much bigger than what it should have been (note this > could also have happened at label "bor_swloop" a bit earlier on). In the > loop at label "bor_fploop" there most likely will be a cbra to label > "bor_fpex" to clear the (local) variables used in the procedure via the > subroutine at label "bor_clrval". > > This leads to label "sb_redat" (in smsq_sbas_aldat_asm) from there to > "sad_rlx". This tries to release momory taken up by the (local) variables > and, since one does that more often that is should have been, may lead to a > heap error at label "sad_error": > sad_error > dc.l $4afbedeb > bra.s sad_error > dc.w 'HEAP' > which will cause the program to hang. > > Releasing mem that shouldn't have been could also lead to other > interesting errors... > > Coming back to the initial error: > > bor_lvlend > cmp.l d4,d5 ; bottom of locals yet? > bgt.s bor_lvloop ; ... no > > move.l rt_def(a6,a2.l),d0 > neg.l d0 ; address of definition > > Interestingly, the area pointed to by (A6,A2) was indeed copied from the > old mem to the new - unfortunately, the pointer at rt_def(a6,a2.l) within > that was not updated. > Finding out where that pointer originally pointed to and then trying to > set it to the corresponding new memory location does not seem trivial to > me, and the risk of breaking the entire program just seems too great to me. > I'd love to be proved wrong... > > Have fun > > Wolfgang > > _______________________________________________ > QL-Users Mailing List > _______________________________________________ QL-Users Mailing List