[Vm-dev] How to return an array in a primitive ?

David T. Lewis lewis at mail.msen.com
Tue Apr 27 11:27:26 UTC 2010


On Tue, Apr 27, 2010 at 01:01:33PM +0200, Bert Freudenberg wrote:
> 
> On 27.04.2010, at 11:27, Mariano Martinez Peck wrote:
> > Hi folks. I am writing some primitives in Interpreter and now I need to return more than one value. Of course, in a OOP the ideal would be to return an object that represents the result. That object would also have all the instance variables I want.
> > 
> > So..first question, is it possible to create and push on the stack an object of my own class ?   If true, con can I do it ?
> > 
> > now...suppose I cannot do that, the other option is to create an array with the values I want to return, and then return the array. For this particular case, I have 3 or 4 interegers I would like to put in the array, and push it in the stack. Is this possible ?  If true, how ?
> > 
> > Are there other options for what I need ?
> 
> It is better to avoid allocations in a primitive. So make a 3 or 4 element array, and pass this as argument to the primitive, which fills in the actual values.

As Bert says, it is safer to avoid allacations in the primitive. But
for an example of how to do it properly, see
  FilePlugin>>makeDirEntryName:size:createDate:modDate:isDir:fileSize:

Note the use of #pushRemappableOop: and popRemappableOop, which is required
to prevent the object pointers from changing due to garbage collection.
Allocating an object in the primitive can and will invoke garbage
collection, which leads to nasty intermittent bugs if you do not
use #pushRemappableOop:.

Dave
 


More information about the Vm-dev mailing list