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 ? Thanks in advance for any help. Mariano |
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. - Bert - |
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 |
As Bert says, it is safer to avoid allacations in the primitive. But Thanks Dave. I was just going to ask why it was "unsafe" but you already answered. I was going to ask an example too, but I got it also :) So...perfect. I just write my primitive with something similar to the FilePlugin example. Thank you very much to both of you. mariano |
On 27.04.2010, at 16:18, Mariano Martinez Peck wrote: > >> 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:. >> > Thanks Dave. I was just going to ask why it was "unsafe" but you already answered. Not quite. There is more to it than just remapping oops. Try to imagine what happens if the allocation fails because there is not enough memory, even after GC. For small allocations there should be enough of a safe margin (hopefully the low-space watcher kicks in early enough). But at least for big allocations you also need to check if they failed. - Bert - > I was going to ask an example too, but I got it also :) > > So...perfect. I just write my primitive with something similar to the FilePlugin example. > > Thank you very much to both of you. > > mariano > > |
On Tue, Apr 27, 2010 at 5:04 PM, Bert Freudenberg <[hidden email]> wrote:
Bert, forgive my ignorance, but I don't understand the difference between allocating object in this place (inside a VM primitive) and allocating objects in the image side. Why in the VM side I should take care about this problems but not when do it from image side ? For small allocations there should be enough of a safe margin (hopefully the low-space watcher kicks in early enough). But at least for big allocations you also need to check if they failed. Ok, thanks. In my particular case, it is an array with just 4 numbers and to get statistics. Thanks Mariano - Bert - |
Free forum by Nabble | Edit this page |