示例#1
0
        public override bool Equals(object o)
        {
            if (GetType() != o.GetType())
            {
                return(false);
            }
            PointerToUnboxedValue ptr = o as PointerToUnboxedValue;

            return(obj == ptr.obj);
        }
示例#2
0
        /* Performs object creation
         * (corresponds to CILPE.CFG.CreateObject class)
         */
        public ParameterValues Perform_CreateObject(ConstructorInfo ctor)
        {
            Type type = ctor.DeclaringType;

            int count = ParameterValues.GetParametersNumber(ctor);

            Value[] values = new Value[count];
            for (int i = 0; i < count - 1; i++)
            {
                values[count - 1 - i] = Pop();
            }

            object obj;

            if (type.IsArray)
            {
                Type  elementType = type.GetElementType();
                int   rank        = type.GetArrayRank();
                int[] lengths     = new int[rank];
                for (int i = 0; i < rank; i++)
                {
                    lengths[i] = (int)((values[i + 1] as StructValue).Obj);
                }

                obj = Array.CreateInstance(elementType, lengths);
            }
            else
            {
                obj = FormatterServices.GetUninitializedObject(type);
            }

            Value resultValue = null;

            if (type.IsValueType)
            {
                resultValue = new StructValue(obj as ValueType);
                values[0]   = new PointerToUnboxedValue(obj);
            }
            else
            {
                values[0] = resultValue = new ObjectReferenceValue(obj);
            }

            push(resultValue);

            return(new ParameterValues(ctor, values));
        }