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