



Inform 6.20 doesn't compile old-style objectloops correctly in
non-strict mode. Consider the following example program: Inform 6.20 will compile the following Main() function in non-strict
mode: My knowledge of Z-code is rather shaky, but this will cause a stack
underflow. Inform 6.15, correctly I think, compiles it to: Compile in strict mode. As an alternative, you could try making the following modification to
the Inform source code. It's mostly guesswork, but apart from the
strict error checking not much has changed here so I figured it would
be enough to make it behave as Inform 6.15 did, and this just might do
that. In states.c, at line 1024, you should find this: This "if" statement doesn't have an "else" clause, so find the
matching } (about 20 lines down) and add one like this:
About Patches
Issue C62001
Objectloops handled wrong
Submitted by: Torbjörn Andersson
Appeared in: Compiler 6.20
Fixed in: Compiler 6.21
Problem
Object A;
Object -> B;
Object -> C;
Object -> D;
[ Main o;
objectloop (o in A) {
}
];
Routine r0002, 1 local
get_child "(A)" -> sp ~l0001
l0001: pull local0
jz local0 l0003
l0002: get_sibling sp -> local0 ?l0002
l0003: rtrue
Routine r0002, 1 local
get_child "(A)" -> sp ~l0001
l0001: pull local0
jz local0 l0003
l0002: get_sibling local0 -> local0 ?l0002
l0003: rtrue
Solution
if (runtime_error_checking_switch)
{ AO2 = check_nonzero_at_runtime(AO, ln2,
OBJECTLOOP2_RTE);
} else
AO2 = AO;
Last updated 2 May 2008. The librarian in charge of this page is Roger Firth. Please email any comments, suggestions or corrections to roger@firthworks.com.