<html>
    <head>
      <base href="https://bugs.documentfoundation.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_UNCONFIRMED "
   title="UNCONFIRMED - Invoking a Basic routine with ByRef Long or Double parameter does not return modified value"
   href="https://bugs.documentfoundation.org/show_bug.cgi?id=133889">133889</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Invoking a Basic routine with ByRef Long or Double parameter does not return modified value
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>LibreOffice
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>Inherited From OOo
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>UNCONFIRMED
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>medium
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>BASIC
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>libreoffice-bugs@lists.freedesktop.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>mikekaganski@hotmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>andreas.heinisch@yahoo.de
          </td>
        </tr></table>
      <p>
        <div>
        <pre>This is one of two related bug reports (the other is <a class="bz_bug_link 
          bz_status_UNCONFIRMED "
   title="UNCONFIRMED - Invoking a Basic routine with ByRef Variant parameter returns wrong value type"
   href="show_bug.cgi?id=133887">bug 133887</a>); attachment
161869 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:

<span class="quote">> Sub Foo(v As Long) ' default ByRef
>     v = 100000
> End Sub</span >

<span class="quote">> 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</span >

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:

<span class="quote">>     oScript.invoke(Array(200000), aOutInd, aOutArr)</span >

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
<a href="https://git.libreoffice.org/core/+/11f9aa4fcb2ad0a5fada8561c7041e7f25a059fc">https://git.libreoffice.org/core/+/11f9aa4fcb2ad0a5fada8561c7041e7f25a059fc</a>,
and was made conditional (dependent on VBASupport) in
<a href="https://git.libreoffice.org/core/+/9cdb73ff28c4cd6380412468f34ff10e46292a07">https://git.libreoffice.org/core/+/9cdb73ff28c4cd6380412468f34ff10e46292a07</a>.
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:

<span class="quote">> Dim n As Long
> n = 1
> oSomeObject.AMethodExpecting16BitValue(n)</span >

... 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.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are the assignee for the bug.</li>
      </ul>
    </body>
</html>