On 01.06.2022 12:20, Rick McGuire wrote:


On Wed, Jun 1, 2022 at 6:11 AM Rony G. Flatscher <rony.flatsc...@wu.ac.at> 
wrote:

    While debugging orexxole.cpp I am using the existing function 
pszDbgVarType(vt) which returns
    a pointer to a zero terminated string which gets defined for the entire 
program as CHAR
    szDbg[255]. The same buffer is used by pszDbgInvKind(), pszDbgTypekind(), 
pszDbgParmFlags()
    and pszDbVariant(). With the exception of pszDbgVarType() these debug 
functions are there but
    not used AFAICT.

    It allows to get a human readable string of the type 'vt' represents, e.g. 
"VT_ARRAY
    VT_VARIANT", "VT_R8" and the like.

    The strange observation is using pszDbgVarType() multiple times in a single 
debug statement like:

                             if (*pDestVt & VT_ARRAY)    // an array in hand
                             {
                                 VARTYPE tmpVt = *pDestVt & VT_TYPEMASK;
        *fprintf(stderr, "orexxole.cpp # %d %s: --- b) VT_ARRAY: type=[%s]
        *pDestVt=[%s][d=%d][x%08x] %s tmpVt=[%s][d=%d][x%08x] | 
VT_ARRAY=[%s][d=%d][x%08x],
        VT_R8=[%s][d=%d][x%08x] \n\n",****__LINE__, 
__FUNCTION__,****"VT_ARRAY",****pszDbgVarType( *pDestVt ), *pDestVt , *pDestVt,****" /\\ 
",****pszDbgVarType( tmpVt ), tmpVt , tmpVt,****pszDbgVarType(VT_ARRAY), VT_ARRAY, 
VT_ARRAY,****pszDbgVarType(VT_R8), VT_R8, VT_R8****);***                     }

    So there are four invocations of pszDbgVarType() with four different 
variables. The ouput is
    surprisingly:

        ... cut ...
        oorexxole.cpp # 419 pszDbgVarType, vt: d=[5] [x00000005] -> 
szDbg=[VT_R8] (return value)
        oorexxole.cpp # 419 pszDbgVarType, vt: d=[0] [x00000000] -> 
szDbg=[VT_ARRAY  VT_EMPTY] (return value)
        oorexxole.cpp # 419 pszDbgVarType, vt: d=[5] [x00000005] -> 
szDbg=[VT_R8] (return value)
        oorexxole.cpp # 419 pszDbgVarType, vt: d=[5] [x00000005] -> 
szDbg=[VT_ARRAY  VT_R8] (return value)
            (added linebreaks for better legibility):
        *orexxole.cpp # 4359 checkForOverride: --- b) VT_ARRAY: type=[VT_ARRAY] 
*pDestVt=[VT_ARRAY
        VT_R8][d=8197][x00002005] /\ tmpVt=[VT_ARRAY****VT_R8][d=5][x00000005] 
| VT_ARRAY=[VT_ARRAY VT_R8][d=8192][x00002000], VT_R8=[VT_ARRAY
        VT_R8][d=5][x00000005]***

    Line # 419 above is a debug statement in pszDbgVarType() displaying the 
value it returns. It
    uses strcat() with the szDbg buffer which upon entry in this function sets 
element 0 to 0.

    VT_ARRAY has the decimal value 8192 (x2000), VT_R8 the decimal value 5 
(x0005), hence the
    following should be shown:

        pszDbgVarType(*pDestVt): "VT_ARRAY VT_R8"
        pszDbgVarType(tmpVt)   : "VT_R8" (VT_TYPEMASK is defined as xFFF)
        pszDbgVarType(VT_ARRAY): "VT_ARRAY"
        pszDbgVarType(VT_R8)   : "VT_R8"

    It is as if for some of those invocations of pszDbvVarType the wrong buffer 
gets returned,
    hence displaying wrong information.

Well, if the buffer gets reused, then each invocation is going to overlay the information from the previous call, so fprintf() will be using the information from the last call when it formats.

Ah, I see, that explains it, thank you very much!

    Of course, having spent an enormeous amount of time debugging I might have 
arrived at a point
    where I overlook the obvious, hence this posting requesting comments.

    ---rony

    P.S.: Contemplating to change the pszDbg...() functions to force a buffer 
to be supplied
    rather than using a single global buffer, noticing that at least 
pszDbgVarType() gets also
    used by orexxole.cpp. This way no wrong optimizations should be applicable 
and also
    multithreaded usage of oorexxole.cpp would be improved.

Just make sure the allocated buffer gets released afterwards. This change is likely to be an incredible pain to accomplish.

Will make sure that that happens (this will take some time as the next slot to work on this is about to close and reopens this weekend due to my currently quite high workload).

---rony


_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to