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.
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.
_______________________________________________
Oorexx-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/oorexx-devel