1 // Copyright 2004-2008 Castle Project - http://www.castleproject.org/
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
15 namespace Castle
.DynamicProxy
.Builder
.CodeBuilder
.SimpleAST
18 using System
.Reflection
.Emit
;
19 using Castle
.DynamicProxy
.Builder
.CodeBuilder
.Utils
;
22 /// Summary description for ReferencesToObjectArrayExpression.
25 public class ReferencesToObjectArrayExpression
: Expression
27 private TypeReference
[] _args
;
29 public ReferencesToObjectArrayExpression( params TypeReference
[] args
)
34 public override void Emit(IEasyMember member
, ILGenerator gen
)
36 LocalBuilder local
= gen
.DeclareLocal( typeof(object[]) );
37 gen
.Emit(OpCodes
.Ldc_I4
, _args
.Length
);
38 gen
.Emit(OpCodes
.Newarr
, typeof(object));
39 gen
.Emit(OpCodes
.Stloc
, local
);
41 for(int i
=0; i
< _args
.Length
; i
++)
43 gen
.Emit(OpCodes
.Ldloc
, local
);
44 gen
.Emit(OpCodes
.Ldc_I4
, i
);
46 TypeReference reference
= _args
[i
];
48 ArgumentsUtil
.EmitLoadOwnerAndReference(reference
, gen
);
50 if (reference
.Type
.IsByRef
)
52 throw new NotSupportedException();
55 if (reference
.Type
.IsValueType
)
57 gen
.Emit(OpCodes
.Box
, reference
.Type
.UnderlyingSystemType
);
60 gen
.Emit(OpCodes
.Stelem_Ref
);
63 gen
.Emit(OpCodes
.Ldloc
, local
);