@@ -210,12 +210,6 @@ private void LoadLiteralToStackHandlingCallOnValueTypeLiterals(string ilVar, ITy
210
210
}
211
211
}
212
212
213
- private void StoreTopOfStackInLocalVariableAndLoadItsAddress ( string ilVar , ITypeSymbol type , string variableName = "tmp" )
214
- {
215
- var tempLocalName = StoreTopOfStackInLocalVariable ( Context , ilVar , variableName , type ) . VariableName ;
216
- Context . EmitCilInstruction ( ilVar , OpCodes . Ldloca_S , tempLocalName ) ;
217
- }
218
-
219
213
protected IMethodSymbol DeclaredSymbolFor < T > ( T node ) where T : BaseMethodDeclarationSyntax
220
214
{
221
215
return Context . GetDeclaredSymbol ( node ) ;
@@ -402,7 +396,8 @@ protected void ProcessParameter(string ilVar, SimpleNameSyntax node, IParameterS
402
396
{
403
397
var method = ( IMethodSymbol ) paramSymbol . ContainingSymbol ;
404
398
var declaringMethodName = method . ToDisplayString ( ) ;
405
- if ( HandleLoadAddressOnStorage ( ilVar , paramSymbol . Type , node , OpCodes . Ldarga , paramSymbol . Name , VariableMemberKind . Parameter , declaringMethodName ) )
399
+ var operand = Context . DefinitionVariables . GetVariable ( paramSymbol . Name , VariableMemberKind . Parameter , declaringMethodName ) . VariableName ;
400
+ if ( HandleLoadAddress ( ilVar , paramSymbol . Type , node , OpCodes . Ldarga , operand ) )
406
401
return ;
407
402
408
403
if ( InlineArrayProcessor . HandleInlineArrayConversionToSpan ( Context , ilVar , paramSymbol . Type , node , OpCodes . Ldarga_S , paramSymbol . Name , VariableMemberKind . Parameter , declaringMethodName ) )
@@ -431,6 +426,9 @@ protected void ProcessField(string ilVar, SimpleNameSyntax node, IFieldSymbol fi
431
426
var nodeParent = ( CSharpSyntaxNode ) node . Parent ;
432
427
Debug . Assert ( nodeParent != null ) ;
433
428
429
+ fieldSymbol . EnsureFieldExists ( Context , node ) ;
430
+ var resolvedFieldVariable = fieldSymbol . FieldResolverExpression ( Context ) ;
431
+
434
432
if ( fieldSymbol . HasConstantValue && fieldSymbol . IsConst )
435
433
{
436
434
LoadLiteralToStackHandlingCallOnValueTypeLiterals (
@@ -446,34 +444,31 @@ protected void ProcessField(string ilVar, SimpleNameSyntax node, IFieldSymbol fi
446
444
return ;
447
445
}
448
446
449
- fieldSymbol . EnsureFieldExists ( Context , node ) ;
450
-
451
447
if ( ! fieldSymbol . IsStatic && node . IsMemberAccessThroughImplicitThis ( ) )
452
448
Context . EmitCilInstruction ( ilVar , OpCodes . Ldarg_0 ) ;
453
449
454
- if ( HandleLoadAddressOnStorage ( ilVar , fieldSymbol . Type , node , fieldSymbol . IsStatic ? OpCodes . Ldsflda : OpCodes . Ldflda , fieldSymbol . Name , VariableMemberKind . Field , fieldSymbol . ContainingType . ToDisplayString ( ) ) )
450
+ if ( HandleLoadAddress ( ilVar , fieldSymbol . Type , node , fieldSymbol . IsStatic ? OpCodes . Ldsflda : OpCodes . Ldflda , resolvedFieldVariable ) )
455
451
{
456
452
return ;
457
453
}
458
454
459
455
if ( fieldSymbol . IsVolatile )
460
456
Context . EmitCilInstruction ( ilVar , OpCodes . Volatile ) ;
461
457
462
- var resolvedField = fieldSymbol . FieldResolverExpression ( Context ) ;
463
458
var opCode = fieldSymbol . LoadOpCodeForFieldAccess ( ) ;
464
- Context . EmitCilInstruction ( ilVar , opCode , resolvedField ) ;
459
+ Context . EmitCilInstruction ( ilVar , opCode , resolvedFieldVariable ) ;
465
460
HandlePotentialDelegateInvocationOn ( node , fieldSymbol . Type , ilVar ) ;
466
461
}
467
462
468
463
protected void ProcessLocalVariable ( string ilVar , SimpleNameSyntax localVarSyntax , ILocalSymbol symbol )
469
464
{
470
- if ( HandleLoadAddressOnStorage ( ilVar , symbol . Type , localVarSyntax , OpCodes . Ldloca , symbol . Name , VariableMemberKind . LocalVariable ) )
465
+ var operand = Context . DefinitionVariables . GetVariable ( symbol . Name , VariableMemberKind . LocalVariable ) . VariableName ;
466
+ if ( HandleLoadAddress ( ilVar , symbol . Type , localVarSyntax , OpCodes . Ldloca , operand ) )
471
467
return ;
472
468
473
469
if ( InlineArrayProcessor . HandleInlineArrayConversionToSpan ( Context , ilVar , symbol . Type , localVarSyntax , OpCodes . Ldloca_S , symbol . Name , VariableMemberKind . LocalVariable ) )
474
470
return ;
475
-
476
- var operand = Context . DefinitionVariables . GetVariable ( symbol . Name , VariableMemberKind . LocalVariable ) . VariableName ;
471
+
477
472
Context . EmitCilInstruction ( ilVar , OpCodes . Ldloc , operand ) ;
478
473
479
474
HandlePotentialDelegateInvocationOn ( localVarSyntax , symbol . Type , ilVar ) ;
@@ -488,12 +483,6 @@ private void HandlePotentialFixedLoad(string ilVar, ILocalSymbol symbol)
488
483
Context . EmitCilInstruction ( ilVar , OpCodes . Conv_U ) ;
489
484
}
490
485
491
- private bool HandleLoadAddressOnStorage ( string ilVar , ITypeSymbol symbol , CSharpSyntaxNode node , OpCode opCode , string symbolName , VariableMemberKind variableMemberKind , string parentName = null )
492
- {
493
- var operand = Context . DefinitionVariables . GetVariable ( symbolName , variableMemberKind , parentName ) . VariableName ;
494
- return HandleLoadAddress ( ilVar , symbol , node , opCode , operand ) ;
495
- }
496
-
497
486
protected bool HandleLoadAddress ( string ilVar , ITypeSymbol loadedType , CSharpSyntaxNode node , OpCode loadOpCode , string operand )
498
487
{
499
488
var parentNode = ( CSharpSyntaxNode ) node . Parent ;
0 commit comments