[Libreoffice-bugs] [Bug 133889] Invoking a Basic routine with ByRef Long or Double parameter does not return modified value

bugzilla-daemon at bugs.documentfoundation.org bugzilla-daemon at bugs.documentfoundation.org
Sun Jun 14 12:34:37 UTC 2020


https://bugs.documentfoundation.org/show_bug.cgi?id=133889

--- Comment #1 from libre officer <smartazaiz at gmail.com> ---
(In reply to Mike Kaganski from comment #0)
> This is one of two related bug reports (the other is bug 133887); attachment
> 161869 [details] contains the tests for both. Please run
> TestByRefFromInvoke, and only check last two lines of output (OutputByRef3
> and OutputByRef4) for the purposes of this bug.
> 
> If there is a routine with a ByRef parameter (i.e., inout parameter),
> invoking it using XScript::invoke [1] requires passing *in* values through
> the first array (sequence), and getting their modified *out* values in the
> last passed array. This bug is for explicit Long and Double parameters:
> 
> > Sub Foo(v As Long) ' default ByRef
> >     v = 100000
> > End Sub
> 
> > Sub TestInvoke
> >     oScript = thisComponent.getScriptProvider().getScript("vnd.sun.star.script:Standard.Module1.Foo?language=Basic&location=document")
> >     oScript.invoke(Array(0&), aOutInd, aOutArr)
> >     MsgBox aOutArr(0) & " " & TypeName(aOutArr(0))
> > End Sub
> 
> TestInvoke above passes "0&" (i.e., an explicit Long value) as initial value
> of the variable passed to the Foo, and expects to get the modified value in
> the aOutArr(0) - i.e., it should output "100000 Long".
> 
> However, the actual returned value is 0 of type *Integer*. It is possible to
> get the correct result by modifying the value passed to invoke call like
> this:
> 
> >     oScript.invoke(Array(200000), aOutInd, aOutArr)
> 
> So it is not enough to pass an explicitly-typed long value; it turns into a
> smaller type if its value fits that smaller value.
> 
> The conversion was introduced in
> https://git.libreoffice.org/core/+/11f9aa4fcb2ad0a5fada8561c7041e7f25a059fc,
> and was made conditional (dependent on VBASupport) in
> https://git.libreoffice.org/core/+/9cdb73ff28c4cd6380412468f34ff10e46292a07.
> The reason for the conversion is expressed as "Choose "smallest"
> represention for int values because up cast is allowed, downcast not". I
> *suppose* that the idea was that it's possible to call some UNO API like
> this:
> 
> > Dim n As Long
> > n = 1
> > oSomeObject.AMethodExpecting16BitValue(n)
> 
> ... which would fail if value of n would be passed as 32-bit integer to the
> method. Thus, I suppose that removal of the conversion could be an
> incompatible change breaking infinite number of existing macros (so
> unacceptable; yet, I don't have a proof of this suspicion). I also don't
> know if it's possible to find a proper condition to disallow downcasting for
> the purposes of ByRef parameters.


I run your `TestByRefFromInvoke` and got this Message Box:

OutputByRef0: [ (Empty)]        [Error 91 (Error)]      [6.75 (String)] [True
(Boolean)]        [7 (Integer)]   [7 (Integer)]   [7 (Integer)]   [7 (Integer)]
(Ref: 6.75)
OutputByRef1: [ (Empty)]        [Error 91 (Error)]      [ (String)]     [True
(Boolean)]        [0 (Integer)]   [0 (Integer)]   [0 (Integer)]   [0 (Integer)]
(Ref: True)
OutputByRef2: [ (Empty)]        [Error 91 (Error)]      [ (String)]     [False
(Boolean)]       [1 (Integer)]   [1 (Integer)]   [1 (Integer)]   [1 (Integer)]
(Ref: 1)
OutputByRef3: [ (Empty)]        [Error 91 (Error)]      [ (String)]     [False
(Boolean)]       [0 (Integer)]   [0 (Integer)]   [0 (Integer)]   [0 (Integer)]
(Ref: 100000)
OutputByRef4: [ (Empty)]        [Error 91 (Error)]      [ (String)]     [False
(Boolean)]       [0 (Integer)]   [0 (Integer)]   [0 (Integer)]   [0 (Integer)]
(Ref: 12.5)


But I don't understand why this line:

oScript.invoke(a1Param, aOutInd, aOutArr)

You declared `invoke` like this:

Function Invoke(aParams()) As String

-- 
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/libreoffice-bugs/attachments/20200614/8cbaa097/attachment-0001.htm>


More information about the Libreoffice-bugs mailing list