[Vm-dev] [squeak-dev] Endless recursion: "String new: -1"

Tobias Pape Das.Linux at gmx.de
Thu Jul 7 17:27:57 UTC 2016


On 07.07.2016, at 18:44, Eliot Miranda <eliot.miranda at gmail.com> wrote:

> On Thu, Jul 7, 2016 at 5:42 AM, Tobias Pape <Das.Linux at gmx.de> wrote:
> 
> Hi all
> 
> (cc vm-dev)
> On 07.07.2016, at 14:28, David T. Lewis <lewis at mail.msen.com> wrote:
> 
> > I think the problem is in the primitive error code checking. The primitive
> > is failing with #'bad argument' but the fallback code attempts to handle it
> > as #'insufficient object memory'. It then tries to free some memory, fails
> > to correct the problem, and raises a "Space is low" notifier.
> >
> 
> I noted that when we moved to Spur initially and I tried to fix tests.
> The AllocationTest failed, and I changed
> 
>         ec == #'insufficient object memory' ifTrue:
> 
> to
>         (ec == #'insufficient object memory' or: [ec == #'bad argument']) ifTrue:
> 
> in Behavior>>#basicNew:
> 
> Maybe that was an error?
> 
> @Eliot, why does Spur return #'bad argument' instead of #'insufficient object memory' when
> too much memory is to be allocated?
> 
> It doesn't.  It answers bad argument for anything other than an integer in the range 0 to 2^32-1 or 0 to 2^64-1.

But logically, it should return #'insufficient object memory' for > 2^64-1.

Your change to return #'bad argument' with Spur broke AllocationTest>>#testOutOfMemorySignal which
worked on pre-Spur Cog and interpreter. 

Best regards
	-Tobias

PS: the test that predates spur:

testOutOfMemorySignal
	"Ensure that OOM is signaled eventually"
	| sz |
	sz := 512*1024*1024. "work around the 1GB alloc bug"
	self should:[(1 to: 2000) collect:[:i| Array new: sz]] raise: OutOfMemory.

	"Call me when this test fails, I want your machine"
	sz := 1024*1024*1024*1024.
	self should:[Array new: sz] raise: OutOfMemory.

The test failed, technically you have to call David lewis now ;)



>  I think your commit of topa 10/7/2015 20:41 for Behavior>>basicNew: is wrong, and should be reverted.
> 
> 
> Best regards
>         -Tobias
> 
> 
> > Dave
> >
> >
> > On Thu, Jul 07, 2016 at 09:23:14AM +0200, Levente Uzonyi wrote:
> >> Someone seems to have trimmed the versions in the changes file. In Squeak
> >> 4.4 Behavior >> #basicNew: had the following body:
> >>
> >>      <primitive: 71>
> >>      self isVariable ifFalse:
> >>              [self error: self printString, ' cannot have variable sized
> >>              instances'].
> >>      (sizeRequested isInteger and: [sizeRequested >= 0]) ifTrue:
> >>              ["arg okay; space must be low."
> >>              OutOfMemory signal.
> >>              ^ self basicNew: sizeRequested  "retry if user proceeds"].
> >>      self primitiveFailed
> >>
> >> So, non-integer and negative arguments were primitive failures.
> >>
> >> Levente
> >>
> >>
> >> On Wed, 6 Jul 2016, David T. Lewis wrote:
> >>
> >>> On Wed, Jul 06, 2016 at 06:43:25AM -0700, marcel.taeumel wrote:
> >>>> Hi, there!
> >>>>
> >>>> Is it okay that there is an endless recursion when evaluating "String
> >>>> new: -1"?
> >>>
> >>> No, it is not okay. It should fail with a primitive failure.
> >>>
> >>> Dave
> >>>
> >>>
> >>>>
> >>>> ...
> >>>> ByteString class(Behavior)>>handleFailingFailingBasicNew:
> >>>> ByteString class(Behavior)>>handleFailingBasicNew:
> >>>> ByteString class(Behavior)>>basicNew:
> >>>> ByteString class(Behavior)>>handleFailingFailingBasicNew:
> >>>> ByteString class(Behavior)>>handleFailingBasicNew:
> >>>> ByteString class(Behavior)>>basicNew:
> >>>> ByteString class(Behavior)>>handleFailingFailingBasicNew:
> >>>> ByteString class(Behavior)>>handleFailingBasicNew:
> >>>> ByteString class(Behavior)>>basicNew:
> >>>> ...
> >>>>
> >>>> I would like to have an error signaled instead. Note that the -1 is just
> >>>> an
> >>>> example for a bad computation. The error I get is "Space is low" then. :-)
> >>>>
> >>>>
> >>>> Best,
> >>>> Marcel
> >>>>
> >>>>
> >>>>





More information about the Vm-dev mailing list