@@ -35,7 +35,7 @@ public Object preload(MethodVisitor mv, PythonCompiler compiler, boolean boxed)
35
35
public void load (MethodVisitor mv , PythonCompiler compiler , Object preloaded , boolean boxed ) {
36
36
switch (finalValue ) {
37
37
case PyExpr pyExpr -> {
38
- pyExpr . load (mv , compiler , pyExpr . preload ( mv , compiler , false ), false );
38
+ loadValue (mv , compiler , pyExpr );
39
39
if (finalAddition != null ) {
40
40
if (pyExpr .type (compiler ) == Type .INT_TYPE ) {
41
41
Type type = typeOf (finalAddition , compiler );
@@ -50,7 +50,7 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
50
50
Type type = typeOf (finalAddition , compiler );
51
51
if (type == Type .FLOAT_TYPE ) {
52
52
compiler .writer .smartCast (Type .DOUBLE_TYPE );
53
- compiler . loadExpr ( ctx , finalAddition );
53
+ loadAddition ( compiler );
54
54
compiler .writer .smartCast (Type .DOUBLE_TYPE );
55
55
doOperation (mv );
56
56
return ;
@@ -63,12 +63,12 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
63
63
compiler .writer .smartCast (Type .DOUBLE_TYPE );
64
64
} else if (type == Type .LONG_TYPE ) {
65
65
compiler .writer .smartCast (Type .DOUBLE_TYPE );
66
- compiler . loadExpr ( ctx , finalAddition );
66
+ loadAddition ( compiler );
67
67
compiler .writer .smartCast (Type .DOUBLE_TYPE );
68
68
doOperation (mv );
69
69
return ;
70
70
} else if (type == Type .INT_TYPE ) {
71
- compiler . loadExpr ( ctx , finalAddition );
71
+ loadAddition ( compiler );
72
72
compiler .writer .smartCast (Type .FLOAT_TYPE );
73
73
doOperation (mv );
74
74
return ;
@@ -78,12 +78,12 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
78
78
if (type == Type .LONG_TYPE ) {
79
79
compiler .writer .smartCast (Type .DOUBLE_TYPE );
80
80
} else if (type == Type .INT_TYPE ) {
81
- compiler . loadExpr ( ctx , finalAddition );
81
+ loadAddition ( compiler );
82
82
compiler .writer .smartCast (Type .DOUBLE_TYPE );
83
83
doOperation (mv );
84
84
return ;
85
85
} else if (type == Type .FLOAT_TYPE ) {
86
- compiler . loadExpr ( ctx , finalAddition );
86
+ loadAddition ( compiler );
87
87
compiler .writer .smartCast (Type .DOUBLE_TYPE );
88
88
doOperation (mv );
89
89
return ;
@@ -94,7 +94,7 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
94
94
}
95
95
}
96
96
case Integer integer -> {
97
- compiler . loadConstant ( ctx , integer , mv );
97
+ loadConst ( mv , compiler , integer );
98
98
if (finalAddition != null ) {
99
99
Type type = typeOf (finalAddition , compiler );
100
100
if (type == Type .LONG_TYPE ) {
@@ -107,12 +107,12 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
107
107
}
108
108
}
109
109
case Long aLong -> {
110
- compiler . loadConstant ( ctx , aLong , mv );
110
+ loadConst ( mv , compiler , aLong );
111
111
if (finalAddition != null ) {
112
112
Type type = typeOf (finalAddition , compiler );
113
113
if (type == Type .FLOAT_TYPE ) {
114
114
mv .visitInsn (L2D );
115
- compiler . loadExpr ( ctx , finalAddition );
115
+ loadAddition ( compiler );
116
116
mv .visitInsn (F2D );
117
117
doOperation (mv );
118
118
return ;
@@ -122,90 +122,90 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
122
122
}
123
123
}
124
124
case Float aFloat -> {
125
- compiler . loadConstant ( ctx , aFloat , mv );
125
+ loadConst ( mv , compiler , aFloat );
126
126
127
127
if (finalAddition != null ) {
128
128
Type type = typeOf (finalAddition , compiler );
129
129
if (type == Type .DOUBLE_TYPE ) {
130
130
mv .visitInsn (F2D );
131
131
} else if (type == Type .LONG_TYPE ) {
132
132
mv .visitInsn (F2D );
133
- compiler . loadExpr ( ctx , finalAddition );
133
+ loadAddition ( compiler );
134
134
mv .visitInsn (L2D );
135
135
doOperation (mv );
136
136
return ;
137
137
} else if (type == Type .INT_TYPE ) {
138
- compiler . loadExpr ( ctx , finalAddition );
138
+ loadAddition ( compiler );
139
139
mv .visitInsn (I2F );
140
140
doOperation (mv );
141
141
return ;
142
142
}
143
143
}
144
144
}
145
145
case Double aDouble -> {
146
- compiler . loadConstant ( ctx , aDouble , mv );
146
+ loadConst ( mv , compiler , aDouble );
147
147
148
148
if (finalAddition != null ) {
149
149
Type type = typeOf (finalAddition , compiler );
150
150
if (type == Type .LONG_TYPE ) {
151
- compiler . loadExpr ( ctx , finalAddition );
151
+ loadAddition ( compiler );
152
152
compiler .writer .smartCast (Type .DOUBLE_TYPE );
153
153
doOperation (mv );
154
154
return ;
155
155
} else if (type == Type .INT_TYPE ) {
156
- compiler . loadExpr ( ctx , finalAddition );
156
+ loadAddition ( compiler );
157
157
compiler .writer .smartCast (Type .DOUBLE_TYPE );
158
158
doOperation (mv );
159
159
return ;
160
160
} else if (type == Type .FLOAT_TYPE ) {
161
- compiler . loadExpr ( ctx , finalAddition );
161
+ loadAddition ( compiler );
162
162
compiler .writer .smartCast (Type .DOUBLE_TYPE );
163
163
doOperation (mv );
164
164
return ;
165
165
}
166
166
}
167
167
}
168
- case String s -> compiler . loadConstant ( ctx , s , mv );
168
+ case String s -> loadConst ( mv , compiler , s );
169
169
case Boolean aBoolean -> {
170
- compiler . loadConstant ( ctx , aBoolean , mv );
170
+ loadConst ( mv , compiler , aBoolean );
171
171
172
172
if (finalAddition != null ) {
173
173
Type type = typeOf (finalAddition , compiler );
174
174
if (type == Type .INT_TYPE ) {
175
- compiler . loadExpr ( ctx , finalAddition );
175
+ loadAddition ( compiler );
176
176
mv .visitInsn (I2F );
177
177
doOperation (mv );
178
178
return ;
179
179
} else if (type == Type .LONG_TYPE ) {
180
- compiler . loadExpr ( ctx , finalAddition );
180
+ loadAddition ( compiler );
181
181
mv .visitInsn (L2D );
182
182
doOperation (mv );
183
183
return ;
184
184
} else if (type == Type .FLOAT_TYPE ) {
185
- compiler . loadExpr ( ctx , finalAddition );
185
+ loadAddition ( compiler );
186
186
mv .visitInsn (F2D );
187
187
doOperation (mv );
188
188
return ;
189
189
}
190
190
}
191
191
}
192
192
case Character aChar -> {
193
- compiler . loadConstant ( ctx , aChar , mv );
193
+ loadConst ( mv , compiler , aChar );
194
194
195
195
if (finalAddition != null ) {
196
196
Type type = typeOf (finalAddition , compiler );
197
197
if (type == Type .INT_TYPE ) {
198
- compiler . loadExpr ( ctx , finalAddition );
198
+ loadAddition ( compiler );
199
199
mv .visitInsn (I2F );
200
200
doOperation (mv );
201
201
return ;
202
202
} else if (type == Type .LONG_TYPE ) {
203
- compiler . loadExpr ( ctx , finalAddition );
203
+ loadAddition ( compiler );
204
204
mv .visitInsn (L2D );
205
205
doOperation (mv );
206
206
return ;
207
207
} else if (type == Type .FLOAT_TYPE ) {
208
- compiler . loadExpr ( ctx , finalAddition );
208
+ loadAddition ( compiler );
209
209
mv .visitInsn (F2D );
210
210
doOperation (mv );
211
211
return ;
@@ -216,11 +216,32 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
216
216
default -> throw new RuntimeException ("No supported matching loadExpr found for:\n " + ctx .getText ());
217
217
}
218
218
if (finalAddition != null ) {
219
- compiler . loadExpr ( ctx , finalAddition );
219
+ loadAddition ( compiler );
220
220
doOperation (mv );
221
221
}
222
222
}
223
223
224
+ private void loadConst (MethodVisitor mv , PythonCompiler compiler , Object aChar ) {
225
+ compiler .loadConstant (ctx , aChar , mv );
226
+ if (this .operator == Operator .POW ) {
227
+ compiler .writer .smartCast (Type .DOUBLE_TYPE );
228
+ }
229
+ }
230
+
231
+ private void loadValue (MethodVisitor mv , PythonCompiler compiler , PyExpr pyExpr ) {
232
+ pyExpr .load (mv , compiler , pyExpr .preload (mv , compiler , false ), false );
233
+ if (this .operator == Operator .POW ) {
234
+ compiler .writer .smartCast (Type .DOUBLE_TYPE );
235
+ }
236
+ }
237
+
238
+ private void loadAddition (PythonCompiler compiler ) {
239
+ compiler .loadExpr (ctx , finalAddition );
240
+ if (this .operator == Operator .POW ) {
241
+ compiler .writer .smartCast (Type .DOUBLE_TYPE );
242
+ }
243
+ }
244
+
224
245
private void doOperation (MethodVisitor mv ) {
225
246
if (operator == Operator .ADD ) {
226
247
compiler .writer .addValues ();
0 commit comments