public override bool Equals(object o) { if (GetType() != o.GetType()) { return(false); } PointerToUnboxedValue ptr = o as PointerToUnboxedValue; return(obj == ptr.obj); }
/* 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)); }