5 // Jb Evain (jbevain@gmail.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 namespace Mono.Cecil {
33 internal class MarshalSpec {
36 IHasMarshalSpec m_container;
38 public NativeType NativeIntrinsic {
39 get { return m_natIntr; }
40 set { m_natIntr = value; }
43 public IHasMarshalSpec Container {
44 get { return m_container; }
45 set { m_container = value; }
48 public MarshalSpec (NativeType natIntr, IHasMarshalSpec container)
51 m_container = container;
54 public virtual void Accept (IReflectionVisitor visitor)
56 visitor.VisitMarshalSpec (this);
59 public virtual MarshalSpec CloneInto (IHasMarshalSpec container)
61 return new MarshalSpec (m_natIntr, container);
65 internal sealed class ArrayMarshalSpec : MarshalSpec {
67 NativeType m_elemType;
72 public NativeType ElemType {
73 get { return m_elemType; }
74 set { m_elemType = value; }
78 get { return m_paramNum; }
79 set { m_paramNum = value; }
83 get { return m_elemMult; }
84 set { m_elemMult = value; }
88 get { return m_numElem; }
89 set { m_numElem = value; }
92 public ArrayMarshalSpec (IHasMarshalSpec container) : base (NativeType.ARRAY, container)
96 public override MarshalSpec CloneInto (IHasMarshalSpec container)
98 ArrayMarshalSpec spec = new ArrayMarshalSpec (container);
99 spec.m_elemType = m_elemType;
100 spec.m_paramNum = m_paramNum;
101 spec.m_elemMult = m_elemMult;
102 spec.m_numElem = m_numElem;
107 internal sealed class CustomMarshalerSpec : MarshalSpec {
110 string m_unmanagedType;
111 string m_managedType;
115 get { return m_guid; }
116 set { m_guid = value; }
119 public String UnmanagedType {
120 get { return m_unmanagedType; }
121 set { m_unmanagedType = value; }
124 public string ManagedType {
125 get { return m_managedType; }
126 set { m_managedType = value; }
129 public string Cookie {
130 get { return m_cookie; }
131 set { m_cookie = value; }
134 public CustomMarshalerSpec (IHasMarshalSpec container) : base (NativeType.CUSTOMMARSHALER, container)
138 public override MarshalSpec CloneInto (IHasMarshalSpec container)
140 CustomMarshalerSpec spec = new CustomMarshalerSpec (container);
141 spec.m_guid = m_guid;
142 spec.m_unmanagedType = m_unmanagedType;
143 spec.m_managedType = m_managedType;
144 spec.m_cookie = m_cookie;
149 internal sealed class SafeArraySpec : MarshalSpec {
151 private VariantType m_elemType;
153 public VariantType ElemType {
154 get { return m_elemType; }
155 set { m_elemType = value; }
158 public SafeArraySpec (IHasMarshalSpec container) : base (NativeType.SAFEARRAY, container)
162 public override MarshalSpec CloneInto(IHasMarshalSpec container)
164 SafeArraySpec spec = new SafeArraySpec (container);
165 spec.m_elemType = m_elemType;
170 internal sealed class FixedArraySpec : MarshalSpec {
172 private int m_numElem;
173 private NativeType m_elemType;
176 get { return m_numElem; }
177 set { m_numElem = value; }
180 public NativeType ElemType {
181 get { return m_elemType; }
182 set { m_elemType = value; }
185 public FixedArraySpec (IHasMarshalSpec container) : base (NativeType.FIXEDARRAY, container)
189 public override MarshalSpec CloneInto (IHasMarshalSpec container)
191 FixedArraySpec spec = new FixedArraySpec (container);
192 spec.m_numElem = m_numElem;
193 spec.m_elemType = m_elemType;
198 internal sealed class FixedSysStringSpec : MarshalSpec {
203 get { return m_size; }
204 set { m_size = value; }
207 public FixedSysStringSpec (IHasMarshalSpec container) : base (NativeType.FIXEDSYSSTRING, container)
211 public override MarshalSpec CloneInto (IHasMarshalSpec container)
213 FixedSysStringSpec spec = new FixedSysStringSpec (container);
214 spec.m_size = m_size;