Skip to content

Commit dde6975

Browse files
committed
keep shape roots per-language rather than static so they do not leak
1 parent e1a60b1 commit dde6975

File tree

4 files changed

+33
-17
lines changed

4 files changed

+33
-17
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939
import com.oracle.graal.python.builtins.Builtin;
4040
import com.oracle.graal.python.builtins.Python3Core;
41+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4142
import com.oracle.graal.python.builtins.objects.PEllipsis;
4243
import com.oracle.graal.python.builtins.objects.PNone;
4344
import com.oracle.graal.python.builtins.objects.PNotImplemented;
@@ -89,6 +90,7 @@
8990
import com.oracle.truffle.api.nodes.ExecutableNode;
9091
import com.oracle.truffle.api.nodes.ExplodeLoop;
9192
import com.oracle.truffle.api.nodes.ExplodeLoop.LoopExplosionKind;
93+
import com.oracle.truffle.api.object.Shape;
9294
import com.oracle.truffle.api.nodes.Node;
9395
import com.oracle.truffle.api.nodes.RootNode;
9496
import com.oracle.truffle.api.source.Source;
@@ -142,6 +144,9 @@ public final class PythonLanguage extends TruffleLanguage<PythonContext> {
142144
private final NodeFactory nodeFactory;
143145
private final ConcurrentHashMap<String, RootCallTarget> builtinCallTargetCache = new ConcurrentHashMap<>();
144146

147+
private final Shape emptyShape = Shape.newBuilder().allowImplicitCastIntToDouble(false).allowImplicitCastIntToLong(true).shapeFlags(0).propertyAssumptions(true).build();
148+
@CompilationFinal(dimensions = 1) private final Shape[] builtinTypeInstanceShapes = new Shape[PythonBuiltinClassType.VALUES.length];
149+
145150
@CompilationFinal(dimensions = 1) private static final Object[] CONTEXT_INSENSITIVE_SINGLETONS = new Object[]{PNone.NONE, PNone.NO_VALUE, PEllipsis.INSTANCE, PNotImplemented.NOT_IMPLEMENTED};
146151

147152
/**
@@ -645,4 +650,20 @@ public RootCallTarget getOrComputeBuiltinCallTarget(Builtin builtin, Class<? ext
645650
String key = builtin.name() + nodeClass.getName();
646651
return builtinCallTargetCache.computeIfAbsent(key, (k) -> supplier.apply(builtin));
647652
}
653+
654+
public static Shape getEmptyShape() {
655+
return getCurrent().emptyShape;
656+
}
657+
658+
public static Shape getBuiltinTypeInstanceShape(PythonBuiltinClassType type) {
659+
Shape[] builtinTypeInstanceShapes = getCurrent().builtinTypeInstanceShapes;
660+
int ordinal = type.ordinal();
661+
Shape shape = builtinTypeInstanceShapes[ordinal];
662+
if (shape == null) {
663+
CompilerDirectives.transferToInterpreterAndInvalidate();
664+
shape = PythonObject.freshShape(type);
665+
builtinTypeInstanceShapes[ordinal] = shape;
666+
}
667+
return shape;
668+
}
648669
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
3737
import com.oracle.graal.python.runtime.PythonContext;
3838
import com.oracle.truffle.api.CompilerAsserts;
39+
import com.oracle.truffle.api.CompilerDirectives;
3940
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
4041
import com.oracle.truffle.api.dsl.Cached;
4142
import com.oracle.truffle.api.dsl.CachedContext;
@@ -212,7 +213,6 @@ public enum PythonBuiltinClassType implements TruffleObject {
212213
nil(null);
213214

214215
private final String name;
215-
private final Shape instanceShape;
216216
private final String publicInModule;
217217
private final String qualifiedName;
218218
private final boolean basetype;
@@ -228,11 +228,6 @@ public enum PythonBuiltinClassType implements TruffleObject {
228228
} else {
229229
qualifiedName = name;
230230
}
231-
if (name != null) {
232-
this.instanceShape = com.oracle.graal.python.builtins.objects.object.PythonObject.freshShape(this);
233-
} else {
234-
this.instanceShape = null;
235-
}
236231
this.basetype = basetype;
237232
}
238233

@@ -275,7 +270,10 @@ public String toString() {
275270
}
276271

277272
public final Shape getInstanceShape() {
278-
return instanceShape;
273+
if (name == null) {
274+
CompilerDirectives.shouldNotReachHere("incorrect use of Python builtin type marker");
275+
}
276+
return PythonLanguage.getBuiltinTypeInstanceShape(this);
279277
}
280278

281279
@CompilationFinal(dimensions = 1) public static final PythonBuiltinClassType[] VALUES = Arrays.copyOf(values(), values().length - 1);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/DynamicObjectStorage.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@
4545
import java.util.List;
4646
import java.util.NoSuchElementException;
4747

48+
import com.oracle.graal.python.PythonLanguage;
4849
import com.oracle.graal.python.builtins.objects.PNone;
4950
import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary.ForEachNode;
5051
import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary.HashingStorageIterable;
5152
import com.oracle.graal.python.builtins.objects.function.PArguments.ThreadState;
5253
import com.oracle.graal.python.builtins.objects.getsetdescriptor.HiddenPythonKey;
53-
import com.oracle.graal.python.builtins.objects.object.PythonObject;
5454
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
5555
import com.oracle.graal.python.builtins.objects.str.PString;
5656
import com.oracle.graal.python.nodes.PGuards;
@@ -84,8 +84,6 @@
8484
public final class DynamicObjectStorage extends HashingStorage {
8585
public static final int SIZE_THRESHOLD = 100;
8686

87-
private static final Shape EMPTY_SHAPE = PythonObject.freshShape();
88-
8987
final DynamicObject store;
9088
private final MroSequenceStorage mro;
9189

@@ -96,7 +94,7 @@ public Store(Shape shape) {
9694
}
9795

9896
public DynamicObjectStorage() {
99-
this(new Store(EMPTY_SHAPE), null);
97+
this(new Store(PythonLanguage.getEmptyShape()), null);
10098
}
10199

102100
public DynamicObjectStorage(DynamicObject store) {
@@ -373,13 +371,13 @@ private static Object runNode(DynamicObjectStorage self, Object key, Object acc,
373371

374372
@ExportMessage
375373
public HashingStorage clear(@CachedLibrary(limit = "3") DynamicObjectLibrary dylib) {
376-
dylib.resetShape(store, EMPTY_SHAPE);
374+
dylib.resetShape(store, PythonLanguage.getEmptyShape());
377375
return this;
378376
}
379377

380378
@ExportMessage
381379
public HashingStorage copy(@CachedLibrary(limit = "3") DynamicObjectLibrary dylib) {
382-
DynamicObject copy = new Store(EMPTY_SHAPE);
380+
DynamicObject copy = new Store(PythonLanguage.getEmptyShape());
383381
Object[] keys = dylib.getKeyArray(store);
384382
for (int i = 0; i < keys.length; i++) {
385383
dylib.put(copy, keys[i], dylib.getOrDefault(store, keys[i], PNone.NO_VALUE));

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/PythonObject.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.ArrayList;
2929
import java.util.List;
3030

31+
import com.oracle.graal.python.PythonLanguage;
3132
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
3233
import com.oracle.graal.python.builtins.objects.PNone;
3334
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
@@ -194,13 +195,11 @@ public static int getCallSiteInlineCacheMaxDepth() {
194195
return PythonOptions.getCallSiteInlineCacheMaxDepth();
195196
}
196197

197-
private static final Shape emptyShape = Shape.newBuilder().allowImplicitCastIntToDouble(false).allowImplicitCastIntToLong(true).shapeFlags(0).propertyAssumptions(true).build();
198-
199198
public static Shape freshShape(Object klass) {
200-
return Shape.newBuilder(emptyShape).addConstantProperty(CLASS, klass, 0).build();
199+
return Shape.newBuilder(PythonLanguage.getEmptyShape()).addConstantProperty(CLASS, klass, 0).build();
201200
}
202201

203202
public static Shape freshShape() {
204-
return emptyShape;
203+
return PythonLanguage.getEmptyShape();
205204
}
206205
}

0 commit comments

Comments
 (0)