+
+ EmitContext ec = new EmitContext (tc, null, UnderlyingType, ModFlags);
+
+ object default_value = 0;
+
+ FieldAttributes attr = FieldAttributes.Public | FieldAttributes.Static
+ | FieldAttributes.Literal;
+
+
+ foreach (string name in ordered_enums) {
+ Expression e = this [name];
+ Location loc = (Location) member_to_location [name];
+
+ if (e != null) {
+ e = Expression.Reduce (ec, e);
+
+ if (IsValidEnumLiteral (e)) {
+ Literal l = (Literal) e;
+ default_value = l.GetValue ();
+
+ if (default_value == null) {
+ error31 (l, loc);
+ return;
+ }
+
+ } else {
+ Report.Error (1008, loc,
+ "Type byte, sbyte, short, ushort, int, uint, long, or ulong expected");
+ return;
+ }
+ }
+
+ FieldBuilder fb = EnumBuilder.DefineField (name, UnderlyingType, attr);
+
+ if (default_value == null) {
+ Report.Error (543, loc, "Enumerator value for '" + name + "' is too large to " +
+ "fit in its type");
+ return;
+ }
+
+ try {
+ default_value = Convert.ChangeType (default_value, UnderlyingType);
+ } catch {
+ error31 ((Literal) e, loc);
+ return;
+ }
+
+ fb.SetConstant (default_value);
+ field_builders.Add (fb);
+
+ if (!TypeManager.RegisterField (fb, default_value))
+ return;
+
+ default_value = GetNextDefaultValue (default_value);
+ }
+
+ if (OptAttributes == null)
+ return;
+
+ if (OptAttributes.AttributeSections == null)
+ return;
+
+ foreach (AttributeSection asec in OptAttributes.AttributeSections) {
+ if (asec.Attributes == null)
+ continue;
+
+ foreach (Attribute a in asec.Attributes) {
+ CustomAttributeBuilder cb = a.Resolve (ec);
+
+ if (cb == null)
+ continue;
+
+ EnumBuilder.SetCustomAttribute (cb);
+ }
+ }
+ }
+
+ //
+ // Hack around System.Reflection as found everywhere else
+ //
+ public MemberInfo [] FindMembers (MemberTypes mt, BindingFlags bf, MemberFilter filter, object criteria)
+ {
+ ArrayList members = new ArrayList ();
+
+ if ((mt & MemberTypes.Field) != 0) {
+ foreach (FieldBuilder fb in field_builders)
+ if (filter (fb, criteria) == true)
+ members.Add (fb);
+ }
+
+ int count = members.Count;
+
+ if (count > 0) {
+ MemberInfo [] mi = new MemberInfo [count];
+ members.CopyTo (mi, 0);
+ return mi;
+ }
+
+ return null;