Skip to content

Commit a352d3c

Browse files
committed
do not allow bool as a basetype
1 parent ada43da commit a352d3c

File tree

3 files changed

+67
-4
lines changed

3 files changed

+67
-4
lines changed

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
public enum PythonBuiltinClassType implements LazyPythonClass {
5757

5858
ForeignObject(BuiltinNames.FOREIGN),
59-
Boolean("bool", BuiltinNames.BUILTINS),
59+
Boolean("bool", BuiltinNames.BUILTINS, false),
6060
GetSetDescriptor("get_set_desc"),
6161
PArray("array", "array"),
6262
PArrayIterator("arrayiterator"),
@@ -203,11 +203,12 @@ public enum PythonBuiltinClassType implements LazyPythonClass {
203203
private final Shape instanceShape;
204204
private final String publicInModule;
205205
private final String qualifiedName;
206+
private final boolean basetype;
206207

207208
// initialized in static constructor
208209
@CompilationFinal private PythonBuiltinClassType base;
209210

210-
PythonBuiltinClassType(String name, String publicInModule) {
211+
PythonBuiltinClassType(String name, String publicInModule, boolean basetype) {
211212
this.name = name;
212213
this.publicInModule = publicInModule;
213214
if (publicInModule != null && publicInModule != BuiltinNames.BUILTINS) {
@@ -216,10 +217,19 @@ public enum PythonBuiltinClassType implements LazyPythonClass {
216217
qualifiedName = name;
217218
}
218219
this.instanceShape = com.oracle.graal.python.builtins.objects.object.PythonObject.freshShape(this);
220+
this.basetype = basetype;
221+
}
222+
223+
PythonBuiltinClassType(String name, String publicInModule) {
224+
this(name, publicInModule, true);
219225
}
220226

221227
PythonBuiltinClassType(String name) {
222-
this(name, null);
228+
this(name, null, true);
229+
}
230+
231+
public boolean isAcceptableBase() {
232+
return basetype;
223233
}
224234

225235
@Override

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@
145145
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
146146
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroNode;
147147
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
148+
import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsAcceptableBaseNode;
148149
import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode;
149150
import com.oracle.graal.python.nodes.BuiltinNames;
150151
import com.oracle.graal.python.nodes.PGuards;
@@ -2100,6 +2101,7 @@ public abstract static class TypeNode extends PythonBuiltinNode {
21002101
@Child private GetMroNode getMroNode;
21012102
@Child private IsSubtypeNode isSubtypeNode;
21022103
@Child private GetObjectArrayNode getObjectArrayNode;
2104+
@Child private IsAcceptableBaseNode isAcceptableBaseNode;
21032105

21042106
protected abstract Object execute(VirtualFrame frame, Object cls, Object name, Object bases, Object dict, PKeyword[] kwds);
21052107

@@ -2122,7 +2124,6 @@ Object type(VirtualFrame frame, LazyPythonClass cls, String name, PTuple bases,
21222124
@Cached CallNode callSetNameNode,
21232125
@Cached CallNode callInitSubclassNode,
21242126
@Cached CallNode callNewFuncNode) {
2125-
21262127
// Determine the proper metatype to deal with this
21272128
LazyPythonClass metaclass = calculate_metaclass(frame, cls, bases, getMetaclassNode);
21282129
if (metaclass != cls) {
@@ -2479,6 +2480,9 @@ private PythonAbstractClass[] getMro(PythonAbstractClass pythonClass) {
24792480
private LazyPythonClass calculate_metaclass(VirtualFrame frame, LazyPythonClass cls, PTuple bases, GetLazyClassNode getMetaclassNode) {
24802481
LazyPythonClass winner = cls;
24812482
for (Object base : ensureGetObjectArrayNode().execute(bases)) {
2483+
if (!ensureIsAcceptableBaseNode().execute(base)) {
2484+
throw raise(TypeError, "type '%p' is not an acceptable base type", base);
2485+
}
24822486
LazyPythonClass typ = getMetaclassNode.execute(base);
24832487
if (isSubType(frame, winner, typ)) {
24842488
continue;
@@ -2569,6 +2573,14 @@ private GetObjectArrayNode ensureGetObjectArrayNode() {
25692573
}
25702574
return getObjectArrayNode;
25712575
}
2576+
2577+
private IsAcceptableBaseNode ensureIsAcceptableBaseNode() {
2578+
if (isAcceptableBaseNode == null) {
2579+
CompilerDirectives.transferToInterpreterAndInvalidate();
2580+
isAcceptableBaseNode = insert(IsAcceptableBaseNode.create());
2581+
}
2582+
return isAcceptableBaseNode;
2583+
}
25722584
}
25732585

25742586
@Builtin(name = MODULE, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PythonModule, isPublic = false)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeNodes.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetSubclassesNodeGen;
7575
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetSulongTypeNodeGen;
7676
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetTypeFlagsNodeFactory.GetTypeFlagsCachedNodeGen;
77+
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.IsAcceptableBaseNodeGen;
7778
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.IsTypeNodeGen;
7879
import com.oracle.graal.python.nodes.PGuards;
7980
import com.oracle.graal.python.nodes.PNodeWithContext;
@@ -820,6 +821,46 @@ public static IsTypeNode getUncached() {
820821
}
821822
}
822823

824+
public abstract static class IsAcceptableBaseNode extends Node {
825+
private static final long Py_TPFLAGS_BASETYPE = (1L << 10);
826+
827+
public abstract boolean execute(Object obj);
828+
829+
@Specialization
830+
boolean doUserClass(@SuppressWarnings("unused") PythonClass obj) {
831+
return true;
832+
}
833+
834+
@Specialization
835+
boolean doBuiltinClass(@SuppressWarnings("unused") PythonBuiltinClass obj) {
836+
return obj.getType().isAcceptableBase();
837+
}
838+
839+
@Specialization
840+
boolean doBuiltinType(@SuppressWarnings("unused") PythonBuiltinClassType obj) {
841+
return obj.isAcceptableBase();
842+
}
843+
844+
@Specialization
845+
boolean doNativeClass(PythonAbstractNativeObject obj,
846+
@Cached IsTypeNode isType,
847+
@Cached GetTypeFlagsNode getFlags) {
848+
if (isType.execute(obj)) {
849+
return (getFlags.execute(obj) & Py_TPFLAGS_BASETYPE) != 0;
850+
}
851+
return false;
852+
}
853+
854+
@Fallback
855+
boolean doOther(@SuppressWarnings("unused") Object obj) {
856+
return false;
857+
}
858+
859+
public static IsAcceptableBaseNode create() {
860+
return IsAcceptableBaseNodeGen.create();
861+
}
862+
}
863+
823864
@ImportStatic(PGuards.class)
824865
@GenerateUncached
825866
@ReportPolymorphism

0 commit comments

Comments
 (0)