From 6b4de4bcb32c1f67a65ec0d7e06daaf9918eac0a Mon Sep 17 00:00:00 2001 From: adri09070 <97704417+adri09070@users.noreply.github.com> Date: Thu, 18 Aug 2022 16:17:30 +0200 Subject: [PATCH 1/5] updating ASTInterpreter and visitors according to nez API for TemporaryVariable and ArgumentVariable --- DebuggableASTInterpreter/DASTInterpreter.class.st | 5 +++++ .../DASTPostOrderTreeVisitor.class.st | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/DebuggableASTInterpreter/DASTInterpreter.class.st b/DebuggableASTInterpreter/DASTInterpreter.class.st index d0970dd..bff841c 100644 --- a/DebuggableASTInterpreter/DASTInterpreter.class.st +++ b/DebuggableASTInterpreter/DASTInterpreter.class.st @@ -310,6 +310,11 @@ DASTInterpreter >> visitArgumentNode: aRBArgumentNode [ self stackPush: (currentContext findVariable: aRBArgumentNode name) ] +{ #category : #visiting } +DASTInterpreter >> visitArgumentVariableNode: aRBVariableNode [ + self visitVariableNode: aRBVariableNode . +] + { #category : #visiting } DASTInterpreter >> visitArrayNode: aRBArrayNode [ | literals size arrayMirror | diff --git a/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st b/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st index 75436db..1716250 100644 --- a/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st +++ b/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st @@ -37,6 +37,12 @@ DASTPostOrderTreeVisitor >> visitArgumentNode: aRBArgumentNode [ ^ stack push: aRBArgumentNode ] +{ #category : #visiting } +DASTPostOrderTreeVisitor >> visitArgumentVariableNode: aRBVariableNode [ + + stack push: aRBVariableNode +] + { #category : #visiting } DASTPostOrderTreeVisitor >> visitArrayNode: aRBArrayNode [ stack push: aRBArrayNode. @@ -138,6 +144,12 @@ DASTPostOrderTreeVisitor >> visitTemporaryNode: aRBTemporaryNode [ stack push: aRBTemporaryNode ] +{ #category : #visiting } +DASTPostOrderTreeVisitor >> visitTemporaryVariableNode: aRBVariableNode [ + + stack push: aRBVariableNode +] + { #category : #visiting } DASTPostOrderTreeVisitor >> visitThisContextNode: aRBThisContextNode [ stack push: aRBThisContextNode From 474dbd3c6efa8a550d614b3e05cbdc87de81f56e Mon Sep 17 00:00:00 2001 From: adri09070 <97704417+adri09070@users.noreply.github.com> Date: Tue, 30 Aug 2022 12:08:04 +0200 Subject: [PATCH 2/5] updating ASTInterpreter and ASTPostOrderTreeVisitor according to new AST Visitor API --- .../DASTInterpreter.class.st | 27 +++++++++++++++++ .../DASTPostOrderTreeVisitor.class.st | 29 ++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/DebuggableASTInterpreter/DASTInterpreter.class.st b/DebuggableASTInterpreter/DASTInterpreter.class.st index bff841c..2efd49c 100644 --- a/DebuggableASTInterpreter/DASTInterpreter.class.st +++ b/DebuggableASTInterpreter/DASTInterpreter.class.st @@ -347,6 +347,12 @@ DASTInterpreter >> visitCascadeNode: aRBCascadeNode [ self flag: 'I do nothing'. ] +{ #category : #visiting } +DASTInterpreter >> visitClassVariableNode: aNode [ + + ^ self visitLiteralVariableNode: aNode +] + { #category : #visiting } DASTInterpreter >> visitGlobalNode: aRBGlobalNode [ @@ -354,6 +360,12 @@ DASTInterpreter >> visitGlobalNode: aRBGlobalNode [ ] +{ #category : #visiting } +DASTInterpreter >> visitGlobalVariableNode: aNode [ + + ^ self visitLiteralVariableNode: aNode +] + { #category : #visiting } DASTInterpreter >> visitInstanceVariableNode: aRBInstanceVariableNode [ self stackPush: (self readInstanceVariableNamed: aRBInstanceVariableNode name) @@ -379,6 +391,21 @@ DASTInterpreter >> visitLiteralValueNode: aRBLiteralValueNode [ self visitLiteralNode: aRBLiteralValueNode ] +{ #category : #visiting } +DASTInterpreter >> visitLiteralVariableNode: aNode [ + "to be backward compatible, we visit for Gloabls here (there used to be no difference)" + + ^ self visitGlobalNode: aNode +] + +{ #category : #visiting } +DASTInterpreter >> visitLocalVariableNode: aNode [ + + "call visitTemporaryNode: for backward compatibility" + + ^ self visitTemporaryNode: aNode +] + { #category : #visiting } DASTInterpreter >> visitMessageNode: aRBMessageNode [ | arguments receiver method newContext | diff --git a/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st b/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st index 1716250..4e8af2e 100644 --- a/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st +++ b/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st @@ -67,11 +67,23 @@ DASTPostOrderTreeVisitor >> visitCascadeNode: aRBCascadeNode [ aRBCascadeNode children reverse do: [ :e | e acceptVisitor: self ] ] +{ #category : #visiting } +DASTPostOrderTreeVisitor >> visitClassVariableNode: aNode [ + + ^ self visitLiteralVariableNode: aNode +] + { #category : #visiting } DASTPostOrderTreeVisitor >> visitGlobalNode: aRBGlobalNode [ stack push: aRBGlobalNode ] +{ #category : #visiting } +DASTPostOrderTreeVisitor >> visitGlobalVariableNode: aNode [ + + ^ self visitLiteralVariableNode: aNode +] + { #category : #visiting } DASTPostOrderTreeVisitor >> visitInstanceVariableNode: aRBInstanceVariableNode [ stack push: aRBInstanceVariableNode @@ -95,6 +107,21 @@ DASTPostOrderTreeVisitor >> visitLiteralValueNode: aRBLiteralValueNode [ ^ self visitLiteralNode: aRBLiteralValueNode ] +{ #category : #visiting } +DASTPostOrderTreeVisitor >> visitLiteralVariableNode: aNode [ + "to be backward compatible, we visit for Gloabls here (there used to be no difference)" + + ^ self visitGlobalNode: aNode +] + +{ #category : #visiting } +DASTPostOrderTreeVisitor >> visitLocalVariableNode: aNode [ + + "call visitTemporaryNode: for backward compatibility" + + ^ self visitTemporaryNode: aNode +] + { #category : #visiting } DASTPostOrderTreeVisitor >> visitMessageNode: aRBMessageNode [ @@ -139,7 +166,7 @@ DASTPostOrderTreeVisitor >> visitSuperNode: aRBSuperNode [ ^ stack push: aRBSuperNode ] -{ #category : #'as yet unclassified' } +{ #category : #visiting } DASTPostOrderTreeVisitor >> visitTemporaryNode: aRBTemporaryNode [ stack push: aRBTemporaryNode ] From 91d5689100516379577dcfb0bfb45da09d3e488e Mon Sep 17 00:00:00 2001 From: adri09070 <97704417+adri09070@users.noreply.github.com> Date: Tue, 6 Sep 2022 16:45:29 +0200 Subject: [PATCH 3/5] removing deprecated spec-debugger dependency + adding espell dependency to the baseline --- ...aselineOfDebuggableASTInterpreter.class.st | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/BaselineOfDebuggableASTInterpreter/BaselineOfDebuggableASTInterpreter.class.st b/BaselineOfDebuggableASTInterpreter/BaselineOfDebuggableASTInterpreter.class.st index 442f871..803bc35 100644 --- a/BaselineOfDebuggableASTInterpreter/BaselineOfDebuggableASTInterpreter.class.st +++ b/BaselineOfDebuggableASTInterpreter/BaselineOfDebuggableASTInterpreter.class.st @@ -8,27 +8,28 @@ Class { BaselineOfDebuggableASTInterpreter >> baseline: spec [ - spec - for: #common - do: [ - "Dependencies" - spec - baseline: 'SpecDebugger' - with: [ spec repository: 'github://dupriezt/Spec-Debugger' ]. - spec - baseline: 'Ghost' - with: [ spec repository: 'gitlab://gitlab.inria.fr:RMOD/Ghost' ]. - - "Packages" - spec - package: 'DebuggableASTInterpreter'; - package: 'DebuggableASTDebugger' with: [ spec requires: #('DebuggableASTInterpreter' 'SpecDebugger') ]; - package: 'DebuggableASTInterpreterOverlays' with: [ spec requires: #('DebuggableASTDebugger' 'Ghost') ]]. + spec for: #common do: [ "Dependencies" + spec + baseline: 'Espell' + with: [ spec repository: 'github://guillep/espell' ]. + spec + baseline: 'Ghost' + with: [ spec repository: 'gitlab://gitlab.inria.fr:RMOD/Ghost' ]. + + "Packages" + spec + package: 'DebuggableASTInterpreter' + with: [ spec requires: #( 'Espell' ) ]; + package: 'DebuggableASTDebugger' + with: [ spec requires: #( 'DebuggableASTInterpreter' ) ]; + package: 'DebuggableASTInterpreterOverlays' + with: [ spec requires: #( 'DebuggableASTDebugger' + 'Ghost' ) ] ]. - "Groups" - spec - group: 'default' with: #('Model'); - group: 'Model' with: #('DebuggableASTInterpreter'); - group: 'Debugger' with: #('DebuggableASTDebugger'); - group: 'Overlay' with: #('DebuggableASTInterpreterOverlays') + "Groups" + spec + group: 'default' with: #( 'Model' ); + group: 'Model' with: #( 'DebuggableASTInterpreter' ); + group: 'Debugger' with: #( 'DebuggableASTDebugger' ); + group: 'Overlay' with: #( 'DebuggableASTInterpreterOverlays' ) ] From 21444f567e2f7ef93876ec40cb87243c15f00149 Mon Sep 17 00:00:00 2001 From: adri09070 <97704417+adri09070@users.noreply.github.com> Date: Fri, 23 Sep 2022 11:05:23 +0200 Subject: [PATCH 4/5] synch with RMODINRIA/DebuggableASTInterpreter --- ...aselineOfDebuggableASTInterpreter.class.st | 21 +++++-------------- .../DASTInterpreter.class.st | 13 ++++++------ .../DASTPostOrderTreeVisitor.class.st | 14 ++++++------- 3 files changed, 19 insertions(+), 29 deletions(-) diff --git a/BaselineOfDebuggableASTInterpreter/BaselineOfDebuggableASTInterpreter.class.st b/BaselineOfDebuggableASTInterpreter/BaselineOfDebuggableASTInterpreter.class.st index 803bc35..deeab82 100644 --- a/BaselineOfDebuggableASTInterpreter/BaselineOfDebuggableASTInterpreter.class.st +++ b/BaselineOfDebuggableASTInterpreter/BaselineOfDebuggableASTInterpreter.class.st @@ -8,28 +8,17 @@ Class { BaselineOfDebuggableASTInterpreter >> baseline: spec [ - spec for: #common do: [ "Dependencies" - spec - baseline: 'Espell' - with: [ spec repository: 'github://guillep/espell' ]. - spec - baseline: 'Ghost' - with: [ spec repository: 'gitlab://gitlab.inria.fr:RMOD/Ghost' ]. + spec for: #common do: [ "Packages" spec - package: 'DebuggableASTInterpreter' - with: [ spec requires: #( 'Espell' ) ]; - package: 'DebuggableASTDebugger' - with: [ spec requires: #( 'DebuggableASTInterpreter' ) ]; - package: 'DebuggableASTInterpreterOverlays' - with: [ spec requires: #( 'DebuggableASTDebugger' - 'Ghost' ) ] ]. + package: 'DebuggableASTInterpreter'; + package: 'DebuggableASTDebugger' with: [ + spec requires: #( 'DebuggableASTInterpreter' ) ] ]. "Groups" spec group: 'default' with: #( 'Model' ); group: 'Model' with: #( 'DebuggableASTInterpreter' ); - group: 'Debugger' with: #( 'DebuggableASTDebugger' ); - group: 'Overlay' with: #( 'DebuggableASTInterpreterOverlays' ) + group: 'Debugger' with: #( 'DebuggableASTDebugger' ) ] diff --git a/DebuggableASTInterpreter/DASTInterpreter.class.st b/DebuggableASTInterpreter/DASTInterpreter.class.st index 2abbed5..8d9365d 100644 --- a/DebuggableASTInterpreter/DASTInterpreter.class.st +++ b/DebuggableASTInterpreter/DASTInterpreter.class.st @@ -311,8 +311,9 @@ DASTInterpreter >> visitArgumentNode: aRBArgumentNode [ ] { #category : #visiting } -DASTInterpreter >> visitArgumentVariableNode: aRBVariableNode [ - self visitVariableNode: aRBVariableNode . +DASTInterpreter >> visitArgumentVariableNode: aRBVariableNode [ + + ^ self visitTemporaryNode: aRBVariableNode ] { #category : #visiting } @@ -348,9 +349,9 @@ DASTInterpreter >> visitCascadeNode: aRBCascadeNode [ ] { #category : #visiting } -DASTInterpreter >> visitClassVariableNode: aNode [ +DASTInterpreter >> visitClassVariableNode: aRBVariableNode [ - ^ self visitLiteralVariableNode: aNode + ^ self visitGlobalNode: aRBVariableNode ] { #category : #visiting } @@ -361,9 +362,9 @@ DASTInterpreter >> visitGlobalNode: aRBGlobalNode [ ] { #category : #visiting } -DASTInterpreter >> visitGlobalVariableNode: aNode [ +DASTInterpreter >> visitGlobalVariableNode: aRBVariableNode [ - ^ self visitLiteralVariableNode: aNode + ^ self visitGlobalNode: aRBVariableNode ] { #category : #visiting } diff --git a/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st b/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st index 4e8af2e..acc1791 100644 --- a/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st +++ b/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st @@ -40,7 +40,7 @@ DASTPostOrderTreeVisitor >> visitArgumentNode: aRBArgumentNode [ { #category : #visiting } DASTPostOrderTreeVisitor >> visitArgumentVariableNode: aRBVariableNode [ - stack push: aRBVariableNode + ^ self visitTemporaryNode: aRBVariableNode ] { #category : #visiting } @@ -68,9 +68,9 @@ DASTPostOrderTreeVisitor >> visitCascadeNode: aRBCascadeNode [ ] { #category : #visiting } -DASTPostOrderTreeVisitor >> visitClassVariableNode: aNode [ +DASTPostOrderTreeVisitor >> visitClassVariableNode: aRBVariableNode [ - ^ self visitLiteralVariableNode: aNode + ^ self visitGlobalNode: aRBVariableNode ] { #category : #visiting } @@ -79,9 +79,9 @@ DASTPostOrderTreeVisitor >> visitGlobalNode: aRBGlobalNode [ ] { #category : #visiting } -DASTPostOrderTreeVisitor >> visitGlobalVariableNode: aNode [ +DASTPostOrderTreeVisitor >> visitGlobalVariableNode: aRBVariableNode [ - ^ self visitLiteralVariableNode: aNode + ^ self visitGlobalNode: aRBVariableNode ] { #category : #visiting } @@ -172,9 +172,9 @@ DASTPostOrderTreeVisitor >> visitTemporaryNode: aRBTemporaryNode [ ] { #category : #visiting } -DASTPostOrderTreeVisitor >> visitTemporaryVariableNode: aRBVariableNode [ +DASTPostOrderTreeVisitor >> visitTemporaryVariableNode: aRBVariableNode [ - stack push: aRBVariableNode + ^ self visitTemporaryNode: aRBVariableNode ] { #category : #visiting } From dd2c613e444e10ad24e15bbeaf3cb338d0f56467 Mon Sep 17 00:00:00 2001 From: adri09070 <97704417+adri09070@users.noreply.github.com> Date: Fri, 7 Oct 2022 13:57:43 +0200 Subject: [PATCH 5/5] fixing DAST interpreter to interpret pragma nodes correctly, notably to initialize primitiva error variables correctly --- .../DASTInterpreter.class.st | 101 +++++++++++------- .../DASTInterpreterTests.class.st | 17 +++ .../DASTMethodContext.class.st | 2 +- .../DASTPostOrderTreeVisitor.class.st | 12 ++- .../DASTPrimitiveFailed.class.st | 36 ++++++- 5 files changed, 123 insertions(+), 45 deletions(-) diff --git a/DebuggableASTInterpreter/DASTInterpreter.class.st b/DebuggableASTInterpreter/DASTInterpreter.class.st index 7ccb093..9ebba02 100644 --- a/DebuggableASTInterpreter/DASTInterpreter.class.st +++ b/DebuggableASTInterpreter/DASTInterpreter.class.st @@ -216,28 +216,34 @@ DASTInterpreter >> restart: aDASTContext [ { #category : #private } DASTInterpreter >> solvePrimitive: aMethod receiver: anObject arguments: anArray [ + | primitiveResult anInteger | anInteger := aMethod primitive. - "primitives applied to blocks:" (anObject isKindOf: DASTClosure) ifTrue: [ - anInteger = 266 ifTrue: [ - self halt. - ^self stackPush: anObject argumentCount. - ]. + anInteger = 266 ifTrue: [ + self halt. + ^ self stackPush: anObject argumentCount ]. anInteger = 202 ifTrue: [ self halt. - primitiveResult := anObject tryPrimitive: anInteger withArgs: anArray asArray. - ^ self stackPush: primitiveResult - ]. - DASTPrimitiveFailed signalWithPrimitive: anInteger receiver: anObject - ]. + primitiveResult := anObject + tryPrimitive: anInteger + withArgs: anArray asArray. + ^ self stackPush: primitiveResult ]. + DASTPrimitiveFailed + signalWithPrimitive: anInteger + receiver: anObject ]. "apply primitive to object" - primitiveResult := self evaluator executePrimitiveMethod: aMethod withReceiver: anObject withArguments: anArray asArray. - (self evaluator primitiveResultIsError: primitiveResult) - ifTrue: [ DASTPrimitiveFailed signalWithPrimitive: anInteger receiver: anObject ]. + primitiveResult := self evaluator + executePrimitiveMethod: aMethod + withReceiver: anObject + withArguments: anArray asArray. + (self evaluator primitiveResultIsError: primitiveResult) ifTrue: [ + DASTPrimitiveFailed + signalWithPrimitive: anInteger + receiver: anObject + errorCode: primitiveResult second ]. self stackPush: (self evaluator valueOf: primitiveResult) - ] { #category : #stack } @@ -415,41 +421,47 @@ DASTInterpreter >> visitLocalVariableNode: aNode [ ] { #category : #visiting } -DASTInterpreter >> visitMessageNode: aRBMessageNode [ - | arguments receiver method newContext | - " Resolve Arguments " +DASTInterpreter >> visitMessageNode: aRBMessageNode [ - "self haltIf: [ aRBMessageNode selector = #methodDict ]." - arguments := (self stackPop: aRBMessageNode numArgs) reverse. - (aRBMessageNode isCascaded and: [aRBMessageNode isFirstCascaded not]) ifTrue: [ self stackPop ]. + | arguments receiver method newContext | + " Resolve Arguments ""self haltIf: [ aRBMessageNode selector = #methodDict ]." + arguments := (self stackPop: aRBMessageNode numArgs) reverse. + (aRBMessageNode isCascaded and: [ aRBMessageNode isFirstCascaded not ]) + ifTrue: [ self stackPop ]. receiver := self stackPop. - + " Current context initialization (implicit lookup)" - newContext := - DASTContext - newWithSender: self currentContext - receiver: receiver - messageNode: aRBMessageNode - evaluator: self evaluator. - + newContext := DASTContext + newWithSender: self currentContext + receiver: receiver + messageNode: aRBMessageNode + evaluator: self evaluator. + " Lookup" method := newContext methodOrBlock. " Apply - invoke method " - (aRBMessageNode isCascaded and: [aRBMessageNode parent messages last ~= aRBMessageNode]) ifTrue: [ self stackPush: receiver ]. - (method isPrimitive and: [method isMessageValue not and: [method isOnDo not]] ) - ifTrue: [ - [ ^ self solvePrimitive: method receiver: receiver arguments: arguments ] - on: DASTPrimitiveFailed - do: [ - " Remove pragma node from method body to prevent infinit loop + (aRBMessageNode isCascaded and: [ + aRBMessageNode parent messages last ~= aRBMessageNode ]) ifTrue: [ + self stackPush: receiver ]. + (method isPrimitive and: [ + method isMessageValue not and: [ method isOnDo not ] ]) ifTrue: [ + [ + ^ self + solvePrimitive: method + receiver: receiver + arguments: arguments ] + on: DASTPrimitiveFailed + do: [ :failure | " Remove pragma node from method body to prevent infinit loop and continue with the excecution of the method body" - newContext := newContext removePrimitiveFromMethod;yourself. - ] - ]. + newContext := newContext + removePrimitiveFromMethod; + yourself. + newContext stack push: failure errorCode ] ]. " Set new context " currentContext := newContext. - currentContext setTemporalVariablesNamed: method argumentNames values: arguments. - + currentContext + setTemporalVariablesNamed: method argumentNames + values: arguments ] { #category : #visiting } @@ -458,6 +470,15 @@ DASTInterpreter >> visitMethodNode: aRBBlockNode [ +] + +{ #category : #visiting } +DASTInterpreter >> visitPragmaNode: aRBPragmaNode [ + + aRBPragmaNode isPrimitiveError ifFalse: [ ^ self ]. + self currentContext + at: aRBPragmaNode primitiveErrorVariableName + put: self stackTop ] { #category : #visiting } diff --git a/DebuggableASTInterpreter/DASTInterpreterTests.class.st b/DebuggableASTInterpreter/DASTInterpreterTests.class.st index ee27ea3..c037f13 100644 --- a/DebuggableASTInterpreter/DASTInterpreterTests.class.st +++ b/DebuggableASTInterpreter/DASTInterpreterTests.class.st @@ -253,6 +253,23 @@ DASTInterpreterTests >> testExecutedNodesAtExecutionStart [ self assert: interpreter currentContext executedNodes isEmpty ] +{ #category : #'tests-primitives' } +DASTInterpreterTests >> testFailingPrimitiveWithErrorCode [ + + interpreter initializeWithProgram: + (RBParser parseExpression: '1 become: 2'). + "We step until the primitive failure, which returns an error code" + 8 timesRepeat: [ interpreter stepInto ]. + + self assert: interpreter stackTop equals: 'inappropriate operation'. + + "One more step will interpret the pragma node that should put the error code in the primitive error variable. In this case, this variable is called 'ec'" + interpreter stepInto. + self + assert: (interpreter currentContext findVariable: 'ec') + equals: 'inappropriate operation' +] + { #category : #'tests-primitives' } DASTInterpreterTests >> testFalse [ self assert: (self evaluateProgram: 'false') diff --git a/DebuggableASTInterpreter/DASTMethodContext.class.st b/DebuggableASTInterpreter/DASTMethodContext.class.st index 08c4e64..fd5c935 100644 --- a/DebuggableASTInterpreter/DASTMethodContext.class.st +++ b/DebuggableASTInterpreter/DASTMethodContext.class.st @@ -50,7 +50,7 @@ DASTMethodContext >> initializeContext [ compiledMethod := self lookupSelector: aSelector startInClass: aClass. ast := DASTMethod new initializeWith: compiledMethod ast evaluator: self evaluator. visitor := DASTPostOrderTreeVisitor new. - ast body acceptVisitor: visitor. + ast nodeAST acceptVisitor: visitor. flatNodes := visitor stack. self methodOrBlock: ast; diff --git a/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st b/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st index 6ceb325..9c8e460 100644 --- a/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st +++ b/DebuggableASTInterpreter/DASTPostOrderTreeVisitor.class.st @@ -134,10 +134,16 @@ DASTPostOrderTreeVisitor >> visitMessageNode: aRBMessageNode [ ] { #category : #visiting } -DASTPostOrderTreeVisitor >> visitMethodNode: aRBMethodNode [ - - stack push: aRBMethodNode. +DASTPostOrderTreeVisitor >> visitMethodNode: aRBMethodNode [ + aRBMethodNode body acceptVisitor: self. + aRBMethodNode pragmas do: [ :each | each acceptVisitor: self ] +] + +{ #category : #visiting } +DASTPostOrderTreeVisitor >> visitPragmaNode: aRBPragmaNode [ + + stack push: aRBPragmaNode ] { #category : #visiting } diff --git a/DebuggableASTInterpreter/DASTPrimitiveFailed.class.st b/DebuggableASTInterpreter/DASTPrimitiveFailed.class.st index c7ec151..38f177b 100644 --- a/DebuggableASTInterpreter/DASTPrimitiveFailed.class.st +++ b/DebuggableASTInterpreter/DASTPrimitiveFailed.class.st @@ -3,7 +3,8 @@ Class { #superclass : #Error, #instVars : [ 'primitiveNumber', - 'receiver' + 'receiver', + 'errorCode' ], #category : #'DebuggableASTInterpreter-Exceptions' } @@ -16,11 +17,44 @@ DASTPrimitiveFailed class >> primitiveNumber: anInteger receiver: anObject [ yourself ] +{ #category : #signaling } +DASTPrimitiveFailed class >> primitiveNumber: anInteger receiver: anObject errorCode: ec [ + + ^ (self primitiveNumber: anInteger receiver: anObject) + errorCode: ec; + yourself +] + { #category : #signaling } DASTPrimitiveFailed class >> signalWithPrimitive: anInteger receiver: anObject [ ^(self primitiveNumber: anInteger receiver: anObject) signal ] +{ #category : #signalling } +DASTPrimitiveFailed class >> signalWithPrimitive: anInteger receiver: anObject errorCode: ec [ + + ^ (self primitiveNumber: anInteger receiver: anObject errorCode: ec) + signal +] + +{ #category : #accessing } +DASTPrimitiveFailed >> errorCode [ + + ^ errorCode +] + +{ #category : #accessing } +DASTPrimitiveFailed >> errorCode: anObject [ + + errorCode := anObject +] + +{ #category : #testing } +DASTPrimitiveFailed >> isResumable [ + + ^ true +] + { #category : #accessing } DASTPrimitiveFailed >> primitiveNumber: anInteger [ primitiveNumber := anInteger