4
4
//
5
5
// SPDX-License-Identifier: Apache-2.0
6
6
7
+ using System ;
7
8
using System . Collections . Generic ;
8
9
using System . Linq ;
9
10
using System . Runtime . CompilerServices ;
@@ -199,18 +200,40 @@ bool isStub
199
200
}
200
201
}
201
202
203
+ if (
204
+ typeReference . IsByReference
205
+ || typeReference . IsPointer
206
+ || typeReference . IsPinned
207
+ || typeReference . IsRequiredModifier
208
+ )
209
+ {
210
+ return CreateTypeFromTypeReference ( typeReference . GetElementType ( ) , isStub ) ;
211
+ }
212
+
213
+ if ( typeReference is FunctionPointerType functionPointerType )
214
+ {
215
+ return GetOrCreateTypeInstance ( functionPointerType ) ;
216
+ }
217
+
202
218
TypeDefinition typeDefinition ;
203
219
try
204
220
{
205
221
typeDefinition = typeReference . Resolve ( ) ;
206
222
}
207
- catch ( AssemblyResolutionException )
223
+ catch ( AssemblyResolutionException e )
224
+ {
225
+ throw new ArchLoaderException (
226
+ $ "Could not resolve type { typeReference . FullName } ",
227
+ e
228
+ ) ;
229
+ }
230
+ if ( typeDefinition == null )
208
231
{
209
- typeDefinition = null ;
232
+ throw new ArchLoaderException ( $ "Could not resolve type { typeReference . FullName } " ) ;
210
233
}
211
234
212
- var typeName = typeReference . BuildFullName ( ) ;
213
- var declaringTypeReference = typeReference ;
235
+ var typeName = typeDefinition . BuildFullName ( ) ;
236
+ var declaringTypeReference = typeDefinition ;
214
237
while ( declaringTypeReference . IsNested )
215
238
{
216
239
declaringTypeReference = declaringTypeReference . DeclaringType ;
@@ -220,8 +243,8 @@ bool isStub
220
243
declaringTypeReference . Namespace
221
244
) ;
222
245
var currentAssembly = _assemblyRegistry . GetOrCreateAssembly (
223
- typeReference . Module . Assembly . Name . FullName ,
224
- typeReference . Module . Assembly . FullName ,
246
+ typeDefinition . Module . Assembly . Name . FullName ,
247
+ typeDefinition . Module . Assembly . FullName ,
225
248
true ,
226
249
null
227
250
) ;
@@ -231,26 +254,6 @@ bool isStub
231
254
isNested ,
232
255
isGeneric ;
233
256
234
- if ( typeDefinition == null )
235
- {
236
- isCompilerGenerated = typeReference . IsCompilerGenerated ( ) ;
237
- isNested = typeReference . IsNested ;
238
- isGeneric = typeReference . HasGenericParameters ;
239
- type = new Type (
240
- typeName ,
241
- typeReference . Name ,
242
- currentAssembly ,
243
- currentNamespace ,
244
- NotAccessible ,
245
- isNested ,
246
- isGeneric ,
247
- true ,
248
- isCompilerGenerated
249
- ) ;
250
-
251
- return new TypeInstance < IType > ( type ) ;
252
- }
253
-
254
257
const string fixedElementField = "FixedElementField" ;
255
258
256
259
if (
@@ -312,7 +315,7 @@ bool isStub
312
315
isGeneric = typeDefinition . HasGenericParameters ;
313
316
type = new Type (
314
317
typeName ,
315
- typeReference . Name ,
318
+ typeDefinition . Name ,
316
319
currentAssembly ,
317
320
currentNamespace ,
318
321
visibility ,
@@ -373,6 +376,35 @@ bool isStub
373
376
return createdTypeInstance ;
374
377
}
375
378
379
+ [ NotNull ]
380
+ private ITypeInstance < FunctionPointer > GetOrCreateTypeInstance (
381
+ FunctionPointerType functionPointerType
382
+ )
383
+ {
384
+ var type = new Type (
385
+ functionPointerType . FullName ,
386
+ functionPointerType . Name ,
387
+ null ,
388
+ null ,
389
+ Public ,
390
+ false ,
391
+ false ,
392
+ false ,
393
+ false
394
+ ) ;
395
+ var returnTypeInstance = GetOrCreateStubTypeInstanceFromTypeReference (
396
+ functionPointerType . ReturnType
397
+ ) ;
398
+ var parameterTypeInstances = functionPointerType
399
+ . Parameters . Select ( parameter =>
400
+ GetOrCreateStubTypeInstanceFromTypeReference ( parameter . ParameterType )
401
+ )
402
+ . ToList ( ) ;
403
+ return new TypeInstance < FunctionPointer > (
404
+ new FunctionPointer ( type , returnTypeInstance , parameterTypeInstances )
405
+ ) ;
406
+ }
407
+
376
408
[ NotNull ]
377
409
private MethodMemberInstance CreateMethodMemberFromMethodReference (
378
410
[ NotNull ] ITypeInstance < IType > typeInstance ,
0 commit comments