Question
· Mar 1, 2018

GetSwizzled error in cache

 I  keep seeing  <INVALID OREF>zMypropertyGetSwizzled+3^myClass.2  in the error log.  In my case,  Myproperty   is a property of  myClass. And Myproperty points to the the object of other class in the system. This error happens to 2 properties in the same class, and they are both object properties. This error pops up occasionally, and make the debugging harder.

Anyone knows what the issues are?

TIA

Discussion (14)0
Log in or sign up to continue

class myClass extends (%persisten)

{

Property Someproperty As %String;

...

Property Myproperty1 As   OtherClass1;

Property Myproperty2 As  OtherClass2;

... some more other property total 215 properties in this class

}

class OtherClass1 extends (%persisten)

{

Property OtherClass1Property As %String;

}

ClassMethod myfuct( id) As %String

{

set ref=##class(myClass).%OpenId(id)

set str="my return: "_ref.Myproperty1.OtherClass1Property

quit str

}

Above is a  similar situation and codes. When myfuct is called, sometimes it throws a  <INVALID OREF> zMypropertyGetSwizzled+3^myClass.2

myClass is  a very busy table.

zMypropertyGetSwizzled(%this) public {
If $zobjval(,/*i% Myproperty */163,0,3,163)="" Quit ""
Set oref=##class( OtherClass ).%Open($select($zobjval(,/*i%Myproperty*/163,0,3,163)="":"",1:$listbuild($zobjval(,/*i% Myproperty */163,0,3,163)_""))) If oref="" Quit ""
Set modstate=$zobjval(,0) Set $zobjval(,/*r%Myproperty*/164,0,3,164)=oref Set $zobjval(,0)=$e(modstate,1,$l(modstate)\2)_$e($zobjval(,0),$l(modstate)\2+1,*)
Quit oref }

the code causing the problem in MyClass.2.int looks most likely like this:

Set oid=$select(i%Myproperty="":"",1:$listbuild(i%Myproperty_""))

you are inside an ObjectMethod   and miss the actual Object  reference.
This happens when you try to access a property inside a Classmethod.
 classic mistake:

ClassMethod MyMethod(1,2,3) as %Status {
 set x=..Myproperty
}

correct use: 

ClassMethod MyMethod(oref,1,2,3) as %Status {
 set x=oref.Myproperty
}