I inherited some legacy MUMPS / ObjectScript code. A code review identified an exclusive NEW and that is not allowed per our coding standards.
The original code contains:
RUN(CALL,DRVNAME)
S $EC=""
S ^TMP($J,"RMPV","DRVNAME")=DRVNAME
N TMPFILE,OLDIO
S OLDIO=$IO
I $G(^TMP("RMPV","SILENT"),1) S IOP="NULL",%ZIS=0 D ^%ZIS I '$G(POP,1) U IO
D INIT^@DRVNAME
D ; scope variables
.N (DUZ,CALL) ; Protect %response
.S IOF="""""",IOM=80,U="^"
.D @CALL
U OLDIO
Q
I attempted to replace Exclusive NEW with a ClassMethod in a procedure block as follows:
RUN(CALL,DRVNAME) ;primary entry point
Set ^OLIVER(0-$I(^OLIVER)) = $ZDateTime($NOW(),8,1,3)_" : "_$JOB_"/"_$STACK_" : RUN1^RMPVDRV"
Set ^OLIVER(0-$G(^OLIVER),"CALL")=CALL
Set ^OLIVER(0-$G(^OLIVER),"DRVNAME")=DRVNAME
Merge ^OLIVER(0-$G(^OLIVER),"DUZ")=DUZ
If '$Data(DUZ) Set DUZ=$Get(^OLIVER)
If '$D(^OLIVER) S $EC=""
S ^TMP($J,"RMPV","DRVNAME")=DRVNAME
N TMPFILE,OLDIO
S OLDIO543=$IO
I $G(^TMP("RMPV","SILENT"),1) S IOP="NULL",%ZIS=0 D ^%ZIS I '$G(POP,1) U IO
Set ^OLIVER(0-$G(^OLIVER),"SILENT")=$G(^TMP("RMPV","SILENT"),1)
D INIT^@DRVNAME
Set ^OLIVER(0-$I(^OLIVER),"OLDIO1")=OLDIO543
//D ; scope variables
//.;N (DUZ,CALL) ; Protect %response
//.S IOF="""""",IOM=80,U="^"
//.Do @CALL
Do ##class(VALIP.REST.Implementation.Generic).doCall(CALL,DUZ)
Set ^OLIVER(0-$I(^OLIVER)) = $ZDateTime($NOW(),8,1,3)_" : "_$JOB_"/"_$STACK_" : RUN2^RMPVDRV"
Set ^OLIVER(0-$I(^OLIVER),"OLDIO2 in RMPVDRV")=$Get(OLDIO543)
U OLDIO543
Q
I see <UNDEFINED> error when I try to U OLDIO543. All my variables have gone. What happened? Or how can I replace Exclusive NEW?
Here is the class with my new ClassMethod:
Class VALIP.REST.Implementation.Generic [ ProcedureBlock ]
{
/// Protect %response
ClassMethod doCall(CALL, DUZ) [ PublicList = (CALL, DUZ) ]
{
Try {
Set IOF="""""",IOM=80,U="^"
Do @CALL
Quit
} Catch exp {
Set ^OLIVER(0-$I(^OLIVER)) = $ZDateTime($NOW(),8,1,3)_" : "_$JOB_" : Catch in VALIP.REST.Implementation.Generic"
Set ^OLIVER(0-$G(^OLIVER),"$ZERROR") = $ZERROR
Set ^OLIVER(0-$G(^OLIVER),"exp") = exp
}
Quit
}
}