public override void Open()
            {
                var item = Owner._evalStack.Peek();

                StackAssert.AreEqual(item, new StackItem(item.Type, LoadOptions.Default));

                _targetDisposeMethod = UsingTarget.Type.GetBestCallableOverride(_disposeMethod);

                UsingTarget = Owner.Declare(item.Type);
                Owner.Store(UsingTarget);

                base.Open();

                Owner._writer.BeginTry();
            }
Exemplo n.º 2
0
        /// <summary>
        /// <para>开始创建新的数组</para>
        /// <para>请在此方法时候,调用加载数组长度的方法,例如:</para>
        /// <code>
        /// g.BeginNewArray(_elementType);
        ///	{
        ///		g.Load(count);
        ///	}
        ///	g.EndNewArray();
        /// </code>
        /// </summary>
        /// <param name="elementType">数组的成员类型</param>
        /// <param name="rank">维数</param>
        private void BeginNewArray(Type elementType, int rank)
        {
            if (elementType == null)
            {
                throw new ArgumentNullException("elementType");
            }
            if (rank < 1)
            {
                throw new ArgumentOutOfRangeException("rank", "数组维度不能小于1");
            }

            var arrayType = rank == 1 ? elementType.MakeArrayType() : elementType.MakeArrayType(rank);

            _delayedInstructions.Push(() =>
            {
                for (int i = 0; i < rank; ++i)
                {
                    StackAssert.AreEqual(_evalStack.Pop(), typeof(int));
                }

                if (rank == 1)
                {
                    //创建一维数组
                    //将对新的从零开始的一维数组(其元素属于特定类型)的对象引用推送到计算堆栈上
                    _writer.Emit(OpCodes.Newarr, elementType);
                }
                else
                {
                    var paramTypes = new Type[rank];
                    for (int i = 0; i < paramTypes.Length; ++i)
                    {
                        paramTypes[i] = typeof(int);
                    }
                    //创建多维数组
                    //利用多维数组的构造函数,创建多维数组对象
                    _writer.Emit(OpCodes.Newobj, arrayType.GetConstructor(paramTypes));
                }
                _evalStack.Push(arrayType);
            });
        }