Some notes on recent changes around constructor functions:
* The change of
<http://cgit.freedesktop.org/libreoffice/core/commit/?id=306efefe22e02248eff14f8be2cef68d75d26e55>
"Minimize the constructor functions to a bare minimum" to let
constructor functions return un-acquired pointers breaks constructor
functions that internally already have an acquired pointer. This includes:
** Constructor functions for singletons, like
com_sun_star_comp_sfx2_GlobalEventBroadcaster_get_implementation
(sfx2/source/notify/globalevents.cxx).
** "Wrappers" like those for which constructor functions have been
reverted again in
<http://cgit.freedesktop.org/libreoffice/core/commit/?id=9bc2ab30e302c210b725e7035ea4d17774ef90e1>
"Revert 'svt: Use constructor feature for FilePicker and
FolderPicker...'" (based on the rationale it "does not make a real sense
to use constructor for implementations that act as a trampoline," which
I do not understand).
If the stated rationale for that change is that it is "annoying to see
the boilerplate copypasted everywhere," I think there is better
solutions for that, like providing a helper function to be called from
the typical constructor function,
css::uno::XInterface * acquire(cppu::OWeakObject * instance) {
assert(instance != 0);
instance->acquire();
return instance;
}
css::uno::XInterface * FOO_constructor_function(...) {
retrun acquire(new FOO(...));
}
*
<http://cgit.freedesktop.org/libreoffice/core/commit/?id=f278397787f7b79cee8536e806e8b7113800f2ef>
"Change _get_implementation()'s not to do initialization directly" makes
it more awkward to code the (assumedly) common case where a UNO service
constructor with arguments can be implemented directly by a C++ class
constructor with arguments. That change forces two-step construction,
via passing back a member function pointer, onto all such cases, with
the apparent rationale to make the (assumedly) non-common case that does
require two-step construction simpler to code.
(And I'm not even sure it is technically correct to force the address of
a member function of a class derived from cppu::OWeakObject to
cppu::constructor_InitializationFunc. Also, for the static_cast from
XInterface to OWeakObject in servicemanager.cxx to work, this change
makes the---undocumented---requirement that constructor functions making
use of the two-step--init callback return an exact one of their
potentially many XInterface pointers; rather brittle.)
FYI, I envisioned a road where ultimately a (new-style) UNO service's
different constructors rather directly map to a C++ implementation
class's different constructors.
* One main reason for introducing those constructor functions in the
first place is to allow (in specific scenarios) for direct calls of them
from client code, bypassing the service manager. I think it is
beneficial to test that direct-call scenario as much as possible while
working on this, that is why I created the manual scaffolding of
osl/detail/component-defines.h.
<http://cgit.freedesktop.org/libreoffice/core/commit/?id=921e2dc0393873ad0a972252000803ceadc290cb>
"Reduce the number of experimental direct constructor calls" reducing
instead of increasing the number of constructor function implementations
for which direct-calling will actually be tested is detrimental to that.
Stephan
Context
- Re: Efficient UNO component linkage & GC ... · Stephan Bergmann
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.