What if you did something like: RecursiveObject>>#recurse | data | data := Array new: 1e5. self recurse. ^ data
This way, you should run out of heap before the stack gets too large, since you allocate and hold on to an array in each frame. > On 25 Apr 2019, at 14:56, Esteban Maringolo <[email protected]> wrote: > > I downloaded a fresh 7.0.3 image and VM, created the above class and > method, and called it. > > The image is running in Ubuntu within a VirtualBox with 4GB RAM. > > Such exception was not triggered in my image when it actually filled > all the available OS RAM, and I had to kill it using the operative > system process manager. > > If I call it and press Alt+. right away it halts the execution (if > running on the main thread). > In Dolphin, because it is not JITted, it is instantaneous after a long > chain of calls. > > Crashing the image by such a simple to make mistake should be avoided. > Fortunately we have other tools such as Epicea to recover changes, but > even still. > > > Regards, > > Esteban A. Maringolo > > On Thu, Apr 25, 2019 at 9:47 AM Sven Van Caekenberghe <[email protected]> wrote: >> >> We also have an OutOfMemory exception, we even have tests provoking such a >> situation (check usage). >> >> However, I believe such tight loops end up in JIT machine code. >> >> Checking stack overflow on each stack manipulation is costly. >> >> But I totally agree that we should try to catch these situations even if >> there is a cost. >> >>> On 25 Apr 2019, at 14:39, Esteban Maringolo <[email protected]> wrote: >>> >>> I just checked in VisualWorks, where I also develop Seaside and also >>> make these mistakes, and these recursions launch a "Process Monitor >>> Emergency: No space left" process monitor, with the option of killing >>> any running Smalltalk process. >>> >>> Regards, >>> >>> Esteban A. Maringolo >>> >>> On Thu, Apr 25, 2019 at 9:30 AM Esteban Maringolo <[email protected]> >>> wrote: >>>> >>>> Hi, >>>> >>>> Is there a way to add deep recursion protection to the system? >>>> >>>> eg. >>>> RecursiveObject>>#recurse >>>> self recurse >>>> >>>> So calling `RecursiveObject new recurse` in Dolphin raises an >>>> exception right away... >>>> >>>> Throws the following error with this stack: >>>> ProcessorScheduler>>stackOverflow: >>>> [] in ProcessorScheduler>>vmi:list:no:with: >>>> BlockClosure>>ifCurtailed: >>>> ProcessorScheduler>>vmi:list:no:with: >>>> RecursiveObject>>recurse >>>> RecursiveObject>>recurse >>>> >>>> In Pharo it goes forever until it hits the memory limit (3.6GiB), at >>>> which point doing an Alt+. is useless and you have to kill the VM. >>>> >>>> The example is pretty simple, but when doing Seaside rendering, it is >>>> easy to miss some return, causing the receiver to render recursively, >>>> turning your image useless. >>>> >>>> e.g. >>>> MyComponent>>renderContentOn: html >>>> html render: self someSubComponent >>>> >>>> MyComponent>>someSubComponent >>>> "Here I forget returning the subcomponent" >>>> someSubComponent ifNil: [someSubcomponent := OtherComponent new]. >>>> >>>> When you render MyComponent... boom, because >>>> #MyComponent>>#renderContentOn: will be called recursively. >>>> >>>> Regards, >>>> >>>> Esteban A. Maringolo >>> >> >> >
