On 25 January 2008 Mikhail Fursov wrote: > > > Another problem here: in lazy resolution mode we need to 'vpark' all > > > registers for CCONV_HELPERS calls too. > > > > Hmm... I am not yet experienced with JIT well enough to understand this. > > I have seen vpark calls in many places but I don't know what it does > > and why it is inserted. Could you please explain in a few words? BTW > > vpark is done at the beginning of the gen_invoke for the CallSig of the > > method. > > vpark(AR) moves data from AR to memory. Doing this for CCONV_MANAGED we > ensure that all registers that are required by calling convention to > perform a managed call do not contain any information. But in lazy mode we > perform not only managed method call, but also a helper call to resolve the > address of the method. So, CCONV_HELPERS registers are also must be freed. > The crash can be reproduced only when calling conventions of these methods > use different sets of registers.
I see. I added vpark() before helper calls in the patch yesterday. I hope it was placed in the right places (this is one thing I doubt about). I vaguely remember that there were some tests on lazy resolution in some test suite. Could you please give me a pointer? So far I found only one bug when rth_checkcast_withresolve is called from managed code with corrupted object argument. I am working on it. But I would also like to run any other possible tests on lazy resolution before I can say that it seems to work. -- Gregory
