The JE spends a lot of time twiddling usecounts and I am trying to understand why.

One especially perplexing case is in jtbox(), which handles (<y). This short program does not do PROLOG/EPILOG. In the case of boxing with infinite rank, the code GA()s the result, Performs rat(w) on the input, stores w into the result, and returns.

rat(w)???  Why?

rat(w) is   {ra(w); tpush(w)}

But there's no EPILOG. Adding one to the usecount followed by later taking the 1 away at tpop() time isn't going to change when w is freed. Why the rat()?

That's my question.

My guess is that AC(w)>1 is used as a flag into the partitioning adverbs. Those adverbs seem to check to see whether AC(w) has become > 1, and if so, they avoid reusing the same buffer area. The rat() here means 'the result contains a reference to the input & the input must therefore not be reused.'

Acting on that guess, I changed jtbox to use rat1() instead of rat(), with rat1() defined to twiddle the top-level usecount only. All testcases passed with this change.

But you don't test programs to correctness, you analyze them to correctness. That's tough with something as large as the JE. Does anyone know of a DIFFERENT reason for the use of rat() in these and similar verbs?

Henry
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to