Skip to content

Commit 2e76289

Browse files
Remember the type of sub-int Dynamic constants
1 parent 3a3e425 commit 2e76289

File tree

8 files changed

+65
-5
lines changed

8 files changed

+65
-5
lines changed

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/constantpool/Resolution.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.oracle.truffle.espresso.EspressoLanguage;
3232
import com.oracle.truffle.espresso.EspressoOptions;
3333
import com.oracle.truffle.espresso.classfile.ConstantPool.Tag;
34+
import com.oracle.truffle.espresso.classfile.JavaKind;
3435
import com.oracle.truffle.espresso.classfile.attributes.BootstrapMethodsAttribute;
3536
import com.oracle.truffle.espresso.classfile.constantpool.ClassConstant;
3637
import com.oracle.truffle.espresso.classfile.constantpool.ClassMethodRefConstant;
@@ -540,17 +541,18 @@ public static Resolvable.ResolvedConstant resolveInvokeDynamicConstant(InvokeDyn
540541
}
541542

542543
private static ResolvedDynamicConstant makeResolved(Klass type, StaticObject result) {
543-
switch (type.getJavaKind()) {
544+
JavaKind kind = type.getJavaKind();
545+
switch (kind) {
544546
case Boolean:
545547
case Byte:
546548
case Short:
547549
case Char: {
548-
int value = (int) MHLinkToNode.rebasic(type.getMeta().unboxGuest(result), type.getJavaKind());
549-
return new ResolvedIntDynamicConstant(value);
550+
int value = (int) MHLinkToNode.rebasic(type.getMeta().unboxGuest(result), kind);
551+
return new ResolvedIntDynamicConstant(value, kind);
550552
}
551553
case Int: {
552554
int value = type.getMeta().unboxInteger(result);
553-
return new ResolvedIntDynamicConstant(value);
555+
return new ResolvedIntDynamicConstant(value, JavaKind.Int);
554556
}
555557
case Float: {
556558
float value = type.getMeta().unboxFloat(result);

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/constantpool/ResolvedDoubleDynamicConstant.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import com.oracle.truffle.api.frame.VirtualFrame;
2626
import com.oracle.truffle.espresso.classfile.ConstantPool;
27+
import com.oracle.truffle.espresso.classfile.JavaKind;
2728
import com.oracle.truffle.espresso.nodes.BytecodeNode;
2829
import com.oracle.truffle.espresso.nodes.EspressoFrame;
2930

@@ -44,6 +45,11 @@ public Object value() {
4445
return resolved;
4546
}
4647

48+
@Override
49+
public JavaKind getKind() {
50+
return JavaKind.Double;
51+
}
52+
4753
@Override
4854
public String toString(ConstantPool pool) {
4955
return "ResolvedDynamicConstant(" + resolved + ")";

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/constantpool/ResolvedDynamicConstant.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import com.oracle.truffle.api.frame.VirtualFrame;
2626
import com.oracle.truffle.espresso.classfile.ConstantPool;
27+
import com.oracle.truffle.espresso.classfile.JavaKind;
2728
import com.oracle.truffle.espresso.classfile.constantpool.DynamicConstant;
2829
import com.oracle.truffle.espresso.classfile.constantpool.NameAndTypeConstant;
2930
import com.oracle.truffle.espresso.classfile.constantpool.Resolvable;
@@ -52,6 +53,8 @@ default NameAndTypeConstant getNameAndType(ConstantPool pool) {
5253
throw EspressoError.shouldNotReachHere("Getting name and type of a resolved dynamic constant");
5354
}
5455

56+
JavaKind getKind();
57+
5558
default StaticObject guestBoxedValue(Meta meta) {
5659
Object value = value();
5760
if (value instanceof StaticObject) {

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/constantpool/ResolvedFailDynamicConstant.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.oracle.truffle.api.CompilerDirectives;
2626
import com.oracle.truffle.api.frame.VirtualFrame;
2727
import com.oracle.truffle.espresso.classfile.ConstantPool;
28+
import com.oracle.truffle.espresso.classfile.JavaKind;
2829
import com.oracle.truffle.espresso.nodes.BytecodeNode;
2930
import com.oracle.truffle.espresso.meta.EspressoError;
3031
import com.oracle.truffle.espresso.runtime.EspressoException;
@@ -53,6 +54,11 @@ public Object value() {
5354
throw EspressoError.shouldNotReachHere("Failure should have arose earlier.");
5455
}
5556

57+
@Override
58+
public JavaKind getKind() {
59+
return JavaKind.Illegal;
60+
}
61+
5662
@Override
5763
public String toString(ConstantPool pool) {
5864
return "ResolvedDynamicConstant(" + failure + ")";

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/constantpool/ResolvedFloatDynamicConstant.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import com.oracle.truffle.api.frame.VirtualFrame;
2626
import com.oracle.truffle.espresso.classfile.ConstantPool;
27+
import com.oracle.truffle.espresso.classfile.JavaKind;
2728
import com.oracle.truffle.espresso.nodes.BytecodeNode;
2829
import com.oracle.truffle.espresso.nodes.EspressoFrame;
2930

@@ -44,6 +45,11 @@ public Object value() {
4445
return resolved;
4546
}
4647

48+
@Override
49+
public JavaKind getKind() {
50+
return JavaKind.Float;
51+
}
52+
4753
@Override
4854
public String toString(ConstantPool pool) {
4955
return "ResolvedDynamicConstant(" + resolved + ")";

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/constantpool/ResolvedIntDynamicConstant.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,20 @@
2424

2525
import com.oracle.truffle.api.frame.VirtualFrame;
2626
import com.oracle.truffle.espresso.classfile.ConstantPool;
27+
import com.oracle.truffle.espresso.classfile.JavaKind;
28+
import com.oracle.truffle.espresso.meta.EspressoError;
29+
import com.oracle.truffle.espresso.meta.Meta;
2730
import com.oracle.truffle.espresso.nodes.BytecodeNode;
2831
import com.oracle.truffle.espresso.nodes.EspressoFrame;
32+
import com.oracle.truffle.espresso.runtime.staticobject.StaticObject;
2933

3034
public final class ResolvedIntDynamicConstant implements ResolvedDynamicConstant {
3135
final int resolved;
36+
final JavaKind kind;
3237

33-
public ResolvedIntDynamicConstant(int resolved) {
38+
public ResolvedIntDynamicConstant(int resolved, JavaKind kind) {
3439
this.resolved = resolved;
40+
this.kind = kind;
3541
}
3642

3743
@Override
@@ -44,6 +50,25 @@ public Object value() {
4450
return resolved;
4551
}
4652

53+
@Override
54+
public JavaKind getKind() {
55+
return kind;
56+
}
57+
58+
@Override
59+
public StaticObject guestBoxedValue(Meta meta) {
60+
Object value = switch (kind) {
61+
case Boolean -> resolved != 0;
62+
case Byte -> (byte) resolved;
63+
case Short -> (short) resolved;
64+
case Char -> (char) resolved;
65+
case Int -> resolved;
66+
default ->
67+
throw EspressoError.shouldNotReachHere(kind.toString());
68+
};
69+
return Meta.box(meta, value);
70+
}
71+
4772
@Override
4873
public String toString(ConstantPool pool) {
4974
return "ResolvedDynamicConstant(" + resolved + ")";

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/constantpool/ResolvedLongDynamicConstant.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import com.oracle.truffle.api.frame.VirtualFrame;
2626
import com.oracle.truffle.espresso.classfile.ConstantPool;
27+
import com.oracle.truffle.espresso.classfile.JavaKind;
2728
import com.oracle.truffle.espresso.nodes.BytecodeNode;
2829
import com.oracle.truffle.espresso.nodes.EspressoFrame;
2930

@@ -44,6 +45,11 @@ public Object value() {
4445
return resolved;
4546
}
4647

48+
@Override
49+
public JavaKind getKind() {
50+
return JavaKind.Long;
51+
}
52+
4753
@Override
4854
public String toString(ConstantPool pool) {
4955
return "ResolvedDynamicConstant(" + resolved + ")";

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/constantpool/ResolvedObjectDynamicConstant.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import com.oracle.truffle.api.frame.VirtualFrame;
2626
import com.oracle.truffle.espresso.classfile.ConstantPool;
27+
import com.oracle.truffle.espresso.classfile.JavaKind;
2728
import com.oracle.truffle.espresso.nodes.BytecodeNode;
2829
import com.oracle.truffle.espresso.nodes.EspressoFrame;
2930
import com.oracle.truffle.espresso.runtime.staticobject.StaticObject;
@@ -45,6 +46,11 @@ public Object value() {
4546
return resolved;
4647
}
4748

49+
@Override
50+
public JavaKind getKind() {
51+
return JavaKind.Object;
52+
}
53+
4854
@Override
4955
public String toString(ConstantPool pool) {
5056
return "ResolvedDynamicConstant(" + resolved + ")";

0 commit comments

Comments
 (0)