2 // Mono.ILASM.ModifiableType
5 // Jackson Harper (Jackson@LatitudeGeo.com)
7 // (C) 2003 Jackson Harper (Jackson@LatitudeGeo.com)
12 using System.Collections;
14 namespace Mono.ILASM {
16 public abstract class ModifiableType {
18 private ArrayList conversion_list;
19 private bool is_pinned;
21 private bool is_array;
22 private bool use_type_spec;
24 private enum ConversionMethod {
32 public ModifiableType ()
34 conversion_list = new ArrayList (5);
37 public abstract string SigMod {
42 protected ArrayList ConversionList {
43 get { return conversion_list; }
44 set { conversion_list = value; }
47 public bool IsPinned {
48 get { return is_pinned; }
52 get { return is_array; }
56 get { return is_ref; }
59 public bool UseTypeSpec {
60 get { return use_type_spec; }
63 public void MakeArray ()
66 conversion_list.Add (ConversionMethod.MakeArray);
71 public void MakeBoundArray (ArrayList bounds)
74 conversion_list.Add (ConversionMethod.MakeBoundArray);
75 conversion_list.Add (bounds);
78 for (int i=0; i<bounds.Count; i++) {
79 DictionaryEntry e = (DictionaryEntry) bounds [i];
80 if (e.Key != TypeRef.Ellipsis)
83 if (e.Value != TypeRef.Ellipsis)
85 if (i + 1 < bounds.Count)
91 public void MakeManagedPointer ()
94 conversion_list.Add (ConversionMethod.MakeManagedPointer);
99 public void MakeUnmanagedPointer ()
101 use_type_spec = true;
102 conversion_list.Add (ConversionMethod.MakeUnmanagedPointer);
106 public void MakeCustomModified (CodeGen code_gen, PEAPI.CustomModifier modifier,
109 use_type_spec = true;
110 conversion_list.Add (ConversionMethod.MakeCustomModified);
111 conversion_list.Add (modifier);
112 conversion_list.Add (klass);
115 public void MakePinned ()
117 use_type_spec = true;
121 protected PEAPI.Type Modify (CodeGen code_gen, PEAPI.Type type)
123 PeapiTypeRef peapi_type = new PeapiTypeRef (type);
124 int count = conversion_list.Count;
125 for (int i=0; i<count; i++) {
126 switch ((ConversionMethod) conversion_list[i]) {
127 case ConversionMethod.MakeArray:
128 peapi_type.MakeArray ();
130 case ConversionMethod.MakeBoundArray:
131 peapi_type.MakeBoundArray ((ArrayList) conversion_list[++i]);
133 case ConversionMethod.MakeManagedPointer:
134 peapi_type.MakeManagedPointer ();
136 case ConversionMethod.MakeUnmanagedPointer:
137 peapi_type.MakeUnmanagedPointer ();
139 case ConversionMethod.MakeCustomModified:
140 peapi_type.MakeCustomModified (code_gen, (PEAPI.CustomModifier) conversion_list[++i],
141 (IClassRef) conversion_list[++i]);
147 return peapi_type.PeapiType;