Skip to content

Commit 23f5cb7

Browse files
committed
Overlay cached primitives in the interpreter CP.
1 parent bc9456d commit 23f5cb7

File tree

2 files changed

+54
-1
lines changed
  • espresso-shared/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile
  • substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata

2 files changed

+54
-1
lines changed

espresso-shared/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/ConstantPool.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ protected RuntimeException unexpectedEntry(int index, String description, Tag...
295295
throw unexpectedEntry(index, tagAt(index), description, expected);
296296
}
297297

298-
private void checkTag(int index, byte expectedTag) {
298+
protected void checkTag(int index, byte expectedTag) {
299299
byte tag = byteTagAt(index);
300300
if (tag != expectedTag) {
301301
throw unexpectedEntry(index, Tag.fromValue(tag), null, Tag.fromValue(expectedTag));

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterConstantPool.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828

2929
import java.util.List;
3030

31+
import jdk.vm.ci.meta.JavaKind;
32+
import jdk.vm.ci.meta.PrimitiveConstant;
3133
import org.graalvm.nativeimage.Platform;
3234
import org.graalvm.nativeimage.Platforms;
3335

@@ -261,7 +263,58 @@ public InterpreterResolvedObjectType resolvedTypeAt(InterpreterResolvedObjectTyp
261263

262264
public String resolveStringAt(int cpi) {
263265
Object resolvedEntry = resolvedAt(cpi, null);
266+
if (resolvedEntry instanceof ReferenceConstant<?> referenceConstant) {
267+
resolvedEntry = referenceConstant.getReferent();
268+
}
264269
assert resolvedEntry != null;
265270
return (String) resolvedEntry;
266271
}
272+
273+
@Override
274+
public int intAt(int index) {
275+
checkTag(index, CONSTANT_Integer);
276+
Object entry = cachedEntries[index];
277+
assert entry == null || entry instanceof PrimitiveConstant;
278+
if (entry instanceof PrimitiveConstant primitiveConstant) {
279+
assert primitiveConstant.getJavaKind() == JavaKind.Int;
280+
return primitiveConstant.asInt();
281+
}
282+
return super.intAt(index);
283+
}
284+
285+
@Override
286+
public float floatAt(int index) {
287+
checkTag(index, CONSTANT_Float);
288+
Object entry = cachedEntries[index];
289+
assert entry == null || entry instanceof PrimitiveConstant;
290+
if (entry instanceof PrimitiveConstant primitiveConstant) {
291+
assert primitiveConstant.getJavaKind() == JavaKind.Float;
292+
return primitiveConstant.asFloat();
293+
}
294+
return super.floatAt(index);
295+
}
296+
297+
@Override
298+
public double doubleAt(int index) {
299+
checkTag(index, CONSTANT_Double);
300+
Object entry = cachedEntries[index];
301+
assert entry == null || entry instanceof PrimitiveConstant;
302+
if (entry instanceof PrimitiveConstant primitiveConstant) {
303+
assert primitiveConstant.getJavaKind() == JavaKind.Double;
304+
return primitiveConstant.asDouble();
305+
}
306+
return super.doubleAt(index);
307+
}
308+
309+
@Override
310+
public long longAt(int index) {
311+
checkTag(index, CONSTANT_Long);
312+
Object entry = cachedEntries[index];
313+
assert entry == null || entry instanceof PrimitiveConstant;
314+
if (entry instanceof PrimitiveConstant primitiveConstant) {
315+
assert primitiveConstant.getJavaKind() == JavaKind.Long;
316+
return primitiveConstant.asLong();
317+
}
318+
return super.longAt(index);
319+
}
267320
}

0 commit comments

Comments
 (0)