forked from pharo-project/pharo
-
Notifications
You must be signed in to change notification settings - Fork 1
/
RFASTTranslatorForValue.class.st
85 lines (71 loc) · 2.39 KB
/
RFASTTranslatorForValue.class.st
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
"
WORKAROUND: copy of OCASTTranslatorForValue.
Will be removed when the new Translor design is in place
"
Class {
#name : #RFASTTranslatorForValue,
#superclass : #RFASTTranslator,
#category : #'Reflectivity-Compiler'
}
{ #category : #'inline messages' }
RFASTTranslatorForValue >> emitIfFalse: aMessageNode [
self visitNode: aMessageNode receiver.
methodBuilder jumpAheadTo: #false if: false.
methodBuilder pushLiteral: nil.
methodBuilder jumpAheadTo: #end.
methodBuilder jumpAheadTarget: #false.
self visitInlinedBlockNode: aMessageNode arguments first.
methodBuilder jumpAheadTarget: #end.
]
{ #category : #'inline messages' }
RFASTTranslatorForValue >> emitIfNotNil: aMessageNode [
| args |
self visitNode: aMessageNode receiver.
args := aMessageNode arguments.
args first arguments ifNotEmpty: [ args first arguments first binding emitStore: methodBuilder ].
methodBuilder pushDup.
methodBuilder pushLiteral: nil.
methodBuilder send: #==.
methodBuilder jumpAheadTo: #end if: true.
methodBuilder popTop.
self visitInlinedBlockNode: args first.
methodBuilder jumpAheadTarget: #end.
]
{ #category : #'inline messages' }
RFASTTranslatorForValue >> emitIfTrue: aMessageNode [
self visitNode: aMessageNode receiver.
methodBuilder jumpAheadTo: #else if: false.
self visitInlinedBlockNode: aMessageNode arguments first.
methodBuilder jumpAheadTo: #end.
methodBuilder jumpAheadTarget: #else.
methodBuilder pushLiteral: nil.
methodBuilder jumpAheadTarget: #end.
]
{ #category : #'inline messages' }
RFASTTranslatorForValue >> emitWhileFalse: aMessageNode [
super emitWhileFalse: aMessageNode.
methodBuilder pushLiteral: nil.
]
{ #category : #'inline messages' }
RFASTTranslatorForValue >> emitWhileTrue: aMessageNode [
super emitWhileTrue: aMessageNode.
methodBuilder pushLiteral: nil.
]
{ #category : #'visitor-double dispatching' }
RFASTTranslatorForValue >> visitSequenceNode: aSequenceNode [
| statements |
self emitPreamble: aSequenceNode.
self emitMetaLinkBefore: aSequenceNode.
self emitPrepareLinkAfter: aSequenceNode.
aSequenceNode hasMetalinkInstead
ifTrue: [ self emitMetaLinkInstead: aSequenceNode ]
ifFalse: [
statements := aSequenceNode statements.
statements ifEmpty: [
methodBuilder pushLiteral: nil.
^self].
statements allButLastDo: [:each | effectTranslator visitNode: each].
self visitNode: statements last.
].
self emitMetaLinkAfter: aSequenceNode.
]