On 05.04.2024 16:04, Rick McGuire wrote:
The symptoms suggest a garbage collection problem during the copying of the behaviour object during the setmethod calls. That probably requires a few protected objects to be added. However, this is seriously using a sledge hammer to implement something that can be done much more simply. Because all of the things that need to be done during a setmethod call, this is a very expensive operation and should not typically be used for something that might be done repeatedly, particularly on a object that is part of the saved image, which adds yet another layer of complication to the garbage collection. Here is a much simpler and lower cost way to do the same thing using the RUN() method to invoke the alternate formatter.

Rick, thank you very  much for this workaround, it indeed makes the test suite run in full again without causing a crash! Will commit the changes to trunk shortly.

---rony

P.S.: As setMethod/unsetMethod are documented they will get used in the wild such that we should attempt to remove the root cause eventually.



On Fri, Apr 5, 2024 at 8:26 AM Rony G. Flatscher <rony.flatsc...@wu.ac.at> 
wrote:

    Thankfully Jean Louis was able to reproduce the crash and was able to trace 
and to analyze the
    problem further:

        I can reproduce the crash under Windows ARM, same call stack as you.

        The data breakpoint triggers 2 times, but it's a normal situation.
        It's because of
        .TraceObject~setMakeString(.resources~myMakeString)
          .TraceObject~unsetMakeString   -- reset (uses default implementation)
        In both cases, a copy of the behaviour is assigned for this = RexxClass 
"TraceObject"


        >rexx.dll!RexxObject::defineInstanceMethod(RexxString * msgname, 
MethodClass * methobj,
        RexxClass * scope) Line 2310C++
                {
                    ...
                    // copy primitive behaviour object and define the method, a 
copy is made to
                    // ensure that we don't update the behaviour of any other 
object, since they
                    // may have been sharing the mvd.
                    setField(behaviour, (RexxBehaviour *)behaviour->copy());
                    ...
                }


        >rexx.dll!RexxObject::deleteInstanceMethod(RexxString * msgname) Line 
2335C++
                {
                    ...
                    // copy primitive behaviour object and define the method, a 
copy is made to
                    // ensure that we don't update the behaviour of any other 
object, since they
                    // may have been sharing the mvd.
                    setField(behaviour, (RexxBehaviour *)behaviour->copy());
                    ...
                }


        I still don't know the root cause of the crash.
        I protected buffer in RexxActivation::traceSourceString but the crash 
still occurs.

        After the crash, I noticed that the attribute owningClass of the 
behaviour is NULL, which
        is not normal.
        I put a data breakpoint on owningClass but it doesnt trigger.

        But good news:
        If I put in comment the setMakeString & unsetMakeString, no more crash
        (well… I tested only once, maybe I was lucky)

    /[rgf: indeed, commenting out the setMakeString and unsetMakeString tests in
    TRACE_TraceObject.testGroup makes the test suite pass without a crash 
repeatedly]/

        So there is maybe something to investigate around the impacts of this 
assignement of
        behaviour->copy()
        ... cut ...

    Any idea what the problem might be and how to fix it?

    ---rony

    P.S.: Thinking of notable things in this context:

      * setMethod/unsetMethod in this case gets applied to a class object
      * TraceObject subclasses StringTable which in native code subclasses 
StringHashCollection


    On 04.04.2024 19:04, Rony G. Flatscher wrote:

    Am using an almost ten year old version of MVS (Microsfot Visual Studio), 
which was bought
    (but due to lack of money has not been updated by buying an update, newer 
version).

    It seems that I am not able to define a data break point with it for the 
TraceObject
    RexxClass object successfully. MVS in the breakpoint window seems to not be 
able to allow for
    setting a data breakpoint at
    "RexxClass->RexxObject->RexxInternalObject->behaviour->methodDictionary" to 
learn from where
    in the ooRexx runtime this area gets overwritten.

    Therefore, if anyone has newer debugging means and is able to recreate the 
crash, then
    requesting help to debug this strange situation (please see the call stack 
below, the top
    record is not always shown, the crash indicates that 
behaviour->methodDictionary is NULL, yet
    the class object got successfully used many times before in the test suite)!

    Again, if the crash occurs then only after running the test suite with 
"rexx testOORexx.rex
    -s -U" from "test/trunk" in
    "test\trunk\ooRexx\base\runtime.objects\environmentEntries.testGroup". 
Running that test
    group standalone does not crash here.

    Any help highly appreciated!

    ---rony



    On 03.04.2024 17:29, Rony G. Flatscher wrote:
    On 03.04.2024 16:25, ooRexx wrote:
    It seems we currently have ALL platforms failing this test, can the person 
(Rony?) who
    committed lately check if there was a side-effect of the changes and/or 
amend the test to
    the new behaviour.

    Executing .../ooRexx/base/runtime.objects/environmentEntries.testGroup
    /tmp/jenkins3639803152023253797.sh: line 15: 26971 Segmentation fault      
(core dumped)
    rexx testOORexx.rex -s -U
    Build step 'Execute shell' marked build as failure
    Finished: FAILURE

    Could get that crash on my debug version on Windows 10, here the call stack:

                0000000000000000()      Unknown
        >    rexx.dll!MethodDictionary::getMethod(RexxString * 
methodName=0x000001bcdda2bdd0) Line 69        C++
                rexx.dll!RexxBehaviour::methodLookup(RexxString * 
messageName=0x000001bcdda2bdd0) Line 443      C++
                rexx.dll!RexxObject::messageSend(RexxString * 
msgname=0x000001bcdda2bdd0, RexxObject * * arguments=0x0000000000000000, unsigned 
__int64 count=0, ProtectedObject & result={...}) Line 871   C++
                rexx.dll!CreateTraceObject(Activity * 
activity=0x000001bcddc64eb0, RexxActivation * activation=0x000001bcf6a669a0, 
RexxString * traceline=0x000001bcf6a3d2d0) Line 3097 C++
                rexx.dll!Activity::traceOutput(RexxActivation * 
activation=0x000001bcf6a669a0, RexxString * line=0x000001bcf6a3d2d0) Line 3141  
C++
                rexx.dll!RexxActivation::traceSourceString() Line 3912  C++
                rexx.dll!RexxActivation::traceClause(RexxInstruction * 
clause=0x000001bce65e36e0, RexxActivation::TracePrefix 
prefix=TRACE_PREFIX_CLAUSE) Line 4200     C++
                rexx.dll!RexxActivation::traceInstruction(RexxInstruction * 
v=0x000001bce65e36e0) Line 370      C++
                rexx.dll!RexxInstructionAssignment::execute(RexxActivation * 
context=0x000001bcf6a669a0, ExpressionStack * stack=0x000001bcf6a66b08) Line 
118   C++
                rexx.dll!RexxActivation::run(RexxObject * 
_receiver=0x000001bcf0100e50, RexxString * name=0x000001bce65e2600, RexxObject * * 
_arglist=0x000001bcf6a668a0, unsigned __int64 _argcount=0, RexxInstruction * 
start=0x0000000000000000, ProtectedObject & resultObj={...}) Line 626     C++
                rexx.dll!RexxCode::run(Activity * activity=0x000001bcddc64eb0, 
MethodClass * method=0x000001bce65e4db0, RexxObject * receiver=0x000001bcf0100e50, 
RexxString * msgname=0x000001bce65e2600, RexxObject * * argPtr=0x000001bcf6a668a0, 
unsigned __int64 argcount=0, ProtectedObject & result={...}) Line 211  C++
                rexx.dll!MethodClass::run(Activity * activity=0x000001bcddc64eb0, 
RexxObject * receiver=0x000001bcf0100e50, RexxString * msgname=0x000001bce65e2600, 
RexxObject * * argPtr=0x000001bcf6a668a0, unsigned __int64 count=0, ProtectedObject 
& result={...}) Line 172   C++
                rexx.dll!RexxObject::messageSend(RexxString * 
msgname=0x000001bce65e2600, RexxObject * * arguments=0x000001bcf6a668a0, unsigned 
__int64 count=0, ProtectedObject & result={...}) Line 901   C++
                rexx.dll!MessageClass::dispatch() Line 445      C++
                rexx.dll!MessageClass::send() Line 413  C++
                rexx.dll!MessageClass::sendRexx(RexxObject * * 
arguments=0x000001bcde86a5b0, unsigned __int64 argCount=0) Line 329      C++
                rexx.dll!CPPCode::run(Activity * activity=0x000001bcddc64eb0, 
MethodClass * method=0x000001bcddb55b60, RexxObject * receiver=0x000001bcf6a66920, 
RexxString * messageName=0x000001bcddf09290, RexxObject * * 
argPtr=0x000001bcde86a5b0, unsigned __int64 count=0, ProtectedObject & 
result={...}) Line 147  C++
                rexx.dll!MethodClass::run(Activity * activity=0x000001bcddc64eb0, 
RexxObject * receiver=0x000001bcf6a66920, RexxString * msgname=0x000001bcddf09290, 
RexxObject * * argPtr=0x000001bcde86a5b0, unsigned __int64 count=0, ProtectedObject 
& result={...}) Line 172   C++
                rexx.dll!RexxObject::messageSend(RexxString * 
msgname=0x000001bcddf09290, RexxObject * * arguments=0x000001bcde86a5b0, unsigned 
__int64 count=0, ProtectedObject & result={...}) Line 901   C++
                rexx.dll!ExpressionStack::send(RexxString * 
message=0x000001bcddf09290, unsigned __int64 count=0, ProtectedObject & 
result={...}) Line 80   C++
                rexx.dll!RexxInstructionMessage::execute(RexxActivation * 
context=0x000001bcf6a65b30, ExpressionStack * stack=0x000001bcf6a65c98) Line 
189      C++
                rexx.dll!RexxActivation::run(RexxObject * 
_receiver=0x000001bcf0100e50, RexxString * name=0x000001bcddf071c0, RexxObject * * 
_arglist=0x000001bcde86a4e8, unsigned __int64 _argcount=2, RexxInstruction * 
start=0x0000000000000000, ProtectedObject & resultObj={...}) Line 626     C++
                rexx.dll!RexxCode::run(Activity * activity=0x000001bcddc64eb0, 
MethodClass * method=0x000001bcddf0d6e0, RexxObject * receiver=0x000001bcf0100e50, 
RexxString * msgname=0x000001bcddf071c0, RexxObject * * argPtr=0x000001bcde86a4e8, 
unsigned __int64 argcount=2, ProtectedObject & result={...}) Line 211  C++
                rexx.dll!MethodClass::run(Activity * activity=0x000001bcddc64eb0, 
RexxObject * receiver=0x000001bcf0100e50, RexxString * msgname=0x000001bcddf071c0, 
RexxObject * * argPtr=0x000001bcde86a4e8, unsigned __int64 count=2, ProtectedObject 
& result={...}) Line 172   C++
                rexx.dll!RexxObject::messageSend(RexxString * 
msgname=0x000001bcddf071c0, RexxObject * * arguments=0x000001bcde86a4e8, unsigned 
__int64 count=2, ProtectedObject & result={...}) Line 901   C++
                rexx.dll!ExpressionStack::send(RexxString * 
message=0x000001bcddf071c0, unsigned __int64 count=2, ProtectedObject & 
result={...}) Line 80   C++
                rexx.dll!RexxInstructionMessage::execute(RexxActivation * 
context=0x000001bcf6a64640, ExpressionStack * stack=0x000001bcf6a647a8) Line 
189      C++
                rexx.dll!RexxActivation::run(RexxObject * 
_receiver=0x000001bcf0100e50, RexxString * name=0x000001bcddd5fc00, RexxObject * * 
_arglist=0x000001bcde86a418, unsigned __int64 _argcount=2, RexxInstruction * 
start=0x0000000000000000, ProtectedObject & resultObj={...}) Line 626     C++
                rexx.dll!RexxCode::run(Activity * activity=0x000001bcddc64eb0, 
MethodClass * method=0x000001bcddf07fe0, RexxObject * receiver=0x000001bcf0100e50, 
RexxString * msgname=0x000001bcddd5fc00, RexxObject * * argPtr=0x000001bcde86a418, 
unsigned __int64 argcount=2, ProtectedObject & result={...}) Line 211  C++
                rexx.dll!MethodClass::run(Activity * activity=0x000001bcddc64eb0, 
RexxObject * receiver=0x000001bcf0100e50, RexxString * msgname=0x000001bcddd5fc00, 
RexxObject * * argPtr=0x000001bcde86a418, unsigned __int64 count=2, ProtectedObject 
& result={...}) Line 172   C++
                rexx.dll!RexxObject::messageSend(RexxString * 
msgname=0x000001bcddd5fc00, RexxObject * * arguments=0x000001bcde86a418, unsigned 
__int64 count=2, ProtectedObject & result={...}) Line 901   C++
                rexx.dll!ExpressionStack::send(RexxString * 
message=0x000001bcddd5fc00, unsigned __int64 count=2, ProtectedObject & 
result={...}) Line 80   C++
                rexx.dll!RexxInstructionMessage::execute(RexxActivation * 
context=0x000001bcf6a635a0, ExpressionStack * stack=0x000001bcf6a63708) Line 
189      C++
                rexx.dll!RexxActivation::run(RexxObject * 
_receiver=0x000001bcf00f8a20, RexxString * name=0x000001bcddd5fc00, RexxObject * * 
_arglist=0x000001bcde86a348, unsigned __int64 _argcount=2, RexxInstruction * 
start=0x0000000000000000, ProtectedObject & resultObj={...}) Line 626     C++
                rexx.dll!RexxCode::run(Activity * activity=0x000001bcddc64eb0, 
MethodClass * method=0x000001bcddd640c0, RexxObject * receiver=0x000001bcf00f8a20, 
RexxString * msgname=0x000001bcddd5fc00, RexxObject * * argPtr=0x000001bcde86a348, 
unsigned __int64 argcount=2, ProtectedObject & result={...}) Line 211  C++
                rexx.dll!MethodClass::run(Activity * activity=0x000001bcddc64eb0, 
RexxObject * receiver=0x000001bcf00f8a20, RexxString * msgname=0x000001bcddd5fc00, 
RexxObject * * argPtr=0x000001bcde86a348, unsigned __int64 count=2, ProtectedObject 
& result={...}) Line 172   C++
                rexx.dll!RexxObject::messageSend(RexxString * 
msgname=0x000001bcddd5fc00, RexxObject * * arguments=0x000001bcde86a348, unsigned 
__int64 count=2, ProtectedObject & result={...}) Line 901   C++
                rexx.dll!ExpressionStack::send(RexxString * 
message=0x000001bcddd5fc00, unsigned __int64 count=2, ProtectedObject & 
result={...}) Line 80   C++
                rexx.dll!RexxInstructionMessage::execute(RexxActivation * 
context=0x000001bcea737d00, ExpressionStack * stack=0x000001bcea737e68) Line 
189      C++
                rexx.dll!RexxActivation::run(RexxObject * 
_receiver=0x000001bce72e4360, RexxString * name=0x000001bcddc8c310, RexxObject * * 
_arglist=0x000001bcde86a230, unsigned __int64 _argcount=1, RexxInstruction * 
start=0x0000000000000000, ProtectedObject & resultObj={...}) Line 626     C++
                rexx.dll!RexxCode::run(Activity * activity=0x000001bcddc64eb0, 
MethodClass * method=0x000001bcddd640c0, RexxObject * receiver=0x000001bce72e4360, 
RexxString * msgname=0x000001bcddc8c310, RexxObject * * argPtr=0x000001bcde86a230, 
unsigned __int64 argcount=1, ProtectedObject & result={...}) Line 211  C++
                rexx.dll!MethodClass::run(Activity * activity=0x000001bcddc64eb0, 
RexxObject * receiver=0x000001bce72e4360, RexxString * msgname=0x000001bcddc8c310, 
RexxObject * * argPtr=0x000001bcde86a230, unsigned __int64 count=1, ProtectedObject 
& result={...}) Line 172   C++
                rexx.dll!RexxObject::messageSend(RexxString * 
msgname=0x000001bcddc8c310, RexxObject * * arguments=0x000001bcde86a230, unsigned 
__int64 count=1, ProtectedObject & result={...}) Line 901   C++
                rexx.dll!ExpressionStack::send(RexxString * 
message=0x000001bcddc8c310, unsigned __int64 count=1, ProtectedObject & 
result={...}) Line 80   C++
                rexx.dll!RexxInstructionMessage::execute(RexxActivation * 
context=0x000001bcddd25530, ExpressionStack * stack=0x000001bcddd25698) Line 
189      C++
                rexx.dll!RexxActivation::run(RexxObject * 
_receiver=0x0000000000000000, RexxString * name=0x000001bcddc76190, RexxObject * * 
_arglist=0x000001bcde86a120, unsigned __int64 _argcount=1, RexxInstruction * 
start=0x0000000000000000, ProtectedObject & resultObj={...}) Line 626     C++
                rexx.dll!RexxCode::call(Activity * activity=0x000001bcddc64eb0, 
RoutineClass * routine=0x000001bcddd254f0, RexxString * 
routineName=0x000001bcddc76190, RexxObject * * argPtr=0x000001bcde86a120, unsigned 
__int64 argcount=1, RexxString * calltype=0x000001bcddc3d6f0, RexxString * 
environment=0x000001bcddc3d7e0, ActivationContext context=EXTERNALCALL, 
ProtectedObject & result={...}) Line 188      C++
                rexx.dll!RoutineClass::call(Activity * activity=0x000001bcddc64eb0, 
RexxString * routineName=0x000001bcddc76190, RexxObject * * 
argPtr=0x000001bcde86a120, unsigned __int64 argcount=1, RexxString * 
calltype=0x000001bcddc3d6f0, RexxString * environment=0x000001bcddc3d7e0, 
ActivationContext context=EXTERNALCALL, ProtectedObject & result={...}) Line 
194     C++
                rexx.dll!RexxActivation::callExternalRexx(RexxString * 
target=0x000001bcddc76190, RexxObject * * arguments=0x000001bcde86a120, unsigned 
__int64 argcount=1, RexxString * calltype=0x000001bcddc3d6f0, ProtectedObject & 
resultObj={...}) Line 3092  C++
                rexx.dll!SystemInterpreter::invokeExternalFunction(RexxActivation * 
activation=0x000001bcddc7b280, Activity * activity=0x000001bcddc64eb0, RexxString * 
target=0x000001bcddc76190, RexxObject * * arguments=0x000001bcde86a120, unsigned 
__int64 argcount=1, RexxString * calltype=0x000001bcddc3d6f0, ProtectedObject & 
result={...}) Line 107     C++
                rexx.dll!RexxActivation::externalCall(RoutineClass * & 
routine=0x0000000000000000, RexxString * target=0x000001bcddc76190, RexxObject * * 
arguments=0x000001bcde86a120, unsigned __int64 argcount=1, RexxString * 
calltype=0x000001bcddc3d6f0, ProtectedObject & resultObj={...}) Line 3033     C++
                rexx.dll!RexxExpressionFunction::evaluate(RexxActivation * 
context=0x000001bcddc7b280, ExpressionStack * stack=0x000001bcddc7b3e8) Line 
214     C++
                rexx.dll!RexxInstructionAssignment::execute(RexxActivation * 
context=0x000001bcddc7b280, ExpressionStack * stack=0x000001bcddc7b3e8) Line 
129   C++
                rexx.dll!RexxActivation::run(RexxObject * 
_receiver=0x0000000000000000, RexxString * name=0x000001bcddc6b850, RexxObject * * 
_arglist=0x000001bcddc6afb0, unsigned __int64 _argcount=1, RexxInstruction * 
start=0x0000000000000000, ProtectedObject & resultObj={...}) Line 626     C++
                rexx.dll!RexxCode::call(Activity * activity=0x000001bcddc64eb0, 
RoutineClass * routine=0x000001bcddc7b240, RexxString * 
routineName=0x000001bcddc6b850, RexxObject * * argPtr=0x000001bcddc6afb0, unsigned 
__int64 argcount=1, RexxString * calltype=0x000001bcddaa57e0, RexxString * 
environment=0x000001bcddc3d7e0, ActivationContext context=PROGRAMCALL, 
ProtectedObject & result={...}) Line 188       C++
                rexx.dll!RoutineClass::runProgram(Activity * 
activity=0x000001bcddc64eb0, RexxObject * * arguments=0x000001bcddc6afb0, unsigned 
__int64 argCount=1, ProtectedObject & result={...}) Line 265        C++
                rexx.dll!CallProgramDispatcher::run() Line 244  C++
                rexx.dll!NativeActivation::run(ActivityDispatcher & 
dispatcher={...}) Line 1641     C++
                rexx.dll!Activity::run(ActivityDispatcher & target={...}) Line 
3390 C++
                rexx.dll!CallProgram(RexxThreadContext_ * c=0x000001bcddc64ed8, 
const char * p=0x000001bcdba01f9d, _RexxArrayObject * a=0x000001bcddc6af50) 
Line 512    C++
                rexx.exe!RexxThreadContext_::CallProgram(const char * 
n=0x000001bcdba01f9d, _RexxArrayObject * a=0x000001bcddc6af50) Line 1001  C++
                rexx.exe!main(int argc=4, char * * argv=0x000001bcdba01f70) 
Line 226    C++
                rexx.exe!invoke_main() Line 65  C++
                rexx.exe!__scrt_common_main_seh() Line 253      C++
                rexx.exe!__scrt_common_main() Line 296  C++
                rexx.exe!mainCRTStartup() Line 17       C++
                kernel32.dll!BaseThreadInitThunk ()     Unknown
                ntdll.dll!RtlUserThreadStart () Unknown

    The method name to look up is NEW, the call stack points to 
MethodDictionary.hpp, line # 69
    with the following definition:

             MethodClass *getMethod(RexxString *methodName) { return 
(MethodClass *)get(methodName); }

    This is what "Locals" shows:

        -               this    0x000001bcefe354f0 
{objectVariables=0x000001bcf6263640 {reservingActivity=0x0000000000000000 
<NULL> ...} }        MethodDictionary * {RexxObject}
        +               [RexxObject]    {objectVariables=0x000001bcf6263640 
{reservingActivity=0x0000000000000000 <NULL> contents=0x000001bcf62636a0 {...} 
...} } RexxObject
        +               StringHashCollection    {...}   StringHashCollection
        +               instanceMethods 0x00007ffb44414544 {...}        
StringTable *
        +               scopeList       0x0000000000000240 {IndexFlags=??? 
arraySize=??? maximumSize=??? ...}   ArrayClass *
        +               scopeOrders     0x0000000000000202 {...}        
IdentityTable *
        -               methodName      0x000001bcdda2bdd0 {hashValue=77184 length=3 
numberStringValue=0x0000000000000000 <NULL> ...}     RexxString *
        +               RexxObject      {objectVariables=0x0000000000000000 
<NULL> }      RexxObject
                        hashValue       77184   unsigned __int64
                        length  3       unsigned __int64
        +               numberStringValue       0x0000000000000000 <NULL> 
NumberString *
        +               attributes      {flags={bits=18 } }     FlagSet<enum 
RexxString::StringFlag,32>
        +               stringData      0x000001bcdda2be14 "NEW"      char[4]

    Pressing + on some entries:

        -               this    0x000001bcefe354f0 
{objectVariables=0x000001bcf6263640 {reservingActivity=0x0000000000000000 
<NULL> ...} }        MethodDictionary * {RexxObject}
        -               [RexxObject]    {objectVariables=0x000001bcf6263640 
{reservingActivity=0x0000000000000000 <NULL> contents=0x000001bcf62636a0 {...} 
...} } RexxObject
        -               RexxInternalObject      {header={objectSize=48 flags=1 
sizePadding=1 } behaviour=0x000001bce61a7aa0 {classType=T_First_Primitive_Class 
(0) ...} }       RexxInternalObject
        -               RexxVirtualBase {...}   RexxVirtualBase
        -               __vfptr 0x00007ffbbb55a490 {rexx.dll!const 
RexxObject::`vftable'} {0x00007ffbbb26eb92 {rexx.dll!RexxObject::`vector 
deleting destructor'(unsigned int)}, ...}   void * *
                        [0]     0x00007ffbbb26eb92 
{rexx.dll!RexxObject::`vector deleting destructor'(unsigned int)}    void *
                        [1]     0x00007ffbbb26f1c8 
{rexx.dll!RexxVirtualBase::baseVirtual(void)}        void *
                        [2]     0x00007ffbbb262fe0 
{rexx.dll!RexxObject::live(unsigned __int64)}        void *
                        [3]     0x00007ffbbb2694df 
{rexx.dll!RexxObject::liveGeneral(enum MarkReason)}  void *
                        [4]     0x00007ffbbb264340 
{rexx.dll!RexxObject::flatten(class Envelope *)}     void *
                        [5]     0x00007ffbbb2685bc 
{rexx.dll!RexxVirtualBase::unflatten(class Envelope *)}      void *
        +               header  {objectSize=48 flags=1 sizePadding=1 }  
ObjectHeader
        +               behaviour       0x000001bce61a7aa0 
{classType=T_First_Primitive_Class (0) behaviourFlags={flags={bits=1 } } 
methodDictionary=...}       RexxBehaviour *
        -               objectVariables 0x000001bcf6263640 
{reservingActivity=0x0000000000000000 <NULL> contents=0x000001bcf62636a0 {...} 
waitingActivities=...}  VariableDictionary *
        -               RexxInternalObject      {header={objectSize=96 flags=1 
sizePadding=1911095164929 } behaviour=rexx.dll!0x00007ffbbb65a570 
{classType=...} }      RexxInternalObject
        +               RexxVirtualBase {...}   RexxVirtualBase
        +               header  {objectSize=96 flags=1 
sizePadding=1911095164929 }      ObjectHeader
        +               behaviour       rexx.dll!0x00007ffbbb65a570 
{classType=T_VariableDictionary (83) behaviourFlags={flags={bits=4 } } 
methodDictionary=...}        RexxBehaviour *
        +               reservingActivity       0x0000000000000000 <NULL> 
Activity *
        +               contents        0x000001bcf62636a0 {...}        
StringHashContents *
        +               waitingActivities       0x0000000000000000 <NULL> 
ArrayClass *
                        flags   0       unsigned short
                        reserveCount    0       unsigned short
        +               nextDictionary  0x000001bcefe36140 
{reservingActivity=0x0000000000000000 <NULL> contents=0x000001bcefe361a0 {...} 
waitingActivities=...}  VariableDictionary *
        +               scope   0x000001bce61a5e50 {id=0x000001bce6192100 
{hashValue=5558862411515956297 length=18 numberStringValue=...} ...}  RexxClass 
*
                        idntfr  0       unsigned int
        -               StringHashCollection    {...}   StringHashCollection
        +               HashCollection  {contents=0x0000000000000000 <NULL> }   
  HashCollection
        +               instanceMethods 0x00007ffb44414544 {...}        
StringTable *
        +               scopeList       0x0000000000000240 {IndexFlags=??? 
arraySize=??? maximumSize=??? ...}   ArrayClass *
        +               scopeOrders     0x0000000000000202 {...}        
IdentityTable *
        -               methodName      0x000001bcdda2bdd0 {hashValue=77184 length=3 
numberStringValue=0x0000000000000000 <NULL> ...}     RexxString *
        +               RexxObject      {objectVariables=0x0000000000000000 
<NULL> }      RexxObject
                        hashValue       77184   unsigned __int64
                        length  3       unsigned __int64
        +               numberStringValue       0x0000000000000000 <NULL> 
NumberString *
        +               attributes      {flags={bits=18 } }     FlagSet<enum 
RexxString::StringFlag,32>
        +               stringData      0x000001bcdda2be14 "NEW"      char[4]

    Not sure what and where the problem is.

    ---rony

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

Reply via email to