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
Comments
Please post this line of code (Open myClass -> See other code -> zMypropertyGetSwizzled routine, third line) :
zMypropertyGetSwizzled+3^myClass.2
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.
You need to press "View other code" button (or Ctrl+Shift+V) and post zMypropertyGetSwizzled routine.
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 }
In the above sample, Myproperty can be Myproperty1 or Myproperty2. Any thoughts?
you do
set ref=##class(myClass).%OpenId(id)
but you don't check if you really got an object. the id might be invalid
continue with
if '$isobject(ref) quit ""
It is valid in the db, just not getting it. Don't know why. I am new to this.
you need an oref in ref
and also in Myproperty1, ...
So you have to check both . see answer
Thanks! very Interesting find. I will try that tomorrow. GetSwizzled means getting object from memory or what? I don't quite understand this.
simplified you could translate it to "lazy loading" if not in memory
more: http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_persobj_swizzling
It shouldn't compile at all.
OP please post
w $zv
the code causing the problem in MyClass.2.int looks most likely like this:
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:
set x=..Myproperty
}
correct use:
set x=oref.Myproperty
}
Those codes are not real codes, just give an idea what is happening ( I can't post real codes). The real codes works fine until couple days ago I start seeing those errors.
the $zv returns:
Cache for UNIX (IBM AIX for System P5-64) 2010.2.4 (Build 802_1_17238) Tue Apr 4 2017 19:48:24 EDT
{
set ref=##class(myClass).%OpenId(id)
if '$isrobject(ref.Myproperty1) quit "no object 2, no return"
quit str
}