Example #1
0
        public override void Generate(EmitExpContext context)
        {
            ILGenerator il = context.ILout;

            if (newCode == 1)
            {
                var          Constructor = ConstructorDesc.Constructor;
                LocalBuilder varLocal    = il.DeclareLocal(SubjectGCL.ForType);
                EmitHelper.NewObj(il, Constructor);
                il.Emit(OpCodes.Stloc, varLocal);

                MethodInfo   addMethod       = SubjectGCL.ForType.GetMethod("Add");
                ExMethodInfo exAddMethodInfo = GclUtil.CreatExMethodInfo(addMethod, SubjectGCL.ForType);
                if (BrackestArgs != null)
                {
                    foreach (var exp in BrackestArgs.InneExps)
                    {
                        EmitHelper.LoadVar(il, varLocal);//il.Emit(OpCodes.Ldloc, varLocal);
                        (exp).Generate(context);
                        EmitHelper.CallDynamic(il, exAddMethodInfo);
                    }
                }
                EmitHelper.LoadVar(il, varLocal);//il.Emit(OpCodes.Ldloc, varLocal);
            }
            else if (newCode == 2)
            {
                var Constructor = ConstructorDesc.Constructor;
                if (!IsAssignedValue)
                {
                    LocalBuilder varLocal = il.DeclareLocal(SubjectGCL.ForType);
                    emitConstructor(context);//emitArgs(context);
                    EmitHelper.NewObj(il, Constructor);
                    il.Emit(OpCodes.Stloc, varLocal);
                    EmitHelper.LoadVar(il, varLocal);//il.Emit(OpCodes.Ldloc, varLocal);
                }
                else
                {
                    emitConstructor(context);//emitArgs(context);
                    EmitHelper.NewObj(il, Constructor);
                }
            }
            else
            {
                var Method = ProcDesc.ExMethod;
                emitProc(context);
                EmitHelper.CallDynamic(il, Method);
            }
            base.GenerateConv(context);
        }