From 92daf0f5043a80a36bc511ab6826ab3cedb59760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20M=C3=AD=C5=A1ek?= Date: Sat, 14 Sep 2019 16:21:24 +0200 Subject: [PATCH] synthesized Dispose() fixes - fixes Dispose() IL - ref https://github.com/peachpiecompiler/peachpie/issues/489 --- .../CodeGen/Symbols/SourceTypeSymbol.cs | 7 +++++-- .../Symbols/Synthesized/SynthesizedFinalizeSymbol.cs | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Peachpie.CodeAnalysis/CodeGen/Symbols/SourceTypeSymbol.cs b/src/Peachpie.CodeAnalysis/CodeGen/Symbols/SourceTypeSymbol.cs index cff572a4b2..465ca97c17 100644 --- a/src/Peachpie.CodeAnalysis/CodeGen/Symbols/SourceTypeSymbol.cs +++ b/src/Peachpie.CodeAnalysis/CodeGen/Symbols/SourceTypeSymbol.cs @@ -148,7 +148,7 @@ void EmitDisposable(Emit.PEModuleBuilder module, DiagnosticBag diagnostics) // // IDisposable.Dispose() // - var dispose = new SynthesizedMethodSymbol(this, "IDisposable.Dispose", false, true, DeclaringCompilation.GetSpecialType(SpecialType.System_Void), isfinal: false) + var dispose = new SynthesizedMethodSymbol(this, "IDisposable.Dispose", false, true, DeclaringCompilation.GetSpecialType(SpecialType.System_Void), isfinal: true) { ExplicitOverride = (MethodSymbol)DeclaringCompilation.GetSpecialTypeMember(SpecialMember.System_IDisposable__Dispose), ForwardedCall = __destruct, @@ -180,7 +180,10 @@ void EmitDisposable(Emit.PEModuleBuilder module, DiagnosticBag diagnostics) disposedPlace.EmitStore(cg.Builder); // __destruct() - cg.EmitRet(cg.EmitForwardCall(__destruct, dispose, callvirt: true)); + cg.EmitPop(cg.EmitForwardCall(__destruct, dispose, callvirt: true)); + + // .ret + cg.EmitRet(DeclaringCompilation.GetSpecialType(SpecialType.System_Void)); }, null, diagnostics, false)); diff --git a/src/Peachpie.CodeAnalysis/Symbols/Synthesized/SynthesizedFinalizeSymbol.cs b/src/Peachpie.CodeAnalysis/Symbols/Synthesized/SynthesizedFinalizeSymbol.cs index 7ef5907a70..8a927db015 100644 --- a/src/Peachpie.CodeAnalysis/Symbols/Synthesized/SynthesizedFinalizeSymbol.cs +++ b/src/Peachpie.CodeAnalysis/Symbols/Synthesized/SynthesizedFinalizeSymbol.cs @@ -41,7 +41,7 @@ public SynthesizedFinalizeSymbol(NamedTypeSymbol/*!*/container) public sealed override MethodKind MethodKind => MethodKind.Destructor; - internal override bool IsExplicitInterfaceImplementation => false; + internal override bool IsExplicitInterfaceImplementation => true; internal override ObsoleteAttributeData ObsoleteAttributeData => null;