On 12.07.2024 01:16, Rick McGuire wrote:
I still think the code refactoring I suggested is a good idea, which will make 
things a bit cleaner.

+1


However, I just realized that the original problem could have been fixed by 
just adding

enum TracePrefix;

where the class definitions at the top of Activity.cpp are located.

As the first error occurs with compiling the ArrayClass.cpp Activity.hpp also got that definition added and it makes it compile.

However, later when RexxActivation.cpp gets compiled the following error gets 
raised:

   [ 17%] Building CXX object 
CMakeFiles/rexx.dir/interpreter/execution/RexxActivation.cpp.obj
   RexxActivation.cpp
   
D:\orx.work202312\main_trunk_20240312\trunk\interpreter\execution\RexxActivation.cpp(3674):
   error C2664: 'void Activity::traceOutput(RexxActivation *,RexxString 
*,TracePrefix,RexxObject
   *,RexxObject *)': cannot convert argument 3 from 
'RexxActivation::TracePrefix' to 'TracePrefix'

---rony



On Thu, Jul 11, 2024 at 12:29 PM Rony G. Flatscher <rony.flatsc...@wu.ac.at> 
wrote:

    On 11.07.2024 18:26, Rick McGuire wrote:


    On Thu, Jul 11, 2024 at 12:20 PM Rony G. Flatscher 
<rony.flatsc...@wu.ac.at> wrote:

        On 11.07.2024 17:52, Rick McGuire wrote:
        I'm going to answer this out of line because I want to answer the last 
question first.

        Thank you!


        The problem with the compile error results in how RexxActivation is 
defined in
        Activity.hpp. It's declaration is just "class RexxActivation", which 
tells the compiler
        that RexxActivation is a class...and nothing else. This allows 
RexxActivation * to be
        used in prototypes since there is enough information available for that 
purpose. To get
        the full definition of RexxActivation, you would need to replace "class 
RexxActivation"
        with "#include "RexxActivation.hpp". However, I suspect doing that will 
result in some
        circular dependencies between the two header files.

        Indeed.


        Any you would probably need to define Activity as friend to the 
RexxActivation class to
        make that enum visible.

        Given the relationship between RexxActivation and Activity, and that 
both classes need
        the information, having the enum defined in RexxActivation feels like 
the wrong place to
        for that to be located. It feels like it should belong in Activity. 
However, those
        values are really only used for things created for RexxActivation.

        A better solution would be to refactor the code a bit. 
Activity::traceOutput() . The
        first two lines of TraceOutput deal with the creation of the 
TraceObject, which really
        should be something that the RexxActivation is responsible for. Move 
the stuff involved
        with that to RexxActivation and then only pass the constructed 
TraceObject to the
        traceOutput() method which is now just responsible for handling the 
output. Now there's
        no need for TracePrefix to be visible outside of RexxActivation.

        There are the following places in Activity that cause the use of 
traceOutput() directly
        and indirectly:

         *

            wholenumber_t Activity::error()

            /** Force error termination on an activity, returning the resulting 
REXX error code.
            * @return The resulting Rexx error code. */

         *

            wholenumber_t Activity::error(ActivationBase *activation, 
DirectoryClass *errorInfo)

            /** Force error termination on an activity, returning the resulting 
REXX error code.
              * @param activation The activation raising the error.
              * @param errorInfo  The directory containing the error condition 
information.
              * @return The Rexx error code.  */

         *

            wholenumber_t Activity::displayCondition(DirectoryClass *errorInfo)

            /** Display error information and traceback lines for a Syntax 
condition.
              * @param errorInfo The condition object with the error information
              * @return The major error code for the syntax error, if this is  
indeed a syntax conditon. */

         *

            void Activity::display(DirectoryClass *exobj) ...

            /** Display information from an exception object.  *@param exobj  
The exception object.  */

         *

            void Activity::displayDebug(DirectoryClass *exobj)

            /** Display information about an error in interactive debug. @param 
exobj  The exception  */+


    Only the last two of these are relevant, since the others just call those. 
If the creation of
    the trace object is a method of RexxActivation(), that method is just 
called to get the
    information needed by traceOutput().

    ah, ok, thank you!

    ---rony

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

Reply via email to