|
@@ -1,10 +1,13 @@
|
1
|
1
|
package org.openzen.zenscript.javabytecode.compiler;
|
2
|
2
|
|
3
|
3
|
import org.objectweb.asm.Label;
|
|
4
|
+import org.objectweb.asm.Opcodes;
|
4
|
5
|
import org.objectweb.asm.Type;
|
5
|
6
|
import org.openzen.zenscript.codemodel.CompareType;
|
6
|
7
|
import org.openzen.zenscript.codemodel.expression.*;
|
7
|
8
|
import org.openzen.zenscript.codemodel.member.DefinitionMember;
|
|
9
|
+import org.openzen.zenscript.codemodel.statement.ReturnStatement;
|
|
10
|
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
|
8
|
11
|
import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
|
9
|
12
|
import org.openzen.zenscript.codemodel.type.ITypeID;
|
10
|
13
|
import org.openzen.zenscript.implementations.IntRange;
|
|
@@ -12,14 +15,15 @@ import org.openzen.zenscript.javabytecode.*;
|
12
|
15
|
import org.openzen.zenscript.shared.CompileException;
|
13
|
16
|
import org.openzen.zenscript.shared.CompileExceptionCode;
|
14
|
17
|
|
|
18
|
+import java.util.Arrays;
|
15
|
19
|
import java.util.Map;
|
16
|
|
-import org.objectweb.asm.Opcodes;
|
|
20
|
+import java.util.StringJoiner;
|
17
|
21
|
|
18
|
22
|
public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
19
|
|
- private static final JavaMethodInfo MAP_PUT = JavaMethodInfo.get(Opcodes.ACC_PUBLIC, Map.class, "put", Object.class, Object.class, Object.class);
|
20
|
|
-
|
|
23
|
+ private static final JavaMethodInfo MAP_PUT = JavaMethodInfo.get(Opcodes.ACC_PUBLIC, Map.class, "put", Object.class, Object.class, Object.class);
|
|
24
|
+
|
21
|
25
|
private final JavaWriter javaWriter;
|
22
|
|
-
|
|
26
|
+
|
23
|
27
|
public JavaExpressionVisitor(JavaWriter javaWriter) {
|
24
|
28
|
this.javaWriter = javaWriter;
|
25
|
29
|
}
|
|
@@ -76,15 +80,15 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
76
|
80
|
final Type operatorType = Type.getType(CompareType.class);
|
77
|
81
|
javaWriter.getStaticField(operatorType.getInternalName(), expression.operator.name(), operatorType.getDescriptor());
|
78
|
82
|
|
79
|
|
- // TODO: should be implemented properly
|
80
|
|
- JavaMethodInfo compareMethod = JavaMethodInfo.get(
|
81
|
|
- 0,
|
82
|
|
- ZenUtils.class,
|
83
|
|
- "compare",
|
84
|
|
- boolean.class,
|
85
|
|
- getForEquals(expression.left.type),
|
86
|
|
- getForEquals(expression.right.type),
|
87
|
|
- CompareType.class);
|
|
83
|
+ // TODO: should be implemented properly
|
|
84
|
+ JavaMethodInfo compareMethod = JavaMethodInfo.get(
|
|
85
|
+ 0,
|
|
86
|
+ ZenUtils.class,
|
|
87
|
+ "compare",
|
|
88
|
+ boolean.class,
|
|
89
|
+ getForEquals(expression.left.type),
|
|
90
|
+ getForEquals(expression.right.type),
|
|
91
|
+ CompareType.class);
|
88
|
92
|
javaWriter.invokeStatic(compareMethod);
|
89
|
93
|
|
90
|
94
|
return null;
|
|
@@ -115,6 +119,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
115
|
119
|
|
116
|
120
|
@Override
|
117
|
121
|
public Void visitCapturedClosure(CapturedClosureExpression expression) {
|
|
122
|
+ expression.value.accept(this);
|
118
|
123
|
return null;
|
119
|
124
|
}
|
120
|
125
|
|
|
@@ -125,6 +130,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
125
|
130
|
|
126
|
131
|
@Override
|
127
|
132
|
public Void visitCapturedLocalVariable(CapturedLocalVariableExpression expression) {
|
|
133
|
+ new GetLocalVariableExpression(expression.position, expression.variable).accept(this);
|
128
|
134
|
return null;
|
129
|
135
|
}
|
130
|
136
|
|
|
@@ -275,15 +281,15 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
275
|
281
|
@Override
|
276
|
282
|
public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
|
277
|
283
|
Type type = expression.objectType.accept(JavaTypeVisitor.INSTANCE);
|
278
|
|
-
|
279
|
|
- if (javaWriter.method.javaClass.isEnum) {
|
280
|
|
- javaWriter.loadObject(0);
|
281
|
|
- javaWriter.loadObject(1);
|
282
|
|
- javaWriter.loadInt(2);
|
283
|
|
- } else {
|
284
|
|
- javaWriter.loadObject(0);
|
285
|
|
- }
|
286
|
|
-
|
|
284
|
+
|
|
285
|
+ if (javaWriter.method.javaClass.isEnum) {
|
|
286
|
+ javaWriter.loadObject(0);
|
|
287
|
+ javaWriter.loadObject(1);
|
|
288
|
+ javaWriter.loadInt(2);
|
|
289
|
+ } else {
|
|
290
|
+ javaWriter.loadObject(0);
|
|
291
|
+ }
|
|
292
|
+
|
287
|
293
|
for (Expression argument : expression.arguments.arguments) {
|
288
|
294
|
argument.accept(this);
|
289
|
295
|
}
|
|
@@ -299,8 +305,8 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
299
|
305
|
}
|
300
|
306
|
//No super calls in enums possible, and that's already handled in the enum constructor itself.
|
301
|
307
|
javaWriter.invokeSpecial(expression.objectType.accept(JavaTypeClassVisitor.INSTANCE), "<init>", CompilerUtils.calcDesc(expression.constructor.header, false));
|
302
|
|
-
|
303
|
|
- CompilerUtils.writeDefaultFieldInitializers(javaWriter, javaWriter.forDefinition, false);
|
|
308
|
+
|
|
309
|
+ CompilerUtils.writeDefaultFieldInitializers(javaWriter, javaWriter.forDefinition, false);
|
304
|
310
|
return null;
|
305
|
311
|
}
|
306
|
312
|
|
|
@@ -313,9 +319,64 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
313
|
319
|
|
314
|
320
|
@Override
|
315
|
321
|
public Void visitFunction(FunctionExpression expression) {
|
|
322
|
+ if (expression.header.parameters.length == 0 && expression.body instanceof ReturnStatement && expression.body.hasTag(MatchExpression.class) && expression.closure.captures.isEmpty()) {
|
|
323
|
+ ((ReturnStatement) expression.body).value.accept(this);
|
|
324
|
+ return null;
|
|
325
|
+ }
|
|
326
|
+ final String signature = calcFunctionSignature(expression.closure, expression.header.returnType);
|
|
327
|
+ final String name = "lambda" + expression.hashCode();
|
|
328
|
+
|
|
329
|
+ final JavaMethodInfo methodInfo = new JavaMethodInfo(javaWriter.method.javaClass, name, signature, Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE);
|
|
330
|
+ JavaWriter functionWriter = new JavaWriter(javaWriter.clazzVisitor, methodInfo, null, signature, null);
|
|
331
|
+
|
|
332
|
+ for (CapturedExpression capture : expression.closure.captures) {
|
|
333
|
+ capture.accept(new JavaCapturedExpressionVisitor(this));
|
|
334
|
+ }
|
|
335
|
+
|
|
336
|
+ javaWriter.invokeStatic(methodInfo);
|
|
337
|
+
|
|
338
|
+ functionWriter.start();
|
|
339
|
+ expression.body.accept(new JavaStatementVisitor(new JavaExpressionVisitor(functionWriter) {
|
|
340
|
+ @Override
|
|
341
|
+ public Void visitGetLocalVariable(GetLocalVariableExpression varExpression) {
|
|
342
|
+ final int position = calculateMemberPosition(varExpression, expression);
|
|
343
|
+ if (position < 0)
|
|
344
|
+ throw new CompileException(varExpression.position, CompileExceptionCode.INTERNAL_ERROR, "Captured Statement error");
|
|
345
|
+ functionWriter.load(varExpression.variable.type.accept(JavaTypeVisitor.INSTANCE), position);
|
|
346
|
+ return null;
|
|
347
|
+ }
|
|
348
|
+ }));
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+ functionWriter.ret();
|
|
352
|
+ functionWriter.end();
|
|
353
|
+
|
316
|
354
|
return null;
|
317
|
355
|
}
|
318
|
356
|
|
|
357
|
+ //TODO replace with visitor?
|
|
358
|
+ private static int calculateMemberPosition(GetLocalVariableExpression localVariableExpression, FunctionExpression expression) {
|
|
359
|
+ int h = expression.header.parameters.length;
|
|
360
|
+ for (CapturedExpression capture : expression.closure.captures) {
|
|
361
|
+ if (capture instanceof CapturedLocalVariableExpression && ((CapturedLocalVariableExpression) capture).variable == localVariableExpression.variable)
|
|
362
|
+ return h;
|
|
363
|
+ if (capture instanceof CapturedClosureExpression && ((CapturedClosureExpression) capture).value instanceof CapturedLocalVariableExpression && ((CapturedLocalVariableExpression) ((CapturedClosureExpression) capture).value).variable == localVariableExpression.variable)
|
|
364
|
+ return h;
|
|
365
|
+ h++;
|
|
366
|
+ }
|
|
367
|
+ return -1;
|
|
368
|
+ }
|
|
369
|
+
|
|
370
|
+ private String calcFunctionSignature(LambdaClosure closure, ITypeID type) {
|
|
371
|
+ StringJoiner joiner = new StringJoiner("", "(", ")");
|
|
372
|
+
|
|
373
|
+ for (CapturedExpression capture : closure.captures) {
|
|
374
|
+ String descriptor = capture.type.accept(JavaTypeVisitor.INSTANCE).getDescriptor();
|
|
375
|
+ joiner.add(descriptor);
|
|
376
|
+ }
|
|
377
|
+ return joiner.toString() + type.accept(JavaTypeVisitor.INSTANCE).getDescriptor();
|
|
378
|
+ }
|
|
379
|
+
|
319
|
380
|
@Override
|
320
|
381
|
public Void visitGenericCompare(GenericCompareExpression expression) {
|
321
|
382
|
//TODO: What am I supposed to do here?
|
|
@@ -324,7 +385,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
324
|
385
|
|
325
|
386
|
@Override
|
326
|
387
|
public Void visitGetField(GetFieldExpression expression) {
|
327
|
|
- expression.accept(this);
|
|
388
|
+ expression.accept(this);
|
328
|
389
|
if (!checkAndGetFieldInfo(expression.field, false))
|
329
|
390
|
throw new IllegalStateException("Missing field info on a field member!");
|
330
|
391
|
return null;
|
|
@@ -332,7 +393,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
332
|
393
|
|
333
|
394
|
@Override
|
334
|
395
|
public Void visitGetFunctionParameter(GetFunctionParameterExpression expression) {
|
335
|
|
- JavaParameterInfo parameter = expression.parameter.getTag(JavaParameterInfo.class);
|
|
396
|
+ JavaParameterInfo parameter = expression.parameter.getTag(JavaParameterInfo.class);
|
336
|
397
|
javaWriter.load(Type.getType(expression.parameter.type.accept(JavaTypeClassVisitor.INSTANCE)), parameter.index);
|
337
|
398
|
return null;
|
338
|
399
|
}
|
|
@@ -403,11 +464,65 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
403
|
464
|
}
|
404
|
465
|
return null;
|
405
|
466
|
}
|
406
|
|
-
|
407
|
|
- @Override
|
408
|
|
- public Void visitMatch(MatchExpression expression) {
|
409
|
|
- throw new UnsupportedOperationException();
|
410
|
|
- }
|
|
467
|
+
|
|
468
|
+ @Override
|
|
469
|
+ public Void visitMatch(MatchExpression expression) {
|
|
470
|
+
|
|
471
|
+ final Label start = new Label();
|
|
472
|
+ final Label end = new Label();
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+ javaWriter.label(start);
|
|
476
|
+ expression.value.accept(this);
|
|
477
|
+ if (expression.value.type == BasicTypeID.STRING)
|
|
478
|
+ javaWriter.invokeVirtual(new JavaMethodInfo(new JavaClassInfo("java/lang/Object"), "hashCode", "()I", 0));
|
|
479
|
+
|
|
480
|
+ final boolean hasNoDefault = hasNoDefault(expression);
|
|
481
|
+
|
|
482
|
+ final MatchExpression.Case[] cases = expression.cases;
|
|
483
|
+ final JavaSwitchLabel[] switchLabels = new JavaSwitchLabel[hasNoDefault ? cases.length : cases.length - 1];
|
|
484
|
+ final Label defaultLabel = new Label();
|
|
485
|
+
|
|
486
|
+ int i = 0;
|
|
487
|
+ for (final MatchExpression.Case matchCase : cases) {
|
|
488
|
+ if (matchCase.key != null) {
|
|
489
|
+ switchLabels[i++] = new JavaSwitchLabel(CompilerUtils.getKeyForSwitch(matchCase.key), new Label());
|
|
490
|
+ }
|
|
491
|
+ }
|
|
492
|
+
|
|
493
|
+ JavaSwitchLabel[] sortedSwitchLabels = Arrays.copyOf(switchLabels, switchLabels.length);
|
|
494
|
+ Arrays.sort(sortedSwitchLabels, (a, b) -> a.key - b.key);
|
|
495
|
+
|
|
496
|
+ javaWriter.lookupSwitch(defaultLabel, sortedSwitchLabels);
|
|
497
|
+
|
|
498
|
+ i = 0;
|
|
499
|
+ for (final MatchExpression.Case switchCase : cases) {
|
|
500
|
+ if (hasNoDefault || switchCase.key != null) {
|
|
501
|
+ javaWriter.label(switchLabels[i++].label);
|
|
502
|
+ } else {
|
|
503
|
+ javaWriter.label(defaultLabel);
|
|
504
|
+ }
|
|
505
|
+ switchCase.value.body.setTag(MatchExpression.class, expression);
|
|
506
|
+ switchCase.value.accept(this);
|
|
507
|
+ javaWriter.goTo(end);
|
|
508
|
+ }
|
|
509
|
+
|
|
510
|
+ if (hasNoDefault) {
|
|
511
|
+ javaWriter.label(defaultLabel);
|
|
512
|
+ }
|
|
513
|
+
|
|
514
|
+ javaWriter.label(end);
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+ //throw new UnsupportedOperationException("Not yet implemented!");
|
|
518
|
+ return null;
|
|
519
|
+ }
|
|
520
|
+
|
|
521
|
+ private boolean hasNoDefault(MatchExpression switchStatement) {
|
|
522
|
+ for (MatchExpression.Case switchCase : switchStatement.cases)
|
|
523
|
+ if (switchCase.key == null) return false;
|
|
524
|
+ return true;
|
|
525
|
+ }
|
411
|
526
|
|
412
|
527
|
@Override
|
413
|
528
|
public Void visitNew(NewExpression expression) {
|
|
@@ -460,23 +575,23 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
460
|
575
|
|
461
|
576
|
return null;
|
462
|
577
|
}
|
463
|
|
-
|
464
|
|
- @Override
|
465
|
|
- public Void visitPostCall(PostCallExpression expression) {
|
466
|
|
- expression.target.accept(this);
|
467
|
|
- javaWriter.dup(expression.type.accept(new JavaTypeVisitor()));
|
|
578
|
+
|
|
579
|
+ @Override
|
|
580
|
+ public Void visitPostCall(PostCallExpression expression) {
|
|
581
|
+ expression.target.accept(this);
|
|
582
|
+ javaWriter.dup(expression.type.accept(new JavaTypeVisitor()));
|
468
|
583
|
if (!checkAndExecuteByteCodeImplementation(expression.member) && !checkAndExecuteMethodInfo(expression.member))
|
469
|
584
|
throw new IllegalStateException("Call target has no method info!");
|
470
|
|
-
|
471
|
|
- return null;
|
472
|
|
- }
|
|
585
|
+
|
|
586
|
+ return null;
|
|
587
|
+ }
|
473
|
588
|
|
474
|
589
|
@Override
|
475
|
590
|
public Void visitRange(RangeExpression expression) {
|
476
|
|
- // TODO: there are other kinds of ranges also; there should be a Range<T, T> type with creation of synthetic types
|
|
591
|
+ // TODO: there are other kinds of ranges also; there should be a Range<T, T> type with creation of synthetic types
|
477
|
592
|
if (expression.from.type.accept(JavaTypeClassVisitor.INSTANCE) != int.class)
|
478
|
593
|
throw new CompileException(expression.position, CompileExceptionCode.INTERNAL_ERROR, "Only integer ranges supported");
|
479
|
|
-
|
|
594
|
+
|
480
|
595
|
javaWriter.newObject(IntRange.class);
|
481
|
596
|
javaWriter.dup();
|
482
|
597
|
expression.from.accept(this);
|
|
@@ -486,26 +601,26 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
486
|
601
|
|
487
|
602
|
return null;
|
488
|
603
|
}
|
489
|
|
-
|
490
|
|
- @Override
|
491
|
|
- public Void visitSameObject(SameObjectExpression expression) {
|
492
|
|
- expression.left.accept(this);
|
493
|
|
- expression.right.accept(this);
|
494
|
|
-
|
495
|
|
- Label end = new Label();
|
496
|
|
- Label equal = new Label();
|
497
|
|
-
|
498
|
|
- if (expression.inverted)
|
499
|
|
- javaWriter.ifACmpNe(equal);
|
500
|
|
- else
|
501
|
|
- javaWriter.ifACmpEq(equal);
|
502
|
|
- javaWriter.iConst0();
|
503
|
|
- javaWriter.goTo(end);
|
504
|
|
- javaWriter.label(equal);
|
505
|
|
- javaWriter.iConst1();
|
506
|
|
- javaWriter.label(end);
|
507
|
|
- return null;
|
508
|
|
- }
|
|
604
|
+
|
|
605
|
+ @Override
|
|
606
|
+ public Void visitSameObject(SameObjectExpression expression) {
|
|
607
|
+ expression.left.accept(this);
|
|
608
|
+ expression.right.accept(this);
|
|
609
|
+
|
|
610
|
+ Label end = new Label();
|
|
611
|
+ Label equal = new Label();
|
|
612
|
+
|
|
613
|
+ if (expression.inverted)
|
|
614
|
+ javaWriter.ifACmpNe(equal);
|
|
615
|
+ else
|
|
616
|
+ javaWriter.ifACmpEq(equal);
|
|
617
|
+ javaWriter.iConst0();
|
|
618
|
+ javaWriter.goTo(end);
|
|
619
|
+ javaWriter.label(equal);
|
|
620
|
+ javaWriter.iConst1();
|
|
621
|
+ javaWriter.label(end);
|
|
622
|
+ return null;
|
|
623
|
+ }
|
509
|
624
|
|
510
|
625
|
@Override
|
511
|
626
|
public Void visitSetField(SetFieldExpression expression) {
|
|
@@ -519,7 +634,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
519
|
634
|
@Override
|
520
|
635
|
public Void visitSetFunctionParameter(SetFunctionParameterExpression expression) {
|
521
|
636
|
expression.value.accept(this);
|
522
|
|
- JavaParameterInfo parameter = expression.parameter.getTag(JavaParameterInfo.class);
|
|
637
|
+ JavaParameterInfo parameter = expression.parameter.getTag(JavaParameterInfo.class);
|
523
|
638
|
javaWriter.store(expression.type.accept(JavaTypeVisitor.INSTANCE), parameter.index);
|
524
|
639
|
return null;
|
525
|
640
|
}
|
|
@@ -561,11 +676,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
561
|
676
|
public Void visitStaticSetter(StaticSetterExpression expression) {
|
562
|
677
|
return null;
|
563
|
678
|
}
|
564
|
|
-
|
565
|
|
- @Override
|
566
|
|
- public Void visitSupertypeCast(SupertypeCastExpression expression) {
|
567
|
|
- return null; // nothing to do
|
568
|
|
- }
|
|
679
|
+
|
|
680
|
+ @Override
|
|
681
|
+ public Void visitSupertypeCast(SupertypeCastExpression expression) {
|
|
682
|
+ return null; // nothing to do
|
|
683
|
+ }
|
569
|
684
|
|
570
|
685
|
@Override
|
571
|
686
|
public Void visitThis(ThisExpression expression) {
|
|
@@ -573,30 +688,30 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
|
573
|
688
|
return null;
|
574
|
689
|
}
|
575
|
690
|
|
576
|
|
- @Override
|
577
|
|
- public Void visitTryConvert(TryConvertExpression expression) {
|
578
|
|
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
579
|
|
- }
|
|
691
|
+ @Override
|
|
692
|
+ public Void visitTryConvert(TryConvertExpression expression) {
|
|
693
|
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
|
694
|
+ }
|
|
695
|
+
|
|
696
|
+ @Override
|
|
697
|
+ public Void visitTryRethrowAsException(TryRethrowAsExceptionExpression expression) {
|
|
698
|
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
|
699
|
+ }
|
580
|
700
|
|
581
|
|
- @Override
|
582
|
|
- public Void visitTryRethrowAsException(TryRethrowAsExceptionExpression expression) {
|
583
|
|
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
584
|
|
- }
|
|
701
|
+ @Override
|
|
702
|
+ public Void visitTryRethrowAsResult(TryRethrowAsResultExpression expression) {
|
|
703
|
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
|
704
|
+ }
|
585
|
705
|
|
586
|
|
- @Override
|
587
|
|
- public Void visitTryRethrowAsResult(TryRethrowAsResultExpression expression) {
|
588
|
|
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
589
|
|
- }
|
590
|
|
-
|
591
|
|
- @Override
|
592
|
|
- public Void visitVariantValue(VariantValueExpression expression) {
|
593
|
|
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
594
|
|
- }
|
|
706
|
+ @Override
|
|
707
|
+ public Void visitVariantValue(VariantValueExpression expression) {
|
|
708
|
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
|
709
|
+ }
|
595
|
710
|
|
596
|
711
|
@Override
|
597
|
712
|
public Void visitWrapOptional(WrapOptionalExpression expression) {
|
598
|
|
- // TODO: convert basic types (char, int, float, ...) to their boxed (Character, Integer, Float, ...) counterparts
|
599
|
|
- // -- any object type values can just be passed as-is
|
|
713
|
+ // TODO: convert basic types (char, int, float, ...) to their boxed (Character, Integer, Float, ...) counterparts
|
|
714
|
+ // -- any object type values can just be passed as-is
|
600
|
715
|
expression.value.accept(this);
|
601
|
716
|
return null;
|
602
|
717
|
}
|