@@ -35,7 +35,7 @@ public Object preload(MethodVisitor mv, PythonCompiler compiler, boolean boxed)
3535 public void load (MethodVisitor mv , PythonCompiler compiler , Object preloaded , boolean boxed ) {
3636 switch (finalValue ) {
3737 case PyExpr pyExpr -> {
38- pyExpr . load (mv , compiler , pyExpr . preload ( mv , compiler , false ), false );
38+ loadValue (mv , compiler , pyExpr );
3939 if (finalAddition != null ) {
4040 if (pyExpr .type (compiler ) == Type .INT_TYPE ) {
4141 Type type = typeOf (finalAddition , compiler );
@@ -50,7 +50,7 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
5050 Type type = typeOf (finalAddition , compiler );
5151 if (type == Type .FLOAT_TYPE ) {
5252 compiler .writer .smartCast (Type .DOUBLE_TYPE );
53- compiler . loadExpr ( ctx , finalAddition );
53+ loadAddition ( compiler );
5454 compiler .writer .smartCast (Type .DOUBLE_TYPE );
5555 doOperation (mv );
5656 return ;
@@ -63,12 +63,12 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
6363 compiler .writer .smartCast (Type .DOUBLE_TYPE );
6464 } else if (type == Type .LONG_TYPE ) {
6565 compiler .writer .smartCast (Type .DOUBLE_TYPE );
66- compiler . loadExpr ( ctx , finalAddition );
66+ loadAddition ( compiler );
6767 compiler .writer .smartCast (Type .DOUBLE_TYPE );
6868 doOperation (mv );
6969 return ;
7070 } else if (type == Type .INT_TYPE ) {
71- compiler . loadExpr ( ctx , finalAddition );
71+ loadAddition ( compiler );
7272 compiler .writer .smartCast (Type .FLOAT_TYPE );
7373 doOperation (mv );
7474 return ;
@@ -78,12 +78,12 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
7878 if (type == Type .LONG_TYPE ) {
7979 compiler .writer .smartCast (Type .DOUBLE_TYPE );
8080 } else if (type == Type .INT_TYPE ) {
81- compiler . loadExpr ( ctx , finalAddition );
81+ loadAddition ( compiler );
8282 compiler .writer .smartCast (Type .DOUBLE_TYPE );
8383 doOperation (mv );
8484 return ;
8585 } else if (type == Type .FLOAT_TYPE ) {
86- compiler . loadExpr ( ctx , finalAddition );
86+ loadAddition ( compiler );
8787 compiler .writer .smartCast (Type .DOUBLE_TYPE );
8888 doOperation (mv );
8989 return ;
@@ -94,7 +94,7 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
9494 }
9595 }
9696 case Integer integer -> {
97- compiler . loadConstant ( ctx , integer , mv );
97+ loadConst ( mv , compiler , integer );
9898 if (finalAddition != null ) {
9999 Type type = typeOf (finalAddition , compiler );
100100 if (type == Type .LONG_TYPE ) {
@@ -107,12 +107,12 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
107107 }
108108 }
109109 case Long aLong -> {
110- compiler . loadConstant ( ctx , aLong , mv );
110+ loadConst ( mv , compiler , aLong );
111111 if (finalAddition != null ) {
112112 Type type = typeOf (finalAddition , compiler );
113113 if (type == Type .FLOAT_TYPE ) {
114114 mv .visitInsn (L2D );
115- compiler . loadExpr ( ctx , finalAddition );
115+ loadAddition ( compiler );
116116 mv .visitInsn (F2D );
117117 doOperation (mv );
118118 return ;
@@ -122,90 +122,90 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
122122 }
123123 }
124124 case Float aFloat -> {
125- compiler . loadConstant ( ctx , aFloat , mv );
125+ loadConst ( mv , compiler , aFloat );
126126
127127 if (finalAddition != null ) {
128128 Type type = typeOf (finalAddition , compiler );
129129 if (type == Type .DOUBLE_TYPE ) {
130130 mv .visitInsn (F2D );
131131 } else if (type == Type .LONG_TYPE ) {
132132 mv .visitInsn (F2D );
133- compiler . loadExpr ( ctx , finalAddition );
133+ loadAddition ( compiler );
134134 mv .visitInsn (L2D );
135135 doOperation (mv );
136136 return ;
137137 } else if (type == Type .INT_TYPE ) {
138- compiler . loadExpr ( ctx , finalAddition );
138+ loadAddition ( compiler );
139139 mv .visitInsn (I2F );
140140 doOperation (mv );
141141 return ;
142142 }
143143 }
144144 }
145145 case Double aDouble -> {
146- compiler . loadConstant ( ctx , aDouble , mv );
146+ loadConst ( mv , compiler , aDouble );
147147
148148 if (finalAddition != null ) {
149149 Type type = typeOf (finalAddition , compiler );
150150 if (type == Type .LONG_TYPE ) {
151- compiler . loadExpr ( ctx , finalAddition );
151+ loadAddition ( compiler );
152152 compiler .writer .smartCast (Type .DOUBLE_TYPE );
153153 doOperation (mv );
154154 return ;
155155 } else if (type == Type .INT_TYPE ) {
156- compiler . loadExpr ( ctx , finalAddition );
156+ loadAddition ( compiler );
157157 compiler .writer .smartCast (Type .DOUBLE_TYPE );
158158 doOperation (mv );
159159 return ;
160160 } else if (type == Type .FLOAT_TYPE ) {
161- compiler . loadExpr ( ctx , finalAddition );
161+ loadAddition ( compiler );
162162 compiler .writer .smartCast (Type .DOUBLE_TYPE );
163163 doOperation (mv );
164164 return ;
165165 }
166166 }
167167 }
168- case String s -> compiler . loadConstant ( ctx , s , mv );
168+ case String s -> loadConst ( mv , compiler , s );
169169 case Boolean aBoolean -> {
170- compiler . loadConstant ( ctx , aBoolean , mv );
170+ loadConst ( mv , compiler , aBoolean );
171171
172172 if (finalAddition != null ) {
173173 Type type = typeOf (finalAddition , compiler );
174174 if (type == Type .INT_TYPE ) {
175- compiler . loadExpr ( ctx , finalAddition );
175+ loadAddition ( compiler );
176176 mv .visitInsn (I2F );
177177 doOperation (mv );
178178 return ;
179179 } else if (type == Type .LONG_TYPE ) {
180- compiler . loadExpr ( ctx , finalAddition );
180+ loadAddition ( compiler );
181181 mv .visitInsn (L2D );
182182 doOperation (mv );
183183 return ;
184184 } else if (type == Type .FLOAT_TYPE ) {
185- compiler . loadExpr ( ctx , finalAddition );
185+ loadAddition ( compiler );
186186 mv .visitInsn (F2D );
187187 doOperation (mv );
188188 return ;
189189 }
190190 }
191191 }
192192 case Character aChar -> {
193- compiler . loadConstant ( ctx , aChar , mv );
193+ loadConst ( mv , compiler , aChar );
194194
195195 if (finalAddition != null ) {
196196 Type type = typeOf (finalAddition , compiler );
197197 if (type == Type .INT_TYPE ) {
198- compiler . loadExpr ( ctx , finalAddition );
198+ loadAddition ( compiler );
199199 mv .visitInsn (I2F );
200200 doOperation (mv );
201201 return ;
202202 } else if (type == Type .LONG_TYPE ) {
203- compiler . loadExpr ( ctx , finalAddition );
203+ loadAddition ( compiler );
204204 mv .visitInsn (L2D );
205205 doOperation (mv );
206206 return ;
207207 } else if (type == Type .FLOAT_TYPE ) {
208- compiler . loadExpr ( ctx , finalAddition );
208+ loadAddition ( compiler );
209209 mv .visitInsn (F2D );
210210 doOperation (mv );
211211 return ;
@@ -216,11 +216,32 @@ public void load(MethodVisitor mv, PythonCompiler compiler, Object preloaded, bo
216216 default -> throw new RuntimeException ("No supported matching loadExpr found for:\n " + ctx .getText ());
217217 }
218218 if (finalAddition != null ) {
219- compiler . loadExpr ( ctx , finalAddition );
219+ loadAddition ( compiler );
220220 doOperation (mv );
221221 }
222222 }
223223
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+
224245 private void doOperation (MethodVisitor mv ) {
225246 if (operator == Operator .ADD ) {
226247 compiler .writer .addValues ();
0 commit comments