Bug #1745
closedVariable stack frame allocation issue - PE 0.5.0.1
100%
Description
In the attached code, the let assignment of $y in svg:join.orthogonal causes ArrayOutOfBounds: "local variable $y uses slot 2 but only 1 slots are allocated on the stack frame". (LocalVariableReference.java:105) at runtime. Changing to svg:join.line() is fine. Both forms run successfully under 9.4.0.7
Files
Updated by Michael Kay over 11 years ago
- Category set to Internals
- Status changed from New to In Progress
- Assignee set to Michael Kay
Interesting - this fails under Saxon-PE 9.5.0.1 but not under Saxon-EE 9.5.0.1. So I tried it with ~~opt:0 under EE, and that fails too. This means the code is OK after applying Saxon-EE optimization, but not OK without it ~~ which is a little unusual!
Updated by Michael Kay over 11 years ago
Even more interesting...
The reason it works when Saxon-EE optimization is in place is that the call to svg:join gets inlined, so none of the following complications arise.
The call to svg:join is treated as a "tail call to a different function", which is implemented by using the same context object with the stack frame overwritten to contain the parameters to the called function (and enough space for its local variables). However, the parameter passed to the called function includes a "Lazy Sequence", that is a data structure that has not yet been fully evaluated, and as it happens the evaluation depends on variable $y, which is held in the stack frame that has just been overwritten. Nasty. In this situation 9.4 would have used a Closure, which maintains a local copy of all the context information on which it depends.
Updated by Michael Kay over 11 years ago
- Status changed from In Progress to Resolved
See bug 1752. I was concerned that this might be a rather deep design problem. But in fact there are a limited number of evaluation strategies for variables and the only one that allows lazy sequences is the "shared append" strategy, used when a variable or parameter is initialized with an expression using comma operators. This has been fixed by making Chain and its component sequences "grounded values" as described under bug 1752, and it is believed that this fixes this problem.
Updated by O'Neil Delpratt over 11 years ago
- Status changed from Resolved to Closed
- % Done changed from 0 to 100
- Found in version changed from 9.5.0.1 to 9.5
- Fixed in version set to 9.5.0.2
Please register to edit this issue