Hey guys,
I thought about writing a language for the sake of writing a language, and now that I'm done with the parser and the AST, I have to do something about the library. Specifically, basic types.
I'm going to use a very basic intermediate representation before I pass that down to LLVM and get native code that way. Though, since my internal representation is extremely basic, it does not support any way to define an int
in itself; so the type somehow has to "break through the Matrix" and exist on a lower-level than the other non-primitive types.
This is not the object of my question. Feel free to comment, but that's not what it's about.
The real thing is that, in the process of trying to see how others did it, a friend of mine reflected the System.Int32
class from the .NET Framework (on my end I tried with Mono, and it does the same thing). And it found that it contains a single field:
System.Int32 m_value;
And I don't even see how that's possible.
This int
really is the "backing integer" of the one you have: if you box an int
and use reflection to change the value of its m_value
field, you effectively change the value of the integer:
object testInt = 4;
Console.WriteLine(testInt); // yields 4
typeof(System.Int32)
.GetField("m_value", BindingFlags.NonPublic | BindingFlags.Instance)
.SetValue(testInt, 5);
Console.WriteLine(testInt); // yields 5
There's gotta be a rational explanation behind this singularity. How can a value type contain itself? It simply makes no sense. And it's not just there to look good: changing the internal value for another System.Int32
works. What magic does the CLR use to make it work?
My world just collapsed.