From 8ac77adb76c96a9801321cec5b0d9e4a75da986d Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 12 Oct 2018 17:06:47 +0300 Subject: [PATCH] Ensure virtual destructor chain --- src/Avalonia.Native.OSX/window.h | 4 ++-- src/Avalonia.Native.OSX/window.mm | 12 +++++++----- src/headers/comimpl.h | 12 ++++++++++-- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/Avalonia.Native.OSX/window.h b/src/Avalonia.Native.OSX/window.h index 3a9ef22df1..f934e76f06 100644 --- a/src/Avalonia.Native.OSX/window.h +++ b/src/Avalonia.Native.OSX/window.h @@ -3,7 +3,7 @@ #ifndef window_h #define window_h - +#import "ArcTraceWindow.h" class WindowBaseImpl; @interface AvnView : NSView @@ -13,7 +13,7 @@ class WindowBaseImpl; -(void) setSwRenderedFrame: (AvnFramebuffer* _Nonnull) fb dispose: (IUnknown* _Nonnull) dispose; @end -@interface AvnWindow : NSWindow +@interface AvnWindow : ArcTraceWindow -(AvnWindow* _Nonnull) initWithParent: (WindowBaseImpl* _Nonnull) parent; -(void) setCanBecomeKeyAndMain; -(void) pollModalSession: (NSModalSession _Nonnull) session; diff --git a/src/Avalonia.Native.OSX/window.mm b/src/Avalonia.Native.OSX/window.mm index 35778a609a..8a048006c2 100644 --- a/src/Avalonia.Native.OSX/window.mm +++ b/src/Avalonia.Native.OSX/window.mm @@ -13,6 +13,7 @@ private: public: FORWARD_IUNKNOWN() + virtual ~WindowBaseImpl(){} AvnView* View; AvnWindow* Window; ComPtr BaseEvents; @@ -23,6 +24,7 @@ public: { BaseEvents = events; View = [[AvnView alloc] initWithParent:this]; + Window = [[AvnWindow alloc] initWithParent:this]; lastPositionSet.X = 100; @@ -343,14 +345,13 @@ private: CGRect _lastUndecoratedFrame; AvnWindowState _lastWindowState; + FORWARD_IUNKNOWN() BEGIN_INTERFACE_MAP() INHERIT_INTERFACE_MAP(WindowBaseImpl) INTERFACE_MAP_ENTRY(IAvnWindow, IID_IAvnWindow) END_INTERFACE_MAP() - - virtual uint Release() - { - return ComObject::Release(); + virtual ~WindowImpl(){ + NSLog(@"~WindowImpl"); } ComPtr WindowEvents; @@ -1017,7 +1018,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent - (BOOL)windowShouldClose:(NSWindow *)sender { - auto window = dynamic_cast(_parent.operator->()); + auto window = dynamic_cast(_parent.getRaw()); if(window != nullptr) { @@ -1087,6 +1088,7 @@ private: INHERIT_INTERFACE_MAP(WindowBaseImpl) INTERFACE_MAP_ENTRY(IAvnPopup, IID_IAvnPopup) END_INTERFACE_MAP() + virtual ~PopupImpl(){} ComPtr WindowEvents; PopupImpl(IAvnWindowEvents* events) : WindowBaseImpl(events) { diff --git a/src/headers/comimpl.h b/src/headers/comimpl.h index 9d983366e4..cea6d2207a 100644 --- a/src/headers/comimpl.h +++ b/src/headers/comimpl.h @@ -90,6 +90,7 @@ public: { return E_NOINTERFACE; }; + virtual ~ComUnknownObject(){} }; template class ComSingleObject : public ComObject, public virtual TInterface @@ -97,6 +98,9 @@ template class ComSingleObject : public ComO BEGIN_INTERFACE_MAP() INTERFACE_MAP_ENTRY(TInterface, *TIID) END_INTERFACE_MAP() + +public: + virtual ~ComSingleObject(){} }; template @@ -151,8 +155,12 @@ public: _obj = 0; } } - -public: + + TInterface* getRaw() + { + return _obj; + } + operator TInterface*() const { return _obj;