- if (IsIEnumerable (handler.return_type))
- ec.ig.Emit (OpCodes.Newobj, (ConstructorInfo) handler.enumerable_proxy_constructor);
- else
- ec.ig.Emit (OpCodes.Newobj, (ConstructorInfo) handler.enumerator_proxy_constructor);
+ if (is_ienumerable){
+ temp_type = handler.enumerable_proxy_class;
+ ig.Emit (OpCodes.Newobj, (ConstructorInfo) handler.enumerable_proxy_constructor);
+ this_field = handler.enumerable_this_field;
+ } else {
+ temp_type = handler.enumerator_proxy_class;
+ ig.Emit (OpCodes.Newobj, (ConstructorInfo) handler.enumerator_proxy_constructor);
+ this_field = handler.this_field;
+ }
+
+ if (false)
+ return;
+
+ LocalBuilder temp = ec.GetTemporaryLocal (temp_type);
+
+ ig.Emit (OpCodes.Stloc, temp);
+ //
+ // Initialize This
+ //
+ int first = 0;
+ if (this_field != null){
+ ig.Emit (OpCodes.Ldloc, temp);
+ ig.Emit (OpCodes.Ldarg_0);
+ if (handler.container is Struct)
+ ig.Emit (OpCodes.Ldobj, handler.container.TypeBuilder);
+ ig.Emit (OpCodes.Stfld, this_field);
+ first = 1;
+ }
+
+ for (int i = 0; i < handler.parameters.Count; i++){
+ ig.Emit (OpCodes.Ldloc, temp);
+ ParameterReference.EmitLdArg (ig, i + first);
+ if (is_ienumerable)
+ ig.Emit (OpCodes.Stfld, handler.enumerable_parameter_fields [i]);
+ else
+ ig.Emit (OpCodes.Stfld, handler.parameter_fields [i]);
+ }
+
+ //
+ // Initialize fields
+ //
+ ig.Emit (OpCodes.Ldloc, temp);
+ ec.FreeTemporaryLocal (temp, handler.container.TypeBuilder);