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

Reply via email to