Skip to content

Commit

Permalink
Merge pull request pharo-spec#77 from adri09070/57-p11-SkipUpTo-does-…
Browse files Browse the repository at this point in the history
…not-allow-to-skip-return-nodes-which-prevents-from-skipping-up-to-an-inlined-ifTrue-block-if-there-is-an-inlined-ifFalse-block-before

[P11] Fix: skip up to does not allow to skip return nodes which prevents from skipping up to an inlined if true block if there is an inlined if false block before
  • Loading branch information
StevenCostiou committed Mar 15, 2024
2 parents a1511ec + cf6f67b commit dabe4b5
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 1 deletion.
58 changes: 58 additions & 0 deletions Sindarin-Tests/SindarinDebuggerTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,18 @@ SindarinDebuggerTest >> methodWithSeveralInstructionsInBlock [
^ 42
]

{ #category : #helpers }
SindarinDebuggerTest >> methodWithSeveralReturns [
"There is only one explicit return but there is also an implicit return after `a := 3`. In that sense, there are several returns in this method"

| a |
a := true.
a
ifFalse: [ ^ a := 1 ]
ifTrue: [ a := 2 ].
a := 3
]

{ #category : #helpers }
SindarinDebuggerTest >> methodWithTwoAssignments [

Expand Down Expand Up @@ -1279,6 +1291,52 @@ SindarinDebuggerTest >> testSkipBlockNode [
self assert: scdbg topStack equals: 43
]

{ #category : #tests }
SindarinDebuggerTest >> testSkipCanSkipReturnIfItIsNotTheLastReturn [

| scdbg |
scdbg := SindarinDebugger debug: [ self methodWithSeveralReturns ].

"we step until we arrive on the node `^ a := 1` in `SindarinDebuggerTest>>#methodWithSeveralReturns`."
scdbg
step;
skip;
skip;
step.

self assert: scdbg node isReturn.
self assert: scdbg topStack equals: 1.

"We skip the return node"
self shouldnt: [ scdbg skip ] raise: SindarinSkippingReturnWarning.

"We should be on the `a := 2` node"
self assert: scdbg node isAssignment.
self assert: scdbg node value value equals: 2
]

{ #category : #tests }
SindarinDebuggerTest >> testSkipCannotSkipReturnIfItIsTheLastReturn [

| scdbg nodeWithImplicitReturn |
scdbg := SindarinDebugger debug: [ self methodWithSeveralReturns ].

"we step until we arrive on the method node in `SindarinDebuggerTest>>#methodWithSeveralReturns`, which is mapped to the implicit return bycode."
scdbg step.
nodeWithImplicitReturn := scdbg methodNode.
3 timesRepeat: [ scdbg step ].

self assert: scdbg node identicalTo: nodeWithImplicitReturn.
self assert: scdbg context instructionStream willReturn.

"We skip the return node"
self should: [ scdbg skip ] raise: SindarinSkippingReturnWarning.

"We should still be on the method node"
self assert: scdbg node identicalTo: nodeWithImplicitReturn.
self assert: scdbg context instructionStream willReturn
]

{ #category : #tests }
SindarinDebuggerTest >> testSkipDoesNotSkipReturn [

Expand Down
20 changes: 19 additions & 1 deletion Sindarin/SindarinDebugger.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -686,7 +686,25 @@ SindarinDebugger >> skipMessageNodeWith: replacementValue [
{ #category : #'stepping - skip' }
SindarinDebugger >> skipReturnNode [

^ SindarinSkippingReturnWarning signal: 'Cannot skip a return node'
| node allReturnNodes currentBytecode |
node := self node.

"We collect the list of nodes associated to a return bytecode, via the IR"
allReturnNodes := self method ir children flatCollect: [ :irSequence |
irSequence sequence
select: [ :irInstruction |
irInstruction isReturn ]
thenCollect: [ :irInstruction |
irInstruction sourceNode ] ].
"If this is the last node of the method that is mapped to a return bytecode, we can't skip it and we stop there."
node == allReturnNodes last ifTrue: [
^ SindarinSkippingReturnWarning signal:
'Cannot skip the last return in the method' ].

currentBytecode := self nextBytecode.
self context pc: self context pc + currentBytecode bytes size.
self debugSession stepToFirstInterestingBytecodeWithJumpIn:
self debugSession interruptedProcess
]

{ #category : #'stepping - skip' }
Expand Down

0 comments on commit dabe4b5

Please sign in to comment.