[Libreoffice] uno discoverability
Stephan Bergmann
sbergman at redhat.com
Mon Nov 21 04:57:53 PST 2011
On 11/17/2011 06:55 PM, Michael Meeks wrote:
> On Wed, 2011-11-16 at 14:16 +0100, Stephan Bergmann wrote:
>>> throw FooException("Failure loading file '%S' code %d",
> ...
>> This (as well as cooking something up using OSL_FORMAT) would have the
>> disadvantage that it potentially converts data from UTF-16 to char
>> ("%S") and then from char to UTF-16 (as UNO Exception's Message is of
>> type rtl::OUString).
>
> True - but by the time we throw an exception, efficiency already goes
> to hell in a hand-cart (as it were) ;-) we start straining mind and limb
> to find unwind info records, infer types, understand what is on the
> stack and how to clean it up etc. An extra allocation or two isn't going
> to hurt.
Its not any time/space overhead that makes me feel uneasy here, but the
lack of elegance and of consistency. We could come up with a mechanism
now for composing exception messages using the new sal/log.h SAL_STREAM,
like
throw RuntimeException(rtl::OUString(SAL_STREAM("cannot open " <<
url).c_str()));
or even simplify that further with an additional macro like
throw RuntimeException(SAL_STRING("cannot open " << url));
Then again, the standard LO idiom to create a literal rtl::OUString is
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("...")), and the standard LO
idiom to compose a string from to substrings is s1 + s2. This is not
only so for the special case of composing messages of UNO exceptions, it
is so across all the code. It is somewhat long-winded and ugly, but
within today's constraints we won't be able to come up with something
that is substantially better with regard to space/time complexity.
If we would optimize the "user experience" of composing exception
messages (where the resulting space/time overhead would be harmless), we
would pessimize the standard idiom, relative to it, even more. People
would probably start to use the "optimization" in general code, too.
In short, I would not over-emphasize the issue of ugly string
composition in current LO, and rather live with it until we come up with
something substantially better, benefiting all use cases, in LO 4.
>> We'll probably wait until either all relevant compilers
>> support C++11's new character types, or we incompatibly change
>> rtl::OUString to UTF-8 (whatever happens first).
>
> Which would be wonderful :-) I'm cheering that on. Having said that -
> if we go with gcc for cross-compile to Windows too, does that help us ?
The "Unicode String Literals" row at
<wiki.apache.org/stdcxx/C++0xCompilerSupport> suggests so. But then
again, we still depend on MSVC for Windows builds as of now.
>> For types.rdb, my vision is to either use an XML format or, IMO even
>> better, a new .idl format that is (a) less verbose (why the heck all
>> those ";" in there, etc.?) and (b) does not rely on a preprocessor.
>> Then, a types.rdb could effectively be just one large .idl file.
>
> Great. Of course, types.rdb being huge and empty would be fine if we
> didn't load and read it at startup a lot ;-) IIRC one use-case there was
> the lack of in-lined property Name/Value struct -> any conversions, so:
>
> pArg.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "foo" ));
> pArg.Value<<= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "baa" ));
>
> Is nice& efficient, and in-line-able; until that pArg ends up inside
> an Any itself - at which point we suck in types.rdb, start loading type
> data, inferring C++ structure offsets, and so on - just to allocate and
> construct the local Any (which I assume we could do& in-line at compile
> time).
The Any operator <<= for complex structures uses a generic
(introspective) approach. I guess that was mainly done to keep the code
small (esp. given that anything else would have had to be inline-only).
> Then again - perhaps we use introspection for something else more
> serious on startup, or perhaps I'm out of date on this. Do you have a
> feel for whether it is just a few silly cases like this that we could
> work around ? or if there is some deep reason that types.rdb should be
> necessary at startup ?
Any sort of bridging probably requires introspection already (and Kay's
purpose-bridges are still used early on, IIRC). Getting types.rdb out
of the picture here could be done either via "comprehensively compiled"
.hpp headers (that contain the type information in C code; but that
would probably bloat the code if done everywhere) or replacing generic
(introspective) algorithms with per-type-templated ones (that would
again bloat the code). Difficult to tell whether true benefit lurks
there...
Stephan
More information about the LibreOffice
mailing list