///////////////////////////////////////////////////////////////////////////////// private object GetObject(EXPR pExpr) { if (pExpr.isCAST()) { return GetObject(pExpr.asCAST().GetArgument()); } else if (pExpr.isTYPEOF()) { return pExpr.asTYPEOF().SourceType.type.AssociatedSystemType; } else if (pExpr.isMETHODINFO()) { return GetMethodInfoFromExpr(pExpr.asMETHODINFO()); } else if (pExpr.isCONSTANT()) { CONSTVAL val = pExpr.asCONSTANT().Val; CType underlyingType = pExpr.type; object objval; if (pExpr.type.IsNullType()) { return null; } if (pExpr.type.isEnumType()) { underlyingType = underlyingType.getAggregate().GetUnderlyingType(); } switch (underlyingType.AssociatedSystemType.GetTypeCode()) { case TypeCode.Boolean: objval = val.boolVal; break; case TypeCode.SByte: objval = val.sbyteVal; break; case TypeCode.Byte: objval = val.byteVal; break; case TypeCode.Int16: objval = val.shortVal; break; case TypeCode.UInt16: objval = val.ushortVal; break; case TypeCode.Int32: objval = val.iVal; break; case TypeCode.UInt32: objval = val.uiVal; break; case TypeCode.Int64: objval = val.longVal; break; case TypeCode.UInt64: objval = val.ulongVal; break; case TypeCode.Single: objval = val.floatVal; break; case TypeCode.Double: objval = val.doubleVal; break; case TypeCode.Decimal: objval = val.decVal; break; case TypeCode.Char: objval = val.cVal; break; case TypeCode.String: objval = val.strVal; break; default: objval = val.objectVal; break; } if (pExpr.type.isEnumType()) { objval = Enum.ToObject(pExpr.type.AssociatedSystemType, objval); } return objval; } else if (pExpr.isZEROINIT()) { if (pExpr.asZEROINIT().OptionalArgument != null) { return GetObject(pExpr.asZEROINIT().OptionalArgument); } return System.Activator.CreateInstance(pExpr.type.AssociatedSystemType); } Debug.Assert(false, "Invalid EXPR in GetObject"); throw Error.InternalCompilerError(); }