From 9e52243831ceffced1e9f0ef27041770fe13a85a Mon Sep 17 00:00:00 2001 From: Neil Date: Thu, 17 Jun 2021 09:28:05 +1000 Subject: Add SciFnDirectStatus, a direct access function which also returns status so can improve performance for client code that called SCI_GETSTATUS after every API to check for failure. --- win32/ScintillaWin.cxx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'win32') diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 068cef15f..0af4a6d65 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -371,6 +371,8 @@ class ScintillaWin : static sptr_t DirectFunction( sptr_t ptr, UINT iMessage, uptr_t wParam, sptr_t lParam); + static sptr_t DirectStatusFunction( + sptr_t ptr, UINT iMessage, uptr_t wParam, sptr_t lParam, int *pStatus); static LRESULT PASCAL SWndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam); static LRESULT PASCAL CTWndProc( @@ -1792,6 +1794,9 @@ sptr_t ScintillaWin::SciMessage(Message iMessage, uptr_t wParam, sptr_t lParam) case Message::GetDirectFunction: return reinterpret_cast(DirectFunction); + case Message::GetDirectStatusFunction: + return reinterpret_cast(DirectStatusFunction); + case Message::GetDirectPointer: return reinterpret_cast(this); @@ -2032,6 +2037,7 @@ sptr_t ScintillaWin::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) { iMessage = SciMessageFromEM(msg); switch (iMessage) { case Message::GetDirectFunction: + case Message::GetDirectStatusFunction: case Message::GetDirectPointer: case Message::GrabFocus: case Message::SetTechnology: @@ -3549,8 +3555,18 @@ LRESULT PASCAL ScintillaWin::CTWndProc( sptr_t ScintillaWin::DirectFunction( sptr_t ptr, UINT iMessage, uptr_t wParam, sptr_t lParam) { - PLATFORM_ASSERT(::GetCurrentThreadId() == ::GetWindowThreadProcessId(reinterpret_cast(ptr)->MainHWND(), nullptr)); - return reinterpret_cast(ptr)->WndProc(static_cast(iMessage), wParam, lParam); + ScintillaWin *sci = reinterpret_cast(ptr); + PLATFORM_ASSERT(::GetCurrentThreadId() == ::GetWindowThreadProcessId(sci->MainHWND(), nullptr)); + return sci->WndProc(static_cast(iMessage), wParam, lParam); +} + +sptr_t ScintillaWin::DirectStatusFunction( + sptr_t ptr, UINT iMessage, uptr_t wParam, sptr_t lParam, int *pStatus) { + ScintillaWin *sci = reinterpret_cast(ptr); + PLATFORM_ASSERT(::GetCurrentThreadId() == ::GetWindowThreadProcessId(sci->MainHWND(), nullptr)); + const sptr_t returnValue = sci->WndProc(static_cast(iMessage), wParam, lParam); + *pStatus = static_cast(sci->errorStatus); + return returnValue; } namespace Scintilla::Internal { -- cgit v1.2.3