[rdnzl-devel] Rdnzl Problem
Iver Odin Kvello
iverodin at gmail.com
Thu Feb 14 08:51:07 UTC 2008
On Thu, Feb 14, 2008 at 9:15 AM, Edi Weitz <edi at agharta.de> wrote:
> On Wed, 13 Feb 2008 21:49:55 +0100, "Iver Odin Kvello" <iverodin at gmail.com> wrote:
>
> > I tried to muck around with this myself, and discovered the
> > Unbox_Any opcode, present from version 2.0 of the framework; and
> > this also seems to work (see attached patch).
>
> Cool, thanks. Just checking - the IsValueType condition is the
> correct one?
I think so, but I don't understand this material thoroughly.
http://msdn2.microsoft.com/en-us/library/system.reflection.emit.opcodes.unbox_any.aspx
says that:
When applied to the boxed form of a value type, the unbox.any
instruction extracts the value contained within obj (of type O),
and is therefore equivalent to unbox followed by ldobj.
When applied to a reference type, the unbox.any instruction has the
same effect as castclass typeTok.
But we know it will be a value-type.
For ldobj (which is actually present from version 1.0 I see now) the docs say:
The ldobj instruction copies the value pointed to by addrOfValObj
(of type &, *, or native int) to the top of the stack.
The number of bytes copied depends on the size of the class (as
specified by the class parameter). The class parameter is a metadata
token representing the value type.
So given that the ld-operation to use only depends on the returnType,
it seems to me that it should work. Here are my tests
(with the "generic"-thing that I didn't submit a patch for) showing
returns of both IsValueType-types and a String:
RDNZL-USER(60): (setf f1 (new (generic "Func" "Int32" "Int32") #'1+))
#<RDNZL::CONTAINER System.Func`2[[System.Int32, mscorlib,
Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
#xdd69738>
RDNZL-USER(61): (setf f2 (new (generic "Func" "Int32" "Single")
(lambda (x) (coerce x 'single-float))))
#<RDNZL::CONTAINER System.Func`2[[System.Int32, mscorlib,
Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089],[System.Single, mscorlib,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
#xdd69e68>
RDNZL-USER(62): (setf f3 (new (generic "Func" "Int32" "Double")
(lambda (x) (* 1.0 x))))
#<RDNZL::CONTAINER System.Func`2[[System.Int32, mscorlib,
Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089],[System.Double, mscorlib,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
#xdd6a378>
RDNZL-USER(63): (setf f4 (new (generic "Func" "Int32" "String")
(lambda (x) (format nil "~@r" x))))
#<RDNZL::CONTAINER System.Func`2[[System.Int32, mscorlib,
Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089],[System.String, mscorlib,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
#xdd6a888>
RDNZL-USER(64): (property (invoke "System.Type" "GetType"
"System.String") "IsValueType")
NIL
RDNZL-USER(65): (property (invoke "System.Type" "GetType"
"System.Single") "IsValueType")
T
RDNZL-USER(66): (invoke f1 "Invoke" 5)
6
RDNZL-USER(67): (invoke f2 "Invoke" 5)
5.0
RDNZL-USER(68): (invoke f3 "Invoke" 5)
5.0
RDNZL-USER(69): (invoke f4 "Invoke" 5)
"V"
Regards,
Iver
More information about the rdnzl-devel
mailing list