don@TUMTUM.CS.UMD.EDU (Don Hopkins) (08/28/89)
Oops, the interpreter did the wrong thing in the case that the
last object in an executable array was another executable array,
in an attempt to be properly tail-recursive.
The function that needs to be fixed is /arraytype, defined in the
iexec-types dictionary. In the case that the array length is 1, it
should call iexec-token instead of PushExec on the element of
the array, since there is a difference between what PostScript does
when it executes an array, and what it does when it encounters an
array during the execution of a containing array.
I found this bug by using the interpreter to trace through itsself.
(It was failing on the nullproc function.)
-Don
/arraytype { % array => ...
dup length dup 0 eq { % array length
pop pop %
} { % array length
1 eq { % array
0 get %
% PushExec % XXX causes tail recursion bug
iexec-token %
} { % array
dup 0 get % array head
% push rest of array to execute later
exch 1 1 index length 1 sub getinterval % head tail
PushExec % head
iexec-token %
} ifelse
} ifelse
} def