Hi Henry, Hi Marcus,
On Sun, Aug 13, 2017 at 5:08 AM, henry <henry@callistohouse.club> wrote:
Hi all. I was testing with this eventual_test package and it blows up the pharo 6.1 vm. I'd welcome pointers
- HH
I took a look at this and I think you've found a bug in the mustBeBooleanMagic: code. What's happening is a mustBeBoolean in Integer>>* due to evaluating10 * 42 eventualin RefsTest>>testFailureArithmeticPrimitivesWithPromiseArgument
Since 42 eventual is a NearERef the SmallInteger>>* primitive fails and does ^super * anInteger (where anInteger is the NearERef). So that evaluates Integer>>*
Integer>>* aNumber"Refer to the comment in Number * "aNumber isInteger ifTrue:[^ self digitMultiply: aNumberneg: self negative ~~ aNumber negative].^ aNumber adaptToInteger: self andSend: #*
aNumber, being a NearERef, answers a PromiseERef for the isInteger send, and this provokes a mustBeBoolean for the isInteger ifTrue: [...
After the mustBeBooleanMagic: the stack looks wrong. The activation of Integer>>*, which is about to do^ aNumber adaptToInteger: self andSend: #*does not have enough items on the stack. Instead of containinga NearERef (for 42)10#*it containsa PromiseERef (for 42 eventual isInteger)
and the send of #adaptToInteger:andSend: ends up taking more form the stack than the VM can handle and it crashes. The bug appears to be with the use of sendNode irInstruction nextBytecodeOffsetAfterJump in Object>>mustBeBooleanMagic: since execution should resume at bytecode 55 below, but does so at bytecode 57
41 <10> pushTemp: 042 <D0> send: isInteger43 <AC 09> jumpFalse: 5445 <70> self46 <10> pushTemp: 047 <70> self48 <D1> send: negative49 <10> pushTemp: 050 <D1> send: negative51 <E2> send: ~~52 <F3> send: digitMultiply:neg:53 <7C> returnTop54 <10> pushTemp: 055 <70> self56 <24> pushConstant: #*57 <F5> send: adaptToInteger:andSend:58 <7C> returnTop
So the positioning of the context's pc must be before any argument marshaling for the next send, not simply the send itself.
Put a breakpoint at the end of Object>>mustBeBooleanMagic: and add initlaPC and resumePC temporaries at the beginning and capture them viainitialPC := context pc.at the beginning and thencontext pc: (resumePC := sendNode irInstruction nextBytecodeOffsetAfterJump)to see what I'm seeing.
Phew. Glad it's not a VM bug :-)
HTH_,,,^..^,,,_best, Eliot