|
@@ -31,6 +31,8 @@ import java.util.Objects;
|
31
|
31
|
import java.util.StringJoiner;
|
32
|
32
|
|
33
|
33
|
public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativeTranslator<Void> {
|
|
34
|
+ private static final JavaMethod OBJECTS_TOSTRING = JavaMethod.getNativeStatic(new JavaClass("java.util", "Objects", JavaClass.Kind.CLASS), "toString", "(Ljava/lang/Object;)Ljava/lang/String;");
|
|
35
|
+
|
34
|
36
|
private static final JavaMethod BOOLEAN_PARSE = JavaMethod.getNativeStatic(JavaClass.BOOLEAN, "parseBoolean", "(Ljava/lang/String;)Z");
|
35
|
37
|
private static final JavaMethod BOOLEAN_TO_STRING = JavaMethod.getNativeStatic(JavaClass.BOOLEAN, "toString", "(Z)Ljava/lang/String;");
|
36
|
38
|
private static final JavaMethod BYTE_PARSE = JavaMethod.getNativeStatic(JavaClass.BYTE, "parseByte", "(Ljava/lang/String;)B");
|
|
@@ -155,16 +157,20 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
155
|
157
|
private static final JavaMethod SHARED_ADDREF = JavaMethod.getNativeVirtual(JavaClass.SHARED, "addRef", "()V");
|
156
|
158
|
private static final JavaMethod SHARED_RELEASE = JavaMethod.getNativeVirtual(JavaClass.SHARED, "release", "()V");
|
157
|
159
|
|
158
|
|
- protected final JavaWriter javaWriter;
|
159
|
|
- private final JavaCapturedExpressionVisitor capturedExpressionVisitor = new JavaCapturedExpressionVisitor(this);
|
160
|
|
- private final JavaBytecodeContext context;
|
161
|
|
- private final JavaCompiledModule module;
|
|
160
|
+ final JavaWriter javaWriter;
|
|
161
|
+ private final JavaBoxingTypeVisitor boxingTypeVisitor;
|
|
162
|
+ private final JavaUnboxingTypeVisitor unboxingTypeVisitor;
|
|
163
|
+ private final JavaCapturedExpressionVisitor capturedExpressionVisitor = new JavaCapturedExpressionVisitor(this);
|
|
164
|
+ private final JavaBytecodeContext context;
|
|
165
|
+ private final JavaCompiledModule module;
|
162
|
166
|
|
163
|
167
|
public JavaExpressionVisitor(JavaBytecodeContext context, JavaCompiledModule module, JavaWriter javaWriter) {
|
164
|
168
|
this.javaWriter = javaWriter;
|
165
|
169
|
this.context = context;
|
166
|
170
|
this.module = module;
|
167
|
|
- }
|
|
171
|
+ boxingTypeVisitor = new JavaBoxingTypeVisitor(javaWriter);
|
|
172
|
+ unboxingTypeVisitor = new JavaUnboxingTypeVisitor(javaWriter);
|
|
173
|
+ }
|
168
|
174
|
|
169
|
175
|
@Override
|
170
|
176
|
public Void visitAndAnd(AndAndExpression expression) {
|
|
@@ -1289,7 +1295,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1289
|
1295
|
|
1290
|
1296
|
switch (builtin) {
|
1291
|
1297
|
case BOOL_TO_STRING:
|
1292
|
|
- javaWriter.invokeStatic(BOOLEAN_TO_STRING);
|
|
1298
|
+ if(expression.target.type.isOptional()) {
|
|
1299
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1300
|
+ } else {
|
|
1301
|
+ javaWriter.invokeStatic(BOOLEAN_TO_STRING);
|
|
1302
|
+ }
|
1293
|
1303
|
break;
|
1294
|
1304
|
case BYTE_TO_SBYTE:
|
1295
|
1305
|
javaWriter.i2b();
|
|
@@ -1327,9 +1337,13 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1327
|
1337
|
javaWriter.iAnd();
|
1328
|
1338
|
break;
|
1329
|
1339
|
case BYTE_TO_STRING:
|
1330
|
|
- javaWriter.constant(0xFF);
|
1331
|
|
- javaWriter.iAnd();
|
1332
|
|
- javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1340
|
+ if(expression.target.type.isOptional()) {
|
|
1341
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1342
|
+ } else {
|
|
1343
|
+ javaWriter.constant(0xFF);
|
|
1344
|
+ javaWriter.iAnd();
|
|
1345
|
+ javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1346
|
+ }
|
1333
|
1347
|
break;
|
1334
|
1348
|
case SBYTE_TO_BYTE:
|
1335
|
1349
|
case SBYTE_TO_SHORT:
|
|
@@ -1351,7 +1365,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1351
|
1365
|
case SBYTE_TO_CHAR:
|
1352
|
1366
|
break;
|
1353
|
1367
|
case SBYTE_TO_STRING:
|
1354
|
|
- javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1368
|
+ if(expression.target.type.isOptional()) {
|
|
1369
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1370
|
+ } else {
|
|
1371
|
+ javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1372
|
+ }
|
1355
|
1373
|
break;
|
1356
|
1374
|
case SHORT_TO_BYTE:
|
1357
|
1375
|
break;
|
|
@@ -1376,7 +1394,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1376
|
1394
|
case SHORT_TO_CHAR:
|
1377
|
1395
|
break;
|
1378
|
1396
|
case SHORT_TO_STRING:
|
1379
|
|
- javaWriter.invokeStatic(SHORT_TO_STRING);
|
|
1397
|
+ if(expression.target.type.isOptional()) {
|
|
1398
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1399
|
+ } else {
|
|
1400
|
+ javaWriter.invokeStatic(SHORT_TO_STRING);
|
|
1401
|
+ }
|
1380
|
1402
|
break;
|
1381
|
1403
|
case USHORT_TO_BYTE:
|
1382
|
1404
|
break;
|
|
@@ -1412,10 +1434,14 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1412
|
1434
|
javaWriter.iAnd();
|
1413
|
1435
|
break;
|
1414
|
1436
|
case USHORT_TO_STRING:
|
1415
|
|
- javaWriter.constant(0xFFFFL);
|
1416
|
|
- javaWriter.iAnd();
|
1417
|
|
- javaWriter.invokeStatic(INTEGER_TO_STRING);
|
1418
|
|
- break;
|
|
1437
|
+ if(expression.target.type.isOptional()) {
|
|
1438
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1439
|
+ } else {
|
|
1440
|
+ javaWriter.constant(0xFFFFL);
|
|
1441
|
+ javaWriter.iAnd();
|
|
1442
|
+ javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1443
|
+ }
|
|
1444
|
+ break;
|
1419
|
1445
|
case INT_TO_BYTE:
|
1420
|
1446
|
case USIZE_TO_BYTE:
|
1421
|
1447
|
break;
|
|
@@ -1455,7 +1481,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1455
|
1481
|
break;
|
1456
|
1482
|
case INT_TO_STRING:
|
1457
|
1483
|
case USIZE_TO_STRING:
|
1458
|
|
- javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1484
|
+ if(expression.target.type.isOptional()) {
|
|
1485
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1486
|
+ } else {
|
|
1487
|
+ javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1488
|
+ }
|
1459
|
1489
|
break;
|
1460
|
1490
|
case UINT_TO_BYTE:
|
1461
|
1491
|
break;
|
|
@@ -1493,7 +1523,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1493
|
1523
|
javaWriter.i2s();
|
1494
|
1524
|
break;
|
1495
|
1525
|
case UINT_TO_STRING:
|
1496
|
|
- javaWriter.invokeStatic(INTEGER_TO_UNSIGNED_STRING);
|
|
1526
|
+ if(expression.target.type.isOptional()) {
|
|
1527
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1528
|
+ } else {
|
|
1529
|
+ javaWriter.invokeStatic(INTEGER_TO_UNSIGNED_STRING);
|
|
1530
|
+ }
|
1497
|
1531
|
break;
|
1498
|
1532
|
case LONG_TO_BYTE:
|
1499
|
1533
|
javaWriter.l2i();
|
|
@@ -1525,7 +1559,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1525
|
1559
|
javaWriter.i2s();
|
1526
|
1560
|
break;
|
1527
|
1561
|
case LONG_TO_STRING:
|
1528
|
|
- javaWriter.invokeStatic(LONG_TO_STRING);
|
|
1562
|
+ if(expression.target.type.isOptional()) {
|
|
1563
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1564
|
+ } else {
|
|
1565
|
+ javaWriter.invokeStatic(LONG_TO_STRING);
|
|
1566
|
+ }
|
1529
|
1567
|
break;
|
1530
|
1568
|
case ULONG_TO_BYTE:
|
1531
|
1569
|
javaWriter.l2i();
|
|
@@ -1556,7 +1594,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1556
|
1594
|
javaWriter.i2s();
|
1557
|
1595
|
break;
|
1558
|
1596
|
case ULONG_TO_STRING:
|
1559
|
|
- javaWriter.invokeStatic(LONG_TO_UNSIGNED_STRING);
|
|
1597
|
+ if(expression.target.type.isOptional()) {
|
|
1598
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1599
|
+ } else {
|
|
1600
|
+ javaWriter.invokeStatic(LONG_TO_UNSIGNED_STRING);
|
|
1601
|
+ }
|
1560
|
1602
|
break;
|
1561
|
1603
|
case FLOAT_TO_BYTE:
|
1562
|
1604
|
javaWriter.f2i();
|
|
@@ -1583,7 +1625,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1583
|
1625
|
javaWriter.f2d();
|
1584
|
1626
|
break;
|
1585
|
1627
|
case FLOAT_TO_STRING:
|
1586
|
|
- javaWriter.invokeStatic(FLOAT_TO_STRING);
|
|
1628
|
+ if(expression.target.type.isOptional()) {
|
|
1629
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1630
|
+ } else {
|
|
1631
|
+ javaWriter.invokeStatic(FLOAT_TO_STRING);
|
|
1632
|
+ }
|
1587
|
1633
|
break;
|
1588
|
1634
|
case DOUBLE_TO_BYTE:
|
1589
|
1635
|
javaWriter.d2i();
|
|
@@ -1610,7 +1656,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1610
|
1656
|
javaWriter.d2f();
|
1611
|
1657
|
break;
|
1612
|
1658
|
case DOUBLE_TO_STRING:
|
1613
|
|
- javaWriter.invokeStatic(DOUBLE_TO_STRING);
|
|
1659
|
+ if(expression.target.type.isOptional()) {
|
|
1660
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1661
|
+ } else {
|
|
1662
|
+ javaWriter.invokeStatic(DOUBLE_TO_STRING);
|
|
1663
|
+ }
|
1614
|
1664
|
break;
|
1615
|
1665
|
case CHAR_TO_BYTE:
|
1616
|
1666
|
break;
|
|
@@ -1628,7 +1678,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1628
|
1678
|
javaWriter.i2l();
|
1629
|
1679
|
break;
|
1630
|
1680
|
case CHAR_TO_STRING:
|
1631
|
|
- javaWriter.invokeStatic(CHARACTER_TO_STRING);
|
|
1681
|
+ if(expression.target.type.isOptional()) {
|
|
1682
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1683
|
+ } else {
|
|
1684
|
+ javaWriter.invokeStatic(CHARACTER_TO_STRING);
|
|
1685
|
+ }
|
1632
|
1686
|
break;
|
1633
|
1687
|
case ENUM_TO_STRING:
|
1634
|
1688
|
javaWriter.invokeVirtual(ENUM_NAME);
|
|
@@ -1665,7 +1719,9 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1665
|
1719
|
javaWriter.ifNonNull(end);
|
1666
|
1720
|
javaWriter.pop();
|
1667
|
1721
|
expression.right.accept(this);
|
|
1722
|
+ expression.right.type.type.accept(expression.right.type, boxingTypeVisitor);
|
1668
|
1723
|
javaWriter.label(end);
|
|
1724
|
+ expression.type.type.accept(expression.type, unboxingTypeVisitor);
|
1669
|
1725
|
return null;
|
1670
|
1726
|
}
|
1671
|
1727
|
|
|
@@ -1940,7 +1996,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1940
|
1996
|
}
|
1941
|
1997
|
}
|
1942
|
1998
|
|
1943
|
|
- bridgeWriter.invokeVirtual(new JavaMethod(JavaClass.fromInternalName(className, JavaClass.Kind.CLASS), methodInfo.kind, methodInfo.name, methodInfo.compile, signature, methodInfo.modifiers, methodInfo.genericResult));
|
|
1999
|
+ bridgeWriter.invokeVirtual(new JavaMethod(JavaClass.fromInternalName(className, JavaClass.Kind.CLASS), JavaMethod.Kind.INSTANCE, methodInfo.name, methodInfo.compile, signature, methodInfo.modifiers, methodInfo.genericResult));
|
1944
|
2000
|
if(expression.header.getReturnType().type != BasicTypeID.VOID) {
|
1945
|
2001
|
bridgeWriter.returnType(context.getType(expression.header.getReturnType()));
|
1946
|
2002
|
}
|
|
@@ -2335,11 +2391,14 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
2335
|
2391
|
javaWriter.newObject("java/util/HashMap");
|
2336
|
2392
|
javaWriter.dup();
|
2337
|
2393
|
javaWriter.invokeSpecial("java/util/HashMap", "<init>", "()V");
|
|
2394
|
+ final AssocTypeID type = (AssocTypeID) expression.type.type;
|
2338
|
2395
|
for (int i = 0; i < expression.keys.length; i++) {
|
2339
|
2396
|
javaWriter.dup();
|
2340
|
2397
|
expression.keys[i].accept(this);
|
2341
|
|
- expression.values[i].accept(this);
|
2342
|
|
- javaWriter.invokeInterface(MAP_PUT);
|
|
2398
|
+ type.keyType.type.accept(type.keyType, boxingTypeVisitor);
|
|
2399
|
+ expression.values[i].accept(this);
|
|
2400
|
+ type.valueType.type.accept(type.valueType, boxingTypeVisitor);
|
|
2401
|
+ javaWriter.invokeInterface(MAP_PUT);
|
2343
|
2402
|
javaWriter.pop();
|
2344
|
2403
|
}
|
2345
|
2404
|
return null;
|
|
@@ -4142,7 +4201,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
4142
|
4201
|
public Void visitWrapOptional(WrapOptionalExpression expression) {
|
4143
|
4202
|
//Does nothing if not required to be wrapped
|
4144
|
4203
|
expression.value.accept(this);
|
4145
|
|
- expression.value.type.type.accept(expression.value.type, new JavaBoxingTypeVisitor(javaWriter));
|
|
4204
|
+ expression.value.type.type.accept(expression.value.type, boxingTypeVisitor);
|
4146
|
4205
|
return null;
|
4147
|
4206
|
}
|
4148
|
4207
|
|