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
);
114 if (modifier
== PEAPI
.CustomModifier
.modreq
)
115 SigMod
+= ("modreq (" + klass
.FullName
+ ")");
116 else if (modifier
== PEAPI
.CustomModifier
.modopt
)
117 SigMod
+= ("modopt (" + klass
.FullName
+ ")");
120 public void MakePinned ()
122 use_type_spec
= true;
126 protected PEAPI
.Type
Modify (CodeGen code_gen
, PEAPI
.Type type
)
128 PeapiTypeRef peapi_type
= new PeapiTypeRef (type
);
129 int count
= conversion_list
.Count
;
130 for (int i
=0; i
<count
; i
++) {
131 switch ((ConversionMethod
) conversion_list
[i
]) {
132 case ConversionMethod
.MakeArray
:
133 peapi_type
.MakeArray ();
135 case ConversionMethod
.MakeBoundArray
:
136 peapi_type
.MakeBoundArray ((ArrayList
) conversion_list
[++i
]);
138 case ConversionMethod
.MakeManagedPointer
:
139 peapi_type
.MakeManagedPointer ();
141 case ConversionMethod
.MakeUnmanagedPointer
:
142 peapi_type
.MakeUnmanagedPointer ();
144 case ConversionMethod
.MakeCustomModified
:
145 peapi_type
.MakeCustomModified (code_gen
, (PEAPI
.CustomModifier
) conversion_list
[++i
],
146 (BaseTypeRef
) conversion_list
[++i
]);
152 return peapi_type
.PeapiType
;