The RXOFNC and RXEXF exits are the "oo" exits for which the PARM-block defines 
RexxObjectPtr et.al.
types.

As I am getting a very strange behaviour in both exits when processing the 
argument array it may be
the case that I am not iterating correctly over the array, so here is first the 
definition of the
parameter block according to rexxpg.pdf followed by the code, followed by the 
output and the Rexx
condition raised in it:

    typedef struct _RXOFNC_FLAGS { /* fl */
        unsigned rxfferr : 1; /* Invalid call to routine. */
        unsigned rxffnfnd : 1; /* Function not found. */
        unsigned rxffsub : 1; /* Called as a subroutine */
    } RXOFNC_FLAGS ;

    typedef struct _RXOFNCCAL_PARM { /* fnc */
        RXOFNC_FLAGS rxfnc_flags ; /* function flags */
        CONSTRXSTRING rxfnc_name; // the called function name
        size_t rxfnc_argc; /* Number of args in list. */
        *RexxObjectPtr *rxfnc_argv;* /* Pointer to argument list. */
        RexxObjectPtr rxfnc_retc; /* Return value. */
    } RXOFNCCAL_PARM;


    ---- the program iterating over the rxfnc_argv pointer via a local pointer 
of the same type:

            case RXOFNC:    // system exit # 15, "processes calls to external 
functions, before search starts", OO version
                {
                    RXOFNCCAL_PARM *pb=(RXOFNCCAL_PARM *) parmBlock;

                    if (subfunction==RXOFNCCAL)   // 1
                    {
                        CONSTRXSTRING function_name;
                        size_t         argc=0;
                        *RexxObjectPtr *argv=NULL;*

                        RXOFNCCAL_PARM *pb=(RXOFNCCAL_PARM *) parmBlock;
                        function_name=pb->rxfnc_name;
                        argc         =pb->rxfnc_argc;
                        *argv         =pb->rxfnc_argv;*

    ... cut ...

                            // create RexxArrayObject from RexxObjectPtr list 
and store it as a Java array object
                        RexxArrayObject rao=context->NewArray(argc);
                        for (size_t i=0; i<argc; i++)
                        {
    fprintf(stderr, "C++ RXOFNC -> argv[%lu]=[%p]=[%.128s], before: 
CheckCondition()=[%d]",i,argv[i],context->ObjectToStringValue(argv[i]),context->CheckCondition());fflush(stderr);

                            *context->ArrayPut(rao, argv[i], i);*

    fprintf(stderr, ", after: CheckCondition()=[%d] 
...\n",context->CheckCondition());fflush(stderr);
                        }
    ... cut ...

                    }
                }
                break;


Running the program causes an "incorrect call to method", namely: "Error 
93.907:  Method argument 2
must be a positive whole number; found "&2"". Here is the output, which shows 
that the Rexx
condition is raised in the /ArrayPut() /function:

    C++ RXOFNC/RXEXF -> argp[0]=[7F01AF60]=[*ONE*], before: 
CheckCondition()=[*0*], after: CheckCondition()=[*1*] ...
    C++ RXOFNC/RXEXF -> argp[1]=[7F01AF88]=[TWO], before: CheckCondition()=[1], 
after: CheckCondition()=[1] ...
    Exception in thread "main" org.rexxla.bsf.engines.rexx.RexxException: 
BSF4ooRexx/routine/jniRexxRunProgram(), error 9:
        47 *-* call does_not_exist one, two
    Error 93 running 
F:\work\svn\bsf4oorexx\trunk\samples\Java\handlers\testExitHandlers\12_RXEXF\testRexxWith_RXEXF_Exit.rxj
 line 47:  Incorrect call to method
    Error 93.907:  Method argument 2 must be a positive whole number; found "&2"

And indeed it is this call which triggers the RXOFNC exit in the Rexx statement 
"call does_not_exist
one, two".

The same observation is with the RXEXF exit while processing the arguments.

Is there something I am doing wrong processing the argv pointer to 
RexxObjectPtr the way I am doing it?

BTW, if doing a ClearCondition() immediately after the ArrayPut() everything 
works, but I am not
aware that ArrayPut() would raise such a condition in other parts of my 
program.  (This is now all
running under 4.1.1 beta.)

---rony



------------------------------------------------------------------------------
Keep Your Developer Skills Current with LearnDevNow!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-d2d
_______________________________________________
Oorexx-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to