June 16, 2009
Closures and Sequence Points
Immersing myself in the functional intricacies implied by the C# 3.0 extensions has led to a couple of interesting tests. Thought I'd share it for it's amusement value:
The first one comes from the wikipedia discussion of a "Sequence points":
[Test]
public void ThisIsNotIntuitive()
{
int i = 0;
i = i++;
Assert.That(i, Is.EqualTo(0));
}
This behavior is apparently undefined in C and C++ (It may be in C# too, dunno).
The second one is taking this a step further and incorporates a closure to show how really evil doing this sort of thing is:
[Test]
public void NeitherIsThis()
{
int i = 0;
Predicate<int> f = (x) => x != i;
Assert.That(f(i++), Is.True);
}
Since there is a sequence point before function code is entered (again at least in C/C++) then at first glance, one might assume the test should assert IsFalse, but no - because i's value is placed into x *then* incremented, then the function body is entered so that by the time the evaluation occurs the numbers don't match.
This is visible in the disassembly of the expression call (I pulled it to a separate line). ebp-48h is "i" and ebp-4Ch is "x" (as an aside: notice how the value stuffed into "x" is retrieved and incremented and then mov'd to "i" rather than getting it from "i" in the first place. Works, but weird):
bool result = f(i++);
0000008d mov eax,dword ptr [ebp-48h]
00000090 mov eax,dword ptr [eax+4]
00000093 mov dword ptr [ebp-4Ch],eax
00000096 mov eax,dword ptr [ebp-4Ch]
00000099 inc eax
0000009a mov edx,dword ptr [ebp-48h]
0000009d mov dword ptr [edx+4],eax
000000a0 mov edx,dword ptr [ebp-4Ch]
000000a3 mov ecx,dword ptr [ebp-40h]
000000a6 mov eax,dword ptr [ecx+0Ch]
000000a9 mov ecx,dword ptr [ecx+4]
000000ac call eax
In addition to the two links above, this guy has more on this subject including (the hopefully unnecessary) "don't do this in your code."
Posted by wcaputo at June 16, 2009 12:14 AMThe Death of Agile (November 2, 2009)
Gifts Instead of Certs (October 26, 2009)
Continuation Passing Style (June 16, 2009)
Closures and Sequence Points (June 16, 2009)
Is This Thing Still On? (June 14, 2009)
Business and IT converging? (July 15, 2006)
Applying Technology is not Technology (July 5, 2006)
Knowledge Nodes (April 2, 2006)
How to Start an Interplanetary War (February 14, 2006)
(All Entries...)