Skip to content

Commit c0fb500

Browse files
committed
Refactor Location classes.
Move index, field info, and final assumption to Location base class. Merge array and field location classes. Add non-virtual Location.canStoreValue(). Add non-virtual Location.get and set methods. Make isAssumedFinal() and isConstant() non-virtual. Add exact-type fast path for type.isInstance(value).
1 parent 568363d commit c0fb500

File tree

6 files changed

+834
-797
lines changed

6 files changed

+834
-797
lines changed

truffle/src/com.oracle.truffle.api.object.test/src/com/oracle/truffle/api/object/test/DOTestAsserts.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,13 @@
5555
import java.util.stream.Collectors;
5656
import java.util.stream.Stream;
5757

58+
import org.junit.Assert;
59+
60+
import com.oracle.truffle.api.Assumption;
5861
import com.oracle.truffle.api.object.DynamicObject;
5962
import com.oracle.truffle.api.object.Location;
6063
import com.oracle.truffle.api.object.Property;
6164
import com.oracle.truffle.api.object.Shape;
62-
import org.junit.Assert;
63-
64-
import com.oracle.truffle.api.Assumption;
6565

6666
public abstract class DOTestAsserts {
6767

@@ -72,8 +72,8 @@ public static <T> T invokeGetter(String methodName, Object receiver) {
7272
@SuppressWarnings("unchecked")
7373
public static <T> T invokeMethod(String methodName, Object receiver, Object... args) {
7474
try {
75-
Method method = Stream.concat(Arrays.stream(receiver.getClass().getMethods()), Arrays.stream(receiver.getClass().getDeclaredMethods())).filter(
76-
m -> m.getName().equals(methodName)).findFirst().orElseThrow(
75+
Method method = allMethods(receiver.getClass()).filter(
76+
m -> m.getName().equals(methodName) && m.getParameterCount() == args.length).findFirst().orElseThrow(
7777
() -> new NoSuchElementException("Method " + methodName + " not found in " + receiver.getClass()));
7878
method.setAccessible(true);
7979
return (T) method.invoke(receiver, args);
@@ -82,6 +82,11 @@ public static <T> T invokeMethod(String methodName, Object receiver, Object... a
8282
}
8383
}
8484

85+
private static Stream<Method> allMethods(Class<?> instanceClass) {
86+
var superclasses = Stream.<Class<?>> iterate(instanceClass, c -> c.getSuperclass() != null, Class::getSuperclass);
87+
return superclasses.flatMap(superclass -> Arrays.stream(superclass.getDeclaredMethods()));
88+
}
89+
8590
public static void assertLocationFields(Location location, int prims, int objects) {
8691
int primitiveFieldCount = invokeGetter("primitiveFieldCount", location);
8792
int objectFieldCount = invokeGetter("objectFieldCount", location);

truffle/src/com.oracle.truffle.api.object/src/com/oracle/truffle/api/object/ExtAllocator.java

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,11 @@
5454

5555
import com.oracle.truffle.api.Assumption;
5656
import com.oracle.truffle.api.impl.AbstractAssumption;
57-
import com.oracle.truffle.api.object.ExtLocations.AbstractObjectLocation;
58-
import com.oracle.truffle.api.object.ExtLocations.DoubleArrayLocation;
59-
import com.oracle.truffle.api.object.ExtLocations.DoubleFieldLocation;
6057
import com.oracle.truffle.api.object.ExtLocations.DoubleLocation;
6158
import com.oracle.truffle.api.object.ExtLocations.InstanceLocation;
62-
import com.oracle.truffle.api.object.ExtLocations.IntArrayLocation;
63-
import com.oracle.truffle.api.object.ExtLocations.IntFieldLocation;
6459
import com.oracle.truffle.api.object.ExtLocations.IntLocation;
65-
import com.oracle.truffle.api.object.ExtLocations.LongArrayLocation;
66-
import com.oracle.truffle.api.object.ExtLocations.LongFieldLocation;
6760
import com.oracle.truffle.api.object.ExtLocations.LongLocation;
68-
import com.oracle.truffle.api.object.ExtLocations.ObjectArrayLocation;
69-
import com.oracle.truffle.api.object.ExtLocations.ObjectFieldLocation;
61+
import com.oracle.truffle.api.object.ExtLocations.ObjectLocation;
7062
import com.oracle.truffle.api.object.ExtLocations.TypeAssumption;
7163

7264
import sun.misc.Unsafe;
@@ -94,13 +86,11 @@ protected Location moveLocation(Location oldLocation) {
9486
final boolean decorateFinal = false;
9587
if (oldLocation instanceof IntLocation) {
9688
return newIntLocation(decorateFinal, oldLocation, NO_VALUE);
97-
} else if (oldLocation instanceof DoubleLocation) {
98-
return newDoubleLocation(decorateFinal, ((DoubleLocation) oldLocation).isImplicitCastIntToDouble(), oldLocation, NO_VALUE);
99-
} else if (oldLocation instanceof LongLocation) {
100-
return newLongLocation(decorateFinal, ((LongLocation) oldLocation).isImplicitCastIntToLong(), oldLocation, NO_VALUE);
101-
} else if (oldLocation instanceof ObjectFieldLocation) {
102-
return newObjectLocation(decorateFinal, oldLocation, NO_VALUE);
103-
} else if (oldLocation instanceof ObjectArrayLocation) {
89+
} else if (oldLocation instanceof DoubleLocation doubleLocation) {
90+
return newDoubleLocation(decorateFinal, doubleLocation.isImplicitCastIntToDouble(), oldLocation, NO_VALUE);
91+
} else if (oldLocation instanceof LongLocation longLocation) {
92+
return newLongLocation(decorateFinal, longLocation.isImplicitCastIntToLong(), oldLocation, NO_VALUE);
93+
} else if (oldLocation instanceof ObjectLocation) {
10494
return newObjectLocation(decorateFinal, oldLocation, NO_VALUE);
10595
}
10696
assert oldLocation.isValue();
@@ -130,29 +120,29 @@ private Location newObjectArrayLocation(boolean decorateFinal, Location oldLocat
130120
return advance(location);
131121
}
132122

133-
private static ObjectFieldLocation newObjectFieldLocationWithAssumption(int index, FieldInfo fieldInfo,
123+
private static ObjectLocation newObjectFieldLocationWithAssumption(int index, FieldInfo fieldInfo,
134124
TypeAssumption initialTypeAssumption, AbstractAssumption initialFinalAssumption) {
135-
return new ObjectFieldLocation(index, fieldInfo, initialFinalAssumption, initialTypeAssumption);
125+
return ObjectLocation.createObjectFieldLocation(index, fieldInfo, initialFinalAssumption, initialTypeAssumption);
136126
}
137127

138-
private static ObjectArrayLocation newObjectArrayLocationWithAssumption(int index,
128+
private static ObjectLocation newObjectArrayLocationWithAssumption(int index,
139129
TypeAssumption initialTypeAssumption, AbstractAssumption initialFinalAssumption) {
140-
return new ObjectArrayLocation(index, initialFinalAssumption, initialTypeAssumption);
130+
return ObjectLocation.createObjectArrayLocation(index, initialFinalAssumption, initialTypeAssumption);
141131
}
142132

143133
private static boolean allowTypeSpeculation(Location oldLocation, Object value) {
144-
return (value != NO_VALUE && oldLocation == null) || (oldLocation instanceof AbstractObjectLocation);
134+
return (value != NO_VALUE && oldLocation == null) || (oldLocation instanceof ObjectLocation);
145135
}
146136

147137
private static TypeAssumption getTypeAssumption(Location oldLocation, Object value) {
148138
if (NewTypeSpeculation && allowTypeSpeculation(oldLocation, value)) {
149139
if (value != NO_VALUE && oldLocation == null) {
150-
if (AbstractObjectLocation.LAZY_ASSUMPTION) {
140+
if (ObjectLocation.LAZY_TYPE_ASSUMPTION) {
151141
return null;
152142
}
153-
return AbstractObjectLocation.createTypeAssumptionFromValue(value);
154-
} else if (oldLocation instanceof AbstractObjectLocation) {
155-
return ((AbstractObjectLocation) oldLocation).getTypeAssumption();
143+
return ObjectLocation.createTypeAssumptionFromValue(value);
144+
} else if (oldLocation instanceof ObjectLocation objectLocation) {
145+
return objectLocation.getTypeAssumption();
156146
}
157147
}
158148
return TypeAssumption.ANY;
@@ -165,8 +155,8 @@ private static AbstractAssumption getFinalAssumption(Location oldLocation, boole
165155
return null;
166156
}
167157
return InstanceLocation.createFinalAssumption();
168-
} else if (oldLocation instanceof InstanceLocation) {
169-
return ((InstanceLocation) oldLocation).getFinalAssumptionField();
158+
} else if (oldLocation instanceof InstanceLocation instanceLocation) {
159+
return instanceLocation.getFinalAssumptionField();
170160
}
171161
}
172162
return (AbstractAssumption) Assumption.NEVER_VALID;
@@ -185,14 +175,14 @@ private Location newIntLocation(boolean decorateFinal, Location oldLocation, Obj
185175
if (fieldIndex >= 0) {
186176
FieldInfo fieldInfo = l.getPrimitiveField(fieldIndex);
187177
AbstractAssumption initialFinalAssumption = getFinalAssumption(oldLocation, decorateFinal);
188-
Location location = new IntFieldLocation(fieldIndex, fieldInfo, initialFinalAssumption);
178+
Location location = IntLocation.createIntFieldLocation(fieldIndex, fieldInfo, initialFinalAssumption);
189179
return advance(location);
190180
}
191181
}
192182
if (l.hasPrimitiveExtensionArray()) {
193183
int index = alignArrayIndex(primitiveArraySize, INT_ARRAY_SLOT_SIZE);
194184
AbstractAssumption initialFinalAssumption = getFinalAssumption(oldLocation, decorateFinal);
195-
Location location = new IntArrayLocation(index, initialFinalAssumption);
185+
Location location = IntLocation.createIntArrayLocation(index, initialFinalAssumption);
196186
return advance(location);
197187
}
198188
}
@@ -207,14 +197,14 @@ private Location newDoubleLocation(boolean decorateFinal, boolean allowIntToDoub
207197
if (fieldIndex >= 0) {
208198
FieldInfo fieldInfo = l.getPrimitiveField(fieldIndex);
209199
AbstractAssumption initialFinalAssumption = getFinalAssumption(oldLocation, decorateFinal);
210-
Location location = new DoubleFieldLocation(fieldIndex, fieldInfo, allowIntToDouble, initialFinalAssumption);
200+
Location location = DoubleLocation.createDoubleFieldLocation(fieldIndex, fieldInfo, allowIntToDouble, initialFinalAssumption);
211201
return advance(location);
212202
}
213203
}
214204
if (l.hasPrimitiveExtensionArray()) {
215205
int index = alignArrayIndex(primitiveArraySize, DOUBLE_ARRAY_SLOT_SIZE);
216206
AbstractAssumption initialFinalAssumption = getFinalAssumption(oldLocation, decorateFinal);
217-
Location location = new DoubleArrayLocation(index, allowIntToDouble, initialFinalAssumption);
207+
Location location = DoubleLocation.createDoubleArrayLocation(index, allowIntToDouble, initialFinalAssumption);
218208
return advance(location);
219209
}
220210
}
@@ -247,14 +237,14 @@ private Location newLongLocation(boolean decorateFinal, boolean allowIntToLong,
247237
if (fieldIndex >= 0) {
248238
FieldInfo fieldInfo = l.getPrimitiveField(fieldIndex);
249239
AbstractAssumption initialFinalAssumption = getFinalAssumption(oldLocation, decorateFinal);
250-
Location location = new LongFieldLocation(fieldIndex, fieldInfo, allowIntToLong, initialFinalAssumption);
240+
Location location = LongLocation.createLongFieldLocation(fieldIndex, fieldInfo, allowIntToLong, initialFinalAssumption);
251241
return advance(location);
252242
}
253243
}
254244
if (l.hasPrimitiveExtensionArray()) {
255245
int index = alignArrayIndex(primitiveArraySize, LONG_ARRAY_SLOT_SIZE);
256246
AbstractAssumption initialFinalAssumption = getFinalAssumption(oldLocation, decorateFinal);
257-
Location location = new LongArrayLocation(index, allowIntToLong, initialFinalAssumption);
247+
Location location = LongLocation.createLongArrayLocation(index, allowIntToLong, initialFinalAssumption);
258248
return advance(location);
259249
}
260250
}
@@ -270,7 +260,7 @@ protected Location locationForValueUpcast(Object value, Location oldLocation, in
270260
}
271261

272262
// Object-typed locations should be able to store all values and therefore not reach here.
273-
assert !(oldLocation instanceof AbstractObjectLocation) : oldLocation;
263+
assert !(oldLocation instanceof ObjectLocation) : oldLocation;
274264
final boolean decorateFinal = false;
275265
Location newLocation = null;
276266
// if shape is shared, transition to an untyped location directly

0 commit comments

Comments
 (0)