Skip to content

Commit 37bad09

Browse files
committed
move resolver to classfile module
1 parent d26518c commit 37bad09

29 files changed

+715
-304
lines changed

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/resolver/CallKind.java renamed to espresso/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/resolver/CallKind.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
* questions.
2222
*/
2323

24-
package com.oracle.truffle.espresso.resolver;
24+
package com.oracle.truffle.espresso.shared.resolver;
2525

2626
/**
2727
* Indicates what dispatch behavior should be performed for a call-site.

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/resolver/meta/FieldType.java renamed to espresso/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/resolver/CallSiteType.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,19 @@
2121
* questions.
2222
*/
2323

24-
package com.oracle.truffle.espresso.resolver.meta;
24+
package com.oracle.truffle.espresso.shared.resolver;
2525

26-
public interface FieldType<C extends ClassType<C, M, F>, M extends MethodType<C, M, F>, F extends FieldType<C, M, F>> extends Member<C, M, F> {
26+
import com.oracle.truffle.espresso.shared.classfile.bytecode.Bytecodes;
2727

28+
/**
29+
* Describes the type of call-site resolution that should happen for a given call-site. For
30+
* call-sites in the bytecodes, they correspond 1-to-1 to {@link Bytecodes#INVOKESTATIC},
31+
* {@link Bytecodes#INVOKESPECIAL}, {@link Bytecodes#INVOKEVIRTUAL},
32+
* {@link Bytecodes#INVOKEINTERFACE}.
33+
*/
34+
public enum CallSiteType {
35+
Static,
36+
Special,
37+
Virtual,
38+
Interface;
2839
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.oracle.truffle.espresso.shared.resolver;
2+
3+
public enum FieldAccessType {
4+
GetStatic(true, false),
5+
PutStatic(true, true),
6+
GetInstance(false, false),
7+
PutInstance(false, true);
8+
9+
private final boolean isStatic;
10+
private final boolean isPut;
11+
12+
FieldAccessType(boolean isStatic, boolean isPut) {
13+
this.isStatic = isStatic;
14+
this.isPut = isPut;
15+
}
16+
17+
public boolean isStatic() {
18+
return isStatic;
19+
}
20+
21+
public boolean isPut() {
22+
return isPut;
23+
}
24+
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/resolver/LinkResolver.java renamed to espresso/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/resolver/LinkResolver.java

Lines changed: 53 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,28 @@
2121
* questions.
2222
*/
2323

24-
package com.oracle.truffle.espresso.resolver;
24+
package com.oracle.truffle.espresso.shared.resolver;
2525

26-
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
27-
import com.oracle.truffle.espresso.classfile.descriptors.Symbol;
28-
import com.oracle.truffle.espresso.classfile.descriptors.Symbol.Name;
29-
import com.oracle.truffle.espresso.classfile.descriptors.Symbol.Signature;
30-
import com.oracle.truffle.espresso.classfile.descriptors.Symbol.Type;
31-
import com.oracle.truffle.espresso.resolver.meta.ClassType;
32-
import com.oracle.truffle.espresso.resolver.meta.ErrorType;
33-
import com.oracle.truffle.espresso.resolver.meta.FieldType;
34-
import com.oracle.truffle.espresso.resolver.meta.MethodType;
35-
import com.oracle.truffle.espresso.resolver.meta.RuntimeAccess;
36-
37-
public final class LinkResolver<R extends RuntimeAccess<C, M, F>, C extends ClassType<C, M, F>, M extends MethodType<C, M, F>, F extends FieldType<C, M, F>> {
38-
private final LinkResolverImpl<R, C, M, F> impl = new LinkResolverImpl<>();
26+
import com.oracle.truffle.espresso.shared.descriptors.Symbol;
27+
import com.oracle.truffle.espresso.shared.descriptors.Symbol.Name;
28+
import com.oracle.truffle.espresso.shared.descriptors.Symbol.Signature;
29+
import com.oracle.truffle.espresso.shared.descriptors.Symbol.Type;
30+
import com.oracle.truffle.espresso.classfile.resolver.meta.ErrorType;
31+
import com.oracle.truffle.espresso.classfile.resolver.meta.FieldAccess;
32+
import com.oracle.truffle.espresso.classfile.resolver.meta.MethodAccess;
33+
import com.oracle.truffle.espresso.classfile.resolver.meta.RuntimeAccess;
34+
import com.oracle.truffle.espresso.classfile.resolver.meta.TypeAccess;
3935

36+
/**
37+
* Provides resolution capabilities according to the Java Virtual Machine Specification on behalf of
38+
* a VM.
39+
*
40+
* @param <R> The class providing VM access.
41+
* @param <C> The class representing the VM-side java {@link java.lang.Class}.
42+
* @param <M> The class representing the VM-side java {@link java.lang.reflect.Method}.
43+
* @param <F> The class representing the VM-side java {@link java.lang.reflect.Field}.
44+
*/
45+
public final class LinkResolver<R extends RuntimeAccess<C, M, F>, C extends TypeAccess<C, M, F>, M extends MethodAccess<C, M, F>, F extends FieldAccess<C, M, F>> {
4046
/**
4147
* Symbolically resolves a field.
4248
*
@@ -50,7 +56,7 @@ public final class LinkResolver<R extends RuntimeAccess<C, M, F>, C extends Clas
5056
public F resolveFieldSymbol(R meta, C accessingKlass,
5157
Symbol<Name> name, Symbol<Type> type, C symbolicHolder,
5258
boolean accessCheck, boolean loadingConstraints) {
53-
return impl.resolveFieldSymbol(meta, accessingKlass, name, type, symbolicHolder, accessCheck, loadingConstraints);
59+
return resolveFieldSymbolImpl(meta, accessingKlass, name, type, symbolicHolder, accessCheck, loadingConstraints);
5460
}
5561

5662
/**
@@ -66,7 +72,7 @@ public F resolveFieldSymbol(R meta, C accessingKlass,
6672
* @param fieldAccessType The {@link FieldAccessType} representing the access site to resolve.
6773
*/
6874
public F resolveFieldAccess(R meta, C currentKlass, M currentMethod, F symbolicResolution, FieldAccessType fieldAccessType) {
69-
return impl.resolveFieldAccess(meta, symbolicResolution, fieldAccessType, currentKlass, currentMethod);
75+
return resolveFieldAccessImpl(meta, symbolicResolution, fieldAccessType, currentKlass, currentMethod);
7076
}
7177

7278
/**
@@ -83,7 +89,7 @@ public M resolveMethodSymbol(R meta, C accessingKlass,
8389
Symbol<Name> name, Symbol<Signature> signature, C symbolicHolder,
8490
boolean interfaceLookup,
8591
boolean accessCheck, boolean loadingConstraints) {
86-
return impl.resolveMethodSymbol(meta, accessingKlass, name, signature, symbolicHolder, interfaceLookup, accessCheck, loadingConstraints);
92+
return resolveMethodSymbolImpl(meta, accessingKlass, name, signature, symbolicHolder, interfaceLookup, accessCheck, loadingConstraints);
8793
}
8894

8995
/**
@@ -97,11 +103,10 @@ public M resolveMethodSymbol(R meta, C accessingKlass,
97103
* {@code symbolicResolution.getDeclaringKlass()}.
98104
*/
99105
public ResolvedCall<C, M, F> resolveCallSite(R meta, C currentKlass, M symbolicResolution, CallSiteType callSiteType, C symbolicHolder) {
100-
return impl.resolveCallSite(meta, currentKlass, symbolicResolution, callSiteType, symbolicHolder);
106+
return resolveCallSiteImpl(meta, currentKlass, symbolicResolution, callSiteType, symbolicHolder);
101107
}
102-
}
103108

104-
final class LinkResolverImpl<R extends RuntimeAccess<C, M, F>, C extends ClassType<C, M, F>, M extends MethodType<C, M, F>, F extends FieldType<C, M, F>> {
109+
// Implementation
105110

106111
private static final String AN_INTERFACE = "an interface";
107112
private static final String A_CLASS = "a class";
@@ -110,24 +115,23 @@ final class LinkResolverImpl<R extends RuntimeAccess<C, M, F>, C extends ClassTy
110115
private static final String INIT = "<init>";
111116
private static final String CLINIT = "<clinit>";
112117

113-
@TruffleBoundary
114-
public F resolveFieldSymbol(R meta, C accessingKlass,
118+
private F resolveFieldSymbolImpl(R meta, C accessingKlass,
115119
Symbol<Name> name, Symbol<Type> type, C symbolicHolder,
116120
boolean accessCheck, boolean loadingConstraints) {
117121
F f = symbolicHolder.lookupField(name, type);
118122
if (f == null) {
119123
throw meta.throwError(ErrorType.NoSuchFieldError, "%s", name);
120124
}
121125
if (accessCheck) {
122-
meta.fieldAccessCheck(f, accessingKlass, symbolicHolder);
126+
f.accessChecks(accessingKlass, symbolicHolder);
123127
}
124128
if (loadingConstraints) {
125-
meta.fieldLoadingConstraints(f, accessingKlass);
129+
f.loadingConstraints(accessingKlass);
126130
}
127131
return f;
128132
}
129133

130-
public F resolveFieldAccess(R meta, F field, FieldAccessType fieldAccessType,
134+
private F resolveFieldAccessImpl(R meta, F field, FieldAccessType fieldAccessType,
131135
C currentKlass, M currentMethod) {
132136
/*
133137
* PUTFIELD/GETFIELD: Otherwise, if the resolved field is a static field, putfield throws an
@@ -142,7 +146,7 @@ public F resolveFieldAccess(R meta, F field, FieldAccessType fieldAccessType,
142146
"Expected %s field %s.%s",
143147
(fieldAccessType.isStatic()) ? STATIC : NON_STATIC,
144148
field.getDeclaringClass().getJavaName(),
145-
field.getName());
149+
field.getSymbolicName());
146150
}
147151
if (fieldAccessType.isPut()) {
148152
/*
@@ -160,19 +164,19 @@ public F resolveFieldAccess(R meta, F field, FieldAccessType fieldAccessType,
160164
"Update to %s final field %s.%s attempted from a different class (%s) than the field's declaring class",
161165
(fieldAccessType.isStatic()) ? STATIC : NON_STATIC,
162166
field.getDeclaringClass().getJavaName(),
163-
field.getName(),
167+
field.getSymbolicName(),
164168
currentKlass.getJavaName());
165169
}
166-
boolean enforceInitializerCheck = meta.enforceInitializerCheck(field);
170+
boolean enforceInitializerCheck = field.shouldEnforceInitializerCheck();
167171
if (enforceInitializerCheck) {
168172
if (!((fieldAccessType.isStatic() && currentMethod.isClassInitializer()) ||
169173
(!fieldAccessType.isStatic() && currentMethod.isConstructor()))) {
170174
throw meta.throwError(ErrorType.IllegalAccessError,
171175
"Update to %s final field %s.%s attempted from a different method (%s) than the initializer method %s ",
172176
(fieldAccessType.isStatic()) ? STATIC : NON_STATIC,
173177
field.getDeclaringClass().getJavaName(),
174-
field.getName(),
175-
currentMethod.getName(),
178+
field.getSymbolicName(),
179+
currentMethod.getSymbolicName(),
176180
(fieldAccessType.isStatic()) ? CLINIT : INIT);
177181
}
178182
}
@@ -181,8 +185,7 @@ public F resolveFieldAccess(R meta, F field, FieldAccessType fieldAccessType,
181185
return field;
182186
}
183187

184-
@TruffleBoundary
185-
public M resolveMethodSymbol(R meta, C accessingKlass, Symbol<Name> name,
188+
private M resolveMethodSymbolImpl(R meta, C accessingKlass, Symbol<Name> name,
186189
Symbol<Signature> signature, C symbolicHolder,
187190
boolean interfaceLookup,
188191
boolean accessCheck, boolean loadingConstraints) {
@@ -200,18 +203,18 @@ public M resolveMethodSymbol(R meta, C accessingKlass, Symbol<Name> name,
200203
resolved = symbolicHolder.lookupMethod(name, signature);
201204
}
202205
if (resolved == null) {
203-
throw meta.throwError(ErrorType.NoSuchMethodError, symbolicHolder.getJavaName() + "." + name + signature);
206+
throw meta.throwError(ErrorType.NoSuchMethodError, "%s.%s%s", symbolicHolder.getJavaName(), name, signature);
204207
}
205208
if (accessCheck) {
206-
meta.methodAccessCheck(resolved, accessingKlass, symbolicHolder);
209+
resolved.accessChecks(accessingKlass, symbolicHolder);
207210
}
208-
if (loadingConstraints && !meta.skipLoadingConstraints(resolved)) {
209-
meta.methodLoadingConstraints(resolved, accessingKlass);
211+
if (loadingConstraints && !resolved.shouldSkipLoadingConstraints()) {
212+
resolved.loadingConstraints(accessingKlass);
210213
}
211214
return resolved;
212215
}
213216

214-
public ResolvedCall<C, M, F> resolveCallSite(R meta, C currentKlass, M symbolicResolution,
217+
private ResolvedCall<C, M, F> resolveCallSiteImpl(R meta, C currentKlass, M symbolicResolution,
215218
CallSiteType callSiteType, C symbolicHolder) {
216219
M resolved = symbolicResolution;
217220
CallKind callKind;
@@ -222,8 +225,8 @@ public ResolvedCall<C, M, F> resolveCallSite(R meta, C currentKlass, M symbolicR
222225
if (!resolved.isStatic()) {
223226
throw meta.throwError(ErrorType.IncompatibleClassChangeError, "Expected static method '%s.%s%s'",
224227
resolved.getDeclaringClass().getJavaName(),
225-
resolved.getName(),
226-
resolved.getRawSignature());
228+
resolved.getSymbolicName(),
229+
resolved.getSymbolicSignature());
227230
}
228231
callKind = CallKind.STATIC;
229232
break;
@@ -234,8 +237,8 @@ public ResolvedCall<C, M, F> resolveCallSite(R meta, C currentKlass, M symbolicR
234237
(meta.getJavaVersion().java8OrEarlier() && resolved.isPrivate())) {
235238
throw meta.throwError(ErrorType.IncompatibleClassChangeError, "Expected instance not static method '%s.%s%s'",
236239
resolved.getDeclaringClass().getJavaName(),
237-
resolved.getName(),
238-
resolved.getRawSignature());
240+
resolved.getSymbolicName(),
241+
resolved.getSymbolicSignature());
239242
}
240243
if (resolved.isPrivate()) {
241244
assert meta.getJavaVersion().java9OrLater() : "Should have thrown in previous check.";
@@ -254,8 +257,8 @@ public ResolvedCall<C, M, F> resolveCallSite(R meta, C currentKlass, M symbolicR
254257
if (resolved.isStatic()) {
255258
throw meta.throwError(ErrorType.IncompatibleClassChangeError, "Expected instance method '%s.%s%s'",
256259
resolved.getDeclaringClass().getJavaName(),
257-
resolved.getName(),
258-
resolved.getRawSignature());
260+
resolved.getSymbolicName(),
261+
resolved.getSymbolicSignature());
259262
}
260263
if (resolved.isFinalFlagSet() || resolved.getDeclaringClass().isFinalFlagSet() || resolved.isPrivate()) {
261264
callKind = CallKind.DIRECT;
@@ -268,21 +271,21 @@ public ResolvedCall<C, M, F> resolveCallSite(R meta, C currentKlass, M symbolicR
268271
// class in which it is declared is not the class symbolically referenced by the
269272
// instruction, a NoSuchMethodError is thrown.
270273
if (resolved.isConstructor()) {
271-
if (resolved.getDeclaringClass().getName() != symbolicHolder.getName()) {
274+
if (resolved.getDeclaringClass().getSymbolicName() != symbolicHolder.getSymbolicName()) {
272275
throw meta.throwError(ErrorType.NoSuchMethodError,
273276
"%s.%s%s",
274277
resolved.getDeclaringClass().getJavaName(),
275-
resolved.getName(),
276-
resolved.getRawSignature());
278+
resolved.getSymbolicName(),
279+
resolved.getSymbolicSignature());
277280
}
278281
}
279282
// Otherwise, if the resolved method is a class (static) method, the invokespecial
280283
// instruction throws an IncompatibleClassChangeError.
281284
if (resolved.isStatic()) {
282285
throw meta.throwError(ErrorType.IncompatibleClassChangeError, "Expected instance not static method '%s.%s%s'",
283286
resolved.getDeclaringClass().getJavaName(),
284-
resolved.getName(),
285-
resolved.getRawSignature());
287+
resolved.getSymbolicName(),
288+
resolved.getSymbolicSignature());
286289
}
287290
// If all of the following are true, let C be the direct superclass of the current
288291
// class:
@@ -302,7 +305,7 @@ public ResolvedCall<C, M, F> resolveCallSite(R meta, C currentKlass, M symbolicR
302305
currentKlass.getSuperClass() != null &&
303306
symbolicHolder != currentKlass.getSuperClass() &&
304307
symbolicHolder.isAssignableFrom(currentKlass)) {
305-
resolved = currentKlass.getSuperClass().lookupInstanceMethod(resolved.getName(), resolved.getRawSignature());
308+
resolved = currentKlass.getSuperClass().lookupInstanceMethod(resolved.getSymbolicName(), resolved.getSymbolicSignature());
306309
}
307310
}
308311
callKind = CallKind.DIRECT;
@@ -312,4 +315,4 @@ public ResolvedCall<C, M, F> resolveCallSite(R meta, C currentKlass, M symbolicR
312315
}
313316
return new ResolvedCall<>(callKind, resolved);
314317
}
315-
}
318+
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/resolver/ResolvedCall.java renamed to espresso/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/resolver/ResolvedCall.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,18 @@
2121
* questions.
2222
*/
2323

24-
package com.oracle.truffle.espresso.resolver;
24+
package com.oracle.truffle.espresso.shared.resolver;
2525

2626
import java.util.Objects;
2727

28-
import com.oracle.truffle.espresso.resolver.meta.ClassType;
29-
import com.oracle.truffle.espresso.resolver.meta.FieldType;
30-
import com.oracle.truffle.espresso.resolver.meta.MethodType;
28+
import com.oracle.truffle.espresso.classfile.resolver.meta.FieldAccess;
29+
import com.oracle.truffle.espresso.classfile.resolver.meta.MethodAccess;
30+
import com.oracle.truffle.espresso.classfile.resolver.meta.TypeAccess;
3131

32-
public final class ResolvedCall<C extends ClassType<C, M, F>, M extends MethodType<C, M, F>, F extends FieldType<C, M, F>> {
32+
/**
33+
* Represents a resolved call-site.
34+
*/
35+
public final class ResolvedCall<C extends TypeAccess<C, M, F>, M extends MethodAccess<C, M, F>, F extends FieldAccess<C, M, F>> {
3336
private final CallKind callKind;
3437
private final M resolved;
3538

@@ -38,11 +41,17 @@ public ResolvedCall(CallKind callKind, M resolved) {
3841
this.resolved = Objects.requireNonNull(resolved);
3942
}
4043

44+
/**
45+
* Returns the resolved method.
46+
*/
4147
public M getResolvedMethod() {
4248
return resolved;
4349
}
4450

51+
/**
52+
* Returns the {@link CallKind kind} of call to perform at the call-site.
53+
*/
4554
public CallKind getCallKind() {
4655
return callKind;
4756
}
48-
}
57+
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/resolver/meta/ErrorType.java renamed to espresso/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/resolver/meta/ErrorType.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,14 @@
2121
* questions.
2222
*/
2323

24-
package com.oracle.truffle.espresso.resolver.meta;
24+
package com.oracle.truffle.espresso.classfile.resolver.meta;
2525

26+
import com.oracle.truffle.espresso.shared.resolver.LinkResolver;
27+
28+
/**
29+
* The errors that can happen during
30+
* {@link LinkResolver resolution}.
31+
*/
2632
public enum ErrorType {
2733
IllegalAccessError,
2834
NoSuchFieldError,

0 commit comments

Comments
 (0)