1
1
from som .interpreter .bc .bytecodes import Bytecodes as BC
2
- from som .vm .globals import nilObject , trueObject , falseObject
3
- from som .vm .symbols import sym_nil , sym_true , sym_false
4
-
5
-
6
- def emit_inc (mgenc ):
7
- emit1 (mgenc , BC .inc , 0 )
8
-
9
-
10
- def emit_dec (mgenc ):
11
- emit1 (mgenc , BC .dec , 0 )
12
-
13
-
14
- def emit_inc_field_push (mgenc , field_idx , ctx_level ):
15
- emit3 (mgenc , BC .inc_field_push , field_idx , ctx_level , 1 )
16
2
17
3
18
4
def emit_pop (mgenc ):
@@ -24,35 +10,14 @@ def emit_push_argument(mgenc, idx, ctx):
24
10
emit3 (mgenc , BC .push_argument , idx , ctx , 1 )
25
11
26
12
27
- def emit_return_self (mgenc ):
28
- mgenc .optimize_dup_pop_pop_sequence ()
29
- emit1 (mgenc , BC .return_self , 0 )
30
-
31
-
32
13
def emit_return_local (mgenc ):
33
- if not mgenc .optimize_return_field ():
34
- emit1 (mgenc , BC .return_local , 0 )
14
+ emit1 (mgenc , BC .return_local , 0 )
35
15
36
16
37
17
def emit_return_non_local (mgenc ):
38
18
emit2 (mgenc , BC .return_non_local , mgenc .get_max_context_level (), 0 )
39
19
40
20
41
- def emit_return_field (mgenc , field_idx ):
42
- if field_idx == 0 :
43
- emit1 (mgenc , BC .return_field_0 , 0 )
44
- return
45
- if field_idx == 1 :
46
- emit1 (mgenc , BC .return_field_1 , 0 )
47
- return
48
- if field_idx == 2 :
49
- emit1 (mgenc , BC .return_field_2 , 0 )
50
- return
51
- raise NotImplementedError (
52
- "Don't support fields with index > 2, but got " + str (field_idx )
53
- )
54
-
55
-
56
21
def emit_dup (mgenc ):
57
22
emit1 (mgenc , BC .dup , 1 )
58
23
@@ -73,29 +38,13 @@ def emit_push_field(mgenc, field_name):
73
38
emit_push_field_with_index (mgenc , field_idx , ctx_level )
74
39
75
40
76
- def emit_push_field_with_index (mgenc , field_idx , ctx_level ):
77
- if ctx_level == 0 :
78
- if field_idx == 0 :
79
- emit1 (mgenc , BC .push_field_0 , 1 )
80
- return
81
- if field_idx == 1 :
82
- emit1 (mgenc , BC .push_field_1 , 1 )
83
- return
84
-
41
+ def emit_push_field_with_index (
42
+ mgenc , field_idx , ctx_level # pylint: disable=unused-argument
43
+ ):
85
44
emit3 (mgenc , BC .push_field , field_idx , mgenc .get_max_context_level (), 1 )
86
45
87
46
88
47
def emit_push_global (mgenc , glob ):
89
- if glob is sym_nil :
90
- emit_push_constant (mgenc , nilObject )
91
- return
92
- if glob is sym_true :
93
- emit_push_constant (mgenc , trueObject )
94
- return
95
- if glob is sym_false :
96
- emit_push_constant (mgenc , falseObject )
97
- return
98
-
99
48
idx = mgenc .add_literal_if_absent (glob )
100
49
# the block needs to be able to send #unknownGlobal: to self
101
50
if not mgenc .is_global_known (glob ):
@@ -115,20 +64,10 @@ def emit_pop_field(mgenc, field_name):
115
64
ctx_level = mgenc .get_max_context_level ()
116
65
field_idx = mgenc .get_field_index (field_name )
117
66
118
- if mgenc .optimize_inc_field (field_idx , ctx_level ):
119
- return
120
-
121
67
emit_pop_field_with_index (mgenc , field_idx , ctx_level )
122
68
123
69
124
70
def emit_pop_field_with_index (mgenc , field_idx , ctx_level ):
125
- if ctx_level == 0 :
126
- if field_idx == 0 :
127
- emit1 (mgenc , BC .pop_field_0 , - 1 )
128
- return
129
- if field_idx == 1 :
130
- emit1 (mgenc , BC .pop_field_1 , - 1 )
131
- return
132
71
emit3 (mgenc , BC .pop_field , field_idx , ctx_level , - 1 )
133
72
134
73
@@ -143,42 +82,11 @@ def emit_send(mgenc, msg):
143
82
num_args = msg .get_number_of_signature_arguments ()
144
83
stack_effect = - num_args + 1 # +1 for the result
145
84
146
- if num_args == 1 :
147
- emit2 (mgenc , BC .send_1 , idx , stack_effect )
148
- elif num_args == 2 :
149
- emit2 (mgenc , BC .send_2 , idx , stack_effect )
150
- elif num_args == 3 :
151
- emit2 (mgenc , BC .send_3 , idx , stack_effect )
152
- else :
153
- emit2 (mgenc , BC .send_n , idx , stack_effect )
85
+ emit2 (mgenc , BC .send_n , idx , stack_effect )
154
86
155
87
156
88
def emit_push_constant (mgenc , lit ):
157
- from som .vmobjects .integer import Integer
158
-
159
- if isinstance (lit , Integer ):
160
- if lit .get_embedded_integer () == 0 :
161
- emit1 (mgenc , BC .push_0 , 1 )
162
- return
163
- if lit .get_embedded_integer () == 1 :
164
- emit1 (mgenc , BC .push_1 , 1 )
165
- return
166
-
167
- if lit is nilObject :
168
- emit1 (mgenc , BC .push_nil , 1 )
169
- return
170
-
171
89
idx = mgenc .add_literal_if_absent (lit )
172
- if idx == 0 :
173
- emit1 (mgenc , BC .push_constant_0 , 1 )
174
- return
175
- if idx == 1 :
176
- emit1 (mgenc , BC .push_constant_1 , 1 )
177
- return
178
- if idx == 2 :
179
- emit1 (mgenc , BC .push_constant_2 , 1 )
180
- return
181
-
182
90
emit2 (mgenc , BC .push_constant , idx , 1 )
183
91
184
92
0 commit comments