Skip to content

Commit 4b10897

Browse files
committed
basic set __bases__ impl
1 parent 151aa53 commit 4b10897

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

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

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,17 @@
7070
import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
7171
import com.oracle.graal.python.builtins.objects.common.DynamicObjectStorage;
7272
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
73+
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode;
7374
import com.oracle.graal.python.builtins.objects.dict.PDict;
7475
import com.oracle.graal.python.builtins.objects.function.PKeyword;
7576
import com.oracle.graal.python.builtins.objects.list.PList;
7677
import com.oracle.graal.python.builtins.objects.mappingproxy.PMappingproxy;
7778
import com.oracle.graal.python.builtins.objects.object.PythonObject;
7879
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
80+
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
7981
import com.oracle.graal.python.builtins.objects.type.TypeBuiltinsFactory.CallNodeFactory;
8082
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroNode;
83+
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
8184
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetSubclassesNode;
8285
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.IsSameTypeNodeGen;
8386
import com.oracle.graal.python.nodes.BuiltinNames;
@@ -105,6 +108,7 @@
105108
import com.oracle.graal.python.nodes.truffle.PythonTypes;
106109
import com.oracle.graal.python.runtime.exception.PException;
107110
import com.oracle.graal.python.runtime.exception.PythonErrorType;
111+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.NotImplementedError;
108112
import com.oracle.truffle.api.CompilerAsserts;
109113
import com.oracle.truffle.api.CompilerDirectives;
110114
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -518,14 +522,48 @@ Object doIt(Object args, Object kwargs) {
518522
}
519523
}
520524

521-
@Builtin(name = __BASES__, minNumOfPositionalArgs = 1, isGetter = true)
525+
@Builtin(name = __BASES__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true)
522526
@GenerateNodeFactory
523-
abstract static class BasesNode extends PythonBuiltinNode {
527+
@ImportStatic(PGuards.class)
528+
abstract static class BasesNode extends PythonBinaryBuiltinNode {
529+
524530
@Specialization
525-
Object bases(Object self,
531+
Object getBases(Object self, @SuppressWarnings("unused") PNone value,
526532
@Cached("create()") TypeNodes.GetBaseClassesNode getBaseClassesNode) {
527533
return factory().createTuple(getBaseClassesNode.execute(self));
528534
}
535+
536+
@Specialization
537+
Object setBases(PythonClass cls, PTuple value,
538+
@Cached GetNameNode getName,
539+
@Cached GetObjectArrayNode getArray) {
540+
541+
Object[] a = getArray.execute(value);
542+
PythonAbstractClass[] baseClasses = new PythonAbstractClass[a.length];
543+
for (int i = 0; i < a.length; i++) {
544+
if (a[i] instanceof PythonAbstractClass) {
545+
baseClasses[i] = (PythonAbstractClass) a[i];
546+
} else {
547+
throw raise(TypeError, ErrorMessages.MUST_BE_TUPLE_OF_CLASSES_NOT_P, getName.execute(cls), "__bases__", a[i]);
548+
}
549+
}
550+
551+
throw raise(NotImplementedError);
552+
// return PNone.NONE;
553+
}
554+
555+
@Specialization(guards = "!isPTuple(value)")
556+
Object setObject(@SuppressWarnings("unused") PythonClass cls, @SuppressWarnings("unused") Object value,
557+
@Cached GetNameNode getName) {
558+
throw raise(TypeError, ErrorMessages.CAN_ONLY_ASSIGN_S_TO_S_S_NOT_P, "tuple", getName.execute(cls), "__bases__", value);
559+
}
560+
561+
@Specialization
562+
Object setBuiltin(@SuppressWarnings("unused") PythonBuiltinClass cls, @SuppressWarnings("unused") Object value,
563+
@Cached GetNameNode getName) {
564+
throw raise(TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE_S, getName.execute(cls));
565+
}
566+
529567
}
530568

531569
@Builtin(name = __BASE__, minNumOfPositionalArgs = 1, isGetter = true)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/ErrorMessages.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public abstract class ErrorMessages {
9595
public static final String CALLING_ARG_CONVERTER_FAIL_UNEXPECTED_RETURN = "calling argument converter failed; unexpected return value %s";
9696
public static final String CALLING_NATIVE_FUNC_EXPECTED_ARGS = "Calling native function %s expected %d arguments but got %d.";
9797
public static final String CALLING_NATIVE_FUNC_FAILED = "Calling native function %s failed: %m";
98+
public static final String CAN_ONLY_ASSIGN_S_TO_S_S_NOT_P = "can only assign %s to %s.%s, not %p";
9899
public static final String CAN_ONLY_CONCAT_S_NOT_P_TO_S = "can only concatenate %s (not \"%p\") to %s";
99100
public static final String CAN_ONLY_JOIN_ITERABLE = "can only join an iterable";
100101
public static final String CANNOT_ASSIGN_TO = "cannot assign to %s";
@@ -331,6 +332,7 @@ public abstract class ErrorMessages {
331332
public static final String MUST_BE_SET_TO_STR_OBJ = "%s must be set to a string object";
332333
public static final String MUST_BE_STRINGS = "%s must be strings";
333334
public static final String MUST_BE_STRINGS_NOT_P = "%s must be strings, not %p";
335+
public static final String MUST_BE_TUPLE_OF_CLASSES_NOT_P = "%s.%s must be tuple of classes, not '%p'";
334336
public static final String MUST_SPECIFY_FILTERS = "Must specify filters for FORMAT_RAW";
335337
public static final String MUTATED_DURING_UPDATE = "%s mutated during update";
336338
public static final String NAME_IS_ASSIGNED_BEFORE_GLOBAL = "name '%s' is assigned to before global declaration";

0 commit comments

Comments
 (0)