Skip to content

Commit f16b721

Browse files
Implement new JVMCI methods
* `BootstrapMethodInvocation`: `resolve` and `lookup` * `ConstantPool`: `lookupBootstrapMethodInvocations` * `ResolvedJavaType`: `getAllMethods` * `ResolvedJavaMethod`: `isDeclared` and `isScoped` * Fix `getDeclaredConstructors` for primitive types
1 parent 1a9da78 commit f16b721

File tree

15 files changed

+208
-28
lines changed

15 files changed

+208
-28
lines changed

espresso-compiler-stub/src/com.oracle.truffle.espresso.graal/src/com/oracle/truffle/espresso/graal/DummyReplacements.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
package com.oracle.truffle.espresso.graal;
2424

2525
import java.util.BitSet;
26+
import java.util.Map;
2627

2728
import jdk.graal.compiler.api.replacements.SnippetTemplateCache;
2829
import jdk.graal.compiler.bytecode.BytecodeProvider;
@@ -40,6 +41,7 @@
4041
import jdk.graal.compiler.nodes.spi.SnippetParameterInfo;
4142
import jdk.graal.compiler.options.OptionValues;
4243
import jdk.graal.compiler.phases.util.Providers;
44+
import jdk.graal.compiler.replacements.SnippetTemplate;
4345
import jdk.vm.ci.meta.JavaKind;
4446
import jdk.vm.ci.meta.ResolvedJavaMethod;
4547

@@ -70,6 +72,11 @@ public GraphBuilderConfiguration.Plugins getGraphBuilderPlugins() {
7072
throw GraalError.unimplementedOverride();
7173
}
7274

75+
@Override
76+
public Map<SnippetTemplate.CacheKey, SnippetTemplate> getTemplatesCache() {
77+
throw GraalError.unimplementedOverride();
78+
}
79+
7380
@Override
7481
public Class<? extends GraphBuilderPlugin> getIntrinsifyingPlugin(ResolvedJavaMethod method) {
7582
throw GraalError.unimplementedOverride();

espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoBootstrapMethodInvocation.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import java.util.List;
2828
import java.util.StringJoiner;
2929

30-
import jdk.vm.ci.common.JVMCIError;
3130
import jdk.vm.ci.meta.ConstantPool;
3231
import jdk.vm.ci.meta.JavaConstant;
3332

@@ -41,13 +40,17 @@ public final class EspressoBootstrapMethodInvocation implements ConstantPool.Boo
4140
private final String name;
4241
private final JavaConstant type;
4342
private final List<JavaConstant> staticArguments;
43+
private final int cpi;
44+
private final EspressoConstantPool constantPool;
4445

45-
EspressoBootstrapMethodInvocation(boolean indy, EspressoResolvedJavaMethod method, String name, JavaConstant type, JavaConstant[] staticArguments) {
46+
EspressoBootstrapMethodInvocation(boolean indy, EspressoResolvedJavaMethod method, String name, JavaConstant type, JavaConstant[] staticArguments, int cpi, EspressoConstantPool constantPool) {
4647
this.indy = indy;
4748
this.method = method;
4849
this.name = name;
4950
this.type = type;
5051
this.staticArguments = Collections.unmodifiableList(Arrays.asList(staticArguments));
52+
this.cpi = cpi;
53+
this.constantPool = constantPool;
5154
}
5255

5356
@Override
@@ -77,12 +80,20 @@ public List<JavaConstant> getStaticArguments() {
7780

7881
@Override
7982
public void resolve() {
80-
throw JVMCIError.unimplemented();
83+
if (isInvokeDynamic()) {
84+
constantPool.loadReferencedType(cpi, EspressoConstantPool.INVOKEDYNAMIC);
85+
} else {
86+
constantPool.lookupConstant(cpi, true);
87+
}
8188
}
8289

8390
@Override
8491
public JavaConstant lookup() {
85-
throw JVMCIError.unimplemented();
92+
if (isInvokeDynamic()) {
93+
return constantPool.lookupAppendix(cpi, EspressoConstantPool.INVOKEDYNAMIC);
94+
} else {
95+
return (JavaConstant) constantPool.lookupConstant(cpi, false);
96+
}
8697
}
8798

8899
@Override

espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoConstantPool.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@
2525
import static com.oracle.truffle.espresso.jvmci.EspressoJVMCIRuntime.runtime;
2626

2727
import java.lang.invoke.MethodHandle;
28+
import java.util.ArrayList;
29+
import java.util.Collections;
2830
import java.util.List;
2931

30-
import jdk.vm.ci.common.JVMCIError;
3132
import jdk.vm.ci.meta.ConstantPool;
3233
import jdk.vm.ci.meta.JavaConstant;
3334
import jdk.vm.ci.meta.JavaField;
@@ -126,11 +127,36 @@ public JavaMethod lookupMethod(int cpi, int opcode, ResolvedJavaMethod caller) {
126127
@Override
127128
public native EspressoBootstrapMethodInvocation lookupBootstrapMethodInvocation(int cpi, int opcode);
128129

130+
private native EspressoBootstrapMethodInvocation lookupIndyBootstrapMethodInvocation(int siteIndex);
131+
129132
@Override
130133
public List<BootstrapMethodInvocation> lookupBootstrapMethodInvocations(boolean invokeDynamic) {
131-
throw JVMCIError.unimplemented();
134+
List<BootstrapMethodInvocation> result;
135+
if (invokeDynamic) {
136+
int indyEntries = getNumIndyEntries();
137+
if (indyEntries == 0) {
138+
return Collections.emptyList();
139+
}
140+
result = new ArrayList<>(indyEntries);
141+
for (int i = 0; i < indyEntries; i++) {
142+
result.add(lookupIndyBootstrapMethodInvocation(i));
143+
}
144+
} else {
145+
result = new ArrayList<>();
146+
int length = length();
147+
for (int i = 0; i < length; i++) {
148+
byte tagByte = getTagByteAt(i);
149+
if (tagByte == 17) {
150+
// Dynamic
151+
result.add(lookupBootstrapMethodInvocation(i, -1));
152+
}
153+
}
154+
}
155+
return result;
132156
}
133157

158+
private native int getNumIndyEntries();
159+
134160
@Override
135161
public native JavaType lookupType(int cpi, int opcode);
136162

espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedInstanceType.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,9 +488,11 @@ public List<ResolvedJavaMethod> getAllMethods(boolean forceLink) {
488488
if (forceLink) {
489489
link();
490490
}
491-
throw JVMCIError.unimplemented();
491+
return Arrays.asList(getAllMethods0());
492492
}
493493

494+
private native EspressoResolvedJavaMethod[] getAllMethods0();
495+
494496
@Override
495497
public native EspressoResolvedJavaMethod getClassInitializer();
496498

espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedJavaMethod.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import static com.oracle.truffle.espresso.jvmci.EspressoJVMCIRuntime.runtime;
2626
import static com.oracle.truffle.espresso.jvmci.meta.EspressoResolvedJavaType.NO_ANNOTATIONS;
2727
import static com.oracle.truffle.espresso.jvmci.meta.ExtendedModifiers.BRIDGE;
28+
import static com.oracle.truffle.espresso.jvmci.meta.ExtendedModifiers.SCOPED_METHOD;
2829
import static com.oracle.truffle.espresso.jvmci.meta.ExtendedModifiers.SYNTHETIC;
2930
import static com.oracle.truffle.espresso.jvmci.meta.ExtendedModifiers.VARARGS;
3031
import static java.lang.reflect.Modifier.ABSTRACT;
@@ -59,13 +60,15 @@ public final class EspressoResolvedJavaMethod implements ResolvedJavaMethod {
5960
public static final Parameter[] NO_PARAMETERS = new Parameter[0];
6061

6162
private final EspressoResolvedInstanceType holder;
63+
private final boolean poisonPill;
6264
private Executable mirrorCache;
6365
private String nameCache;
6466
private byte[] code;
6567
private EspressoSignature signature;
6668

67-
private EspressoResolvedJavaMethod(EspressoResolvedInstanceType holder) {
69+
private EspressoResolvedJavaMethod(EspressoResolvedInstanceType holder, boolean poisonPill) {
6870
this.holder = holder;
71+
this.poisonPill = poisonPill;
6972
}
7073

7174
@Override
@@ -148,7 +151,10 @@ public boolean isDefault() {
148151

149152
@Override
150153
public boolean isDeclared() {
151-
throw JVMCIError.unimplemented();
154+
if (isConstructor() || isClassInitializer()) {
155+
return false;
156+
}
157+
return !poisonPill;
152158
}
153159

154160
@Override
@@ -328,6 +334,11 @@ public Executable getMirror() {
328334

329335
public native boolean isLeafMethod();
330336

337+
@Override
338+
public boolean isScoped() {
339+
return (getFlags() & SCOPED_METHOD) != 0;
340+
}
341+
331342
@Override
332343
public boolean equals(Object o) {
333344
if (this == o) {
@@ -337,13 +348,17 @@ public boolean equals(Object o) {
337348
return false;
338349
}
339350
EspressoResolvedJavaMethod that = (EspressoResolvedJavaMethod) o;
340-
return equals0(that);
351+
return this.poisonPill == that.poisonPill && equals0(that);
341352
}
342353

343354
private native boolean equals0(EspressoResolvedJavaMethod that);
344355

345356
@Override
346-
public native int hashCode();
357+
public int hashCode() {
358+
return 13 * Boolean.hashCode(poisonPill) + hashCode0();
359+
}
360+
361+
private native int hashCode0();
347362

348363
@Override
349364
public String toString() {

espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedJavaType.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,15 +52,21 @@ public EspressoResolvedArrayType getArrayClass() {
5252
public abstract boolean isDefinitelyResolvedWithRespectTo(ResolvedJavaType accessingClass);
5353

5454
@Override
55-
public ResolvedJavaMethod[] getDeclaredMethods() {
55+
public final ResolvedJavaMethod[] getDeclaredMethods() {
5656
return getDeclaredMethods(true);
5757
}
5858

5959
@Override
60-
public ResolvedJavaMethod[] getDeclaredConstructors() {
60+
public abstract ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink);
61+
62+
@Override
63+
public final ResolvedJavaMethod[] getDeclaredConstructors() {
6164
return getDeclaredConstructors(true);
6265
}
6366

67+
@Override
68+
public abstract ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink);
69+
6470
@Override
6571
public String toString() {
6672
return getClass().getSimpleName() + "<" + getName() + ">";

espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedPrimitiveType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,11 @@ public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) {
250250
return NO_METHODS;
251251
}
252252

253+
@Override
254+
public ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink) {
255+
return NO_METHODS;
256+
}
257+
253258
@Override
254259
public List<ResolvedJavaMethod> getAllMethods(boolean forceLink) {
255260
return Collections.emptyList();

espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/ExtendedModifiers.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public final class ExtendedModifiers {
3131
public static final int HIDDEN = 0x00100000;
3232
public static final int FINALIZER = 0x00010000;
3333
static final int STABLE_FIELD = 0x00010000;
34+
static final int SCOPED_METHOD = 0x00200000;
3435

3536
private ExtendedModifiers() {
3637
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/descriptors/EspressoSymbols.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,6 +1382,8 @@ public static class Signatures {
13821382
public static final Symbol<Signature> _void_EspressoResolvedJavaType_int_Class = SYMBOLS.putSignature(Types._void, Types.com_oracle_truffle_espresso_jvmci_meta_EspressoResolvedJavaType,
13831383
Types._int, Types.java_lang_Class);
13841384
public static final Symbol<Signature> _void_EspressoResolvedInstanceType = SYMBOLS.putSignature(Types._void, Types.com_oracle_truffle_espresso_jvmci_meta_EspressoResolvedInstanceType);
1385+
public static final Symbol<Signature> _void_EspressoResolvedInstanceType_boolean = SYMBOLS.putSignature(Types._void, Types.com_oracle_truffle_espresso_jvmci_meta_EspressoResolvedInstanceType,
1386+
Types._boolean);
13851387
public static final Symbol<Signature> EspressoResolvedPrimitiveType_int = SYMBOLS.putSignature(Types.com_oracle_truffle_espresso_jvmci_meta_EspressoResolvedPrimitiveType, Types._int);
13861388
public static final Symbol<Signature> DummyEspressoGraalJVMCICompiler_JVMCIRuntime = SYMBOLS.putSignature(Types.jdk_graal_compiler_espresso_DummyEspressoGraalJVMCICompiler,
13871389
Types.jdk_vm_ci_runtime_JVMCIRuntime);
@@ -1398,8 +1400,9 @@ public static class Signatures {
13981400
public static final Symbol<Signature> PrimitiveConstant_float = SYMBOLS.putSignature(Types.jdk_vm_ci_meta_PrimitiveConstant, Types._float);
13991401
public static final Symbol<Signature> PrimitiveConstant_double = SYMBOLS.putSignature(Types.jdk_vm_ci_meta_PrimitiveConstant, Types._double);
14001402
public static final Symbol<Signature> PrimitiveConstant_char_long = SYMBOLS.putSignature(Types.jdk_vm_ci_meta_PrimitiveConstant, Types._char, Types._long);
1401-
public static final Symbol<Signature> _void_boolean_EspressoResolvedJavaMethod_String_JavaConstant_JavaConstant_array = SYMBOLS.putSignature(Types._void, Types._boolean,
1402-
Types.com_oracle_truffle_espresso_jvmci_meta_EspressoResolvedJavaMethod, Types.java_lang_String, Types.jdk_vm_ci_meta_JavaConstant, Types.jdk_vm_ci_meta_JavaConstant_array);
1403+
public static final Symbol<Signature> _void_boolean_EspressoResolvedJavaMethod_String_JavaConstant_JavaConstant_array_int_EspressoConstantPool = SYMBOLS.putSignature(Types._void,
1404+
Types._boolean, Types.com_oracle_truffle_espresso_jvmci_meta_EspressoResolvedJavaMethod, Types.java_lang_String, Types.jdk_vm_ci_meta_JavaConstant,
1405+
Types.jdk_vm_ci_meta_JavaConstant_array, Types._int, Types.com_oracle_truffle_espresso_jvmci_meta_EspressoConstantPool);
14031406
public static final Symbol<Signature> UnresolvedJavaType_String = SYMBOLS.putSignature(Types.jdk_vm_ci_meta_UnresolvedJavaType, Types.java_lang_String);
14041407

14051408
public static final Symbol<Signature> _void_sun_misc_Signal = SYMBOLS.putSignature(Types._void, Types.sun_misc_Signal);

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/ObjectKlass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,7 @@ public Method[] getDeclaredConstructors() {
758758
return constructors.toArray(Method.EMPTY_ARRAY);
759759
}
760760

761-
Method.MethodVersion[] getMirandaMethods() {
761+
public Method.MethodVersion[] getMirandaMethods() {
762762
return getKlassVersion().mirandaMethods;
763763
}
764764

0 commit comments

Comments
 (0)