Skip to content

Commit a54afb3

Browse files
committed
[GR-23218] Make test_descr pass - test_set_doc.
PullRequest: graalpython/1383
2 parents 74ed08a + 80af4e7 commit a54afb3

File tree

6 files changed

+94
-6
lines changed

6 files changed

+94
-6
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_descr.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_set_and_no_get
7272
*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_set_class
7373
*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_set_dict
74+
*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_set_doc
7475
*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_slices
7576
*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_slot_shadows_class_variable
7677
*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_slots_descriptor

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -668,10 +668,10 @@ private PythonModule createModule(String name) {
668668
}
669669

670670
private void addBuiltinsTo(PythonObject obj, PythonBuiltins builtinsForObj) {
671-
Map<String, Object> builtinConstants = builtinsForObj.getBuiltinConstants();
672-
for (Map.Entry<String, Object> entry : builtinConstants.entrySet()) {
673-
String constantName = entry.getKey();
674-
obj.setAttribute(constantName, entry.getValue());
671+
Map<Object, Object> builtinConstants = builtinsForObj.getBuiltinConstants();
672+
for (Map.Entry<Object, Object> entry : builtinConstants.entrySet()) {
673+
Object constant = entry.getKey();
674+
obj.setAttribute(constant, entry.getValue());
675675
}
676676

677677
Map<String, BoundBuiltinCallable<?>> builtinFunctions = builtinsForObj.getBuiltinFunctions();

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
import com.oracle.truffle.api.dsl.NodeFactory;
4747

4848
public abstract class PythonBuiltins {
49-
protected final Map<String, Object> builtinConstants = new HashMap<>();
49+
protected final Map<Object, Object> builtinConstants = new HashMap<>();
5050
private final Map<String, BoundBuiltinCallable<?>> builtinFunctions = new HashMap<>();
5151
private final Map<PythonBuiltinClass, Map.Entry<PythonBuiltinClassType[], Boolean>> builtinClasses = new HashMap<>();
5252

@@ -161,7 +161,7 @@ protected Map<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> getB
161161
return tmp;
162162
}
163163

164-
protected Map<String, Object> getBuiltinConstants() {
164+
protected Map<Object, Object> getBuiltinConstants() {
165165
return builtinConstants;
166166
}
167167
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/ListBuiltins.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
8484
import com.oracle.graal.python.nodes.ErrorMessages;
8585
import com.oracle.graal.python.nodes.PGuards;
86+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DOC__;
8687
import com.oracle.graal.python.nodes.attributes.GetAttributeNode;
8788
import com.oracle.graal.python.nodes.builtins.ListNodes;
8889
import com.oracle.graal.python.nodes.builtins.ListNodes.AppendNode;
@@ -130,6 +131,11 @@ public class ListBuiltins extends PythonBuiltins {
130131
@Override
131132
public void initialize(PythonCore core) {
132133
super.initialize(core);
134+
builtinConstants.put(__DOC__, //
135+
"Built-in mutable sequence.\n" + //
136+
"\n" + //
137+
"If no argument is given, the constructor creates a new empty list.\n" + //
138+
"The argument must be an iterable if specified.");
133139
this.builtinConstants.put(__HASH__, PNone.NONE);
134140
}
135141

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

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
7777
import com.oracle.graal.python.builtins.objects.function.PFunction;
7878
import com.oracle.graal.python.builtins.objects.function.PKeyword;
79+
import com.oracle.graal.python.builtins.objects.getsetdescriptor.DescriptorDeleteMarker;
7980
import com.oracle.graal.python.builtins.objects.getsetdescriptor.HiddenPythonKey;
8081
import com.oracle.graal.python.builtins.objects.list.PList;
8182
import com.oracle.graal.python.builtins.objects.object.PythonObject;
@@ -96,6 +97,7 @@
9697
import com.oracle.graal.python.nodes.ErrorMessages;
9798
import com.oracle.graal.python.nodes.PGuards;
9899
import com.oracle.graal.python.nodes.SpecialAttributeNames;
100+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DOC__;
99101
import com.oracle.graal.python.nodes.argument.positional.PositionalArgumentsNode;
100102
import com.oracle.graal.python.nodes.attributes.GetAttributeNode.GetFixedAttributeNode;
101103
import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode;
@@ -120,6 +122,7 @@
120122
import com.oracle.graal.python.nodes.util.CannotCastException;
121123
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
122124
import com.oracle.graal.python.nodes.util.SplitArgsNode;
125+
import com.oracle.graal.python.runtime.PythonCore;
123126
import com.oracle.graal.python.runtime.exception.PException;
124127
import com.oracle.graal.python.runtime.exception.PythonErrorType;
125128
import com.oracle.truffle.api.CompilerAsserts;
@@ -152,12 +155,22 @@ public class TypeBuiltins extends PythonBuiltins {
152155
public static final HiddenPythonKey TYPE_FREE = new HiddenPythonKey("__free__");
153156
public static final HiddenPythonKey TYPE_FLAGS = new HiddenPythonKey(__FLAGS__);
154157
public static final HiddenPythonKey TYPE_VECTORCALL_OFFSET = new HiddenPythonKey("__vectorcall_offset__");
158+
private static final HiddenPythonKey TYPE_DOC = new HiddenPythonKey(__DOC__);
155159

156160
@Override
157161
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
158162
return TypeBuiltinsFactory.getFactories();
159163
}
160164

165+
@Override
166+
public void initialize(PythonCore core) {
167+
super.initialize(core);
168+
builtinConstants.put(TYPE_DOC, //
169+
"type(object_or_name, bases, dict)\n" + //
170+
"type(object) -> the object's type\n" + //
171+
"type(name, bases, dict) -> a new type");
172+
}
173+
161174
@Builtin(name = __REPR__, minNumOfPositionalArgs = 1)
162175
@GenerateNodeFactory
163176
@ImportStatic(SpecialAttributeNames.class)
@@ -180,6 +193,73 @@ private static String concat(Object moduleName, Object qualName) {
180193
}
181194
}
182195

196+
@Builtin(name = __DOC__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true, allowsDelete = true)
197+
@GenerateNodeFactory
198+
@ImportStatic(SpecialAttributeNames.class)
199+
public abstract static class DocNode extends PythonBinaryBuiltinNode {
200+
201+
@Specialization
202+
Object getDoc(PythonBuiltinClassType self, @SuppressWarnings("unused") PNone value) {
203+
return getDoc(getCore().lookupType(self), value);
204+
}
205+
206+
@Specialization
207+
static Object getDoc(PythonBuiltinClass self, @SuppressWarnings("unused") PNone value) {
208+
// see type.c#type_get_doc()
209+
if (IsBuiltinClassProfile.getUncached().profileClass(self, PythonBuiltinClassType.PythonClass)) {
210+
return ((PythonObject) self).getAttribute(TYPE_DOC);
211+
} else {
212+
return ((PythonObject) self).getAttribute(__DOC__);
213+
}
214+
}
215+
216+
@Specialization(guards = "!isAnyBuiltinClass(self)")
217+
Object getDoc(VirtualFrame frame, PythonClass self, @SuppressWarnings("unused") PNone value) {
218+
// see type.c#type_get_doc()
219+
Object res = self.getAttribute(__DOC__);
220+
Object resClass = PythonObjectLibrary.getUncached().getLazyPythonClass(res);
221+
Object get = LookupAttributeInMRONode.Dynamic.getUncached().execute(resClass, __GET__);
222+
if (PGuards.isCallable(get)) {
223+
return CallTernaryMethodNode.getUncached().execute(frame, get, res, PNone.NONE, self);
224+
}
225+
return res;
226+
}
227+
228+
protected boolean isAnyBuiltinClass(PythonClass klass) {
229+
return IsBuiltinClassProfile.getUncached().profileIsAnyBuiltinClass(klass);
230+
}
231+
232+
@Specialization
233+
static Object getDoc(PythonNativeClass self, @SuppressWarnings("unused") PNone value) {
234+
return ReadAttributeFromObjectNode.getUncached().execute(self, __DOC__);
235+
}
236+
237+
@Specialization(guards = {"!isNoValue(value)", "!isDeleteMarker(value)"})
238+
Object setDoc(PythonClass self, Object value) {
239+
self.setAttribute(__DOC__, value);
240+
return PNone.NO_VALUE;
241+
}
242+
243+
@Specialization(guards = {"!isNoValue(value)", "isBuiltin.profileIsAnyBuiltinClass(self)"})
244+
Object doc(Object self, @SuppressWarnings("unused") Object value,
245+
@SuppressWarnings("unused") @Cached IsBuiltinClassProfile isBuiltin,
246+
@Cached GetNameNode getName) {
247+
throw raise(PythonErrorType.TypeError, ErrorMessages.CANT_SET_S_S, getName.execute(self), __DOC__);
248+
}
249+
250+
@Specialization(guards = {"!isNoValue(value)", "!isDeleteMarker(value)"})
251+
Object doc(PythonClass self, Object value) {
252+
self.setAttribute(__DOC__, value);
253+
return PNone.NO_VALUE;
254+
}
255+
256+
@Specialization
257+
Object doc(Object self, @SuppressWarnings("unused") DescriptorDeleteMarker marker,
258+
@Cached GetNameNode getName) {
259+
throw raise(PythonErrorType.TypeError, ErrorMessages.CANNOT_DELETE_ATTRIBUTE, getName.execute(self), __DOC__);
260+
}
261+
}
262+
183263
@Builtin(name = __MRO__, minNumOfPositionalArgs = 1, isGetter = true)
184264
@GenerateNodeFactory
185265
abstract static class MroAttrNode extends PythonBuiltinNode {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ public abstract class ErrorMessages {
160160
public static final String CANT_FIND_MODULE = "can't find module '%s'";
161161
public static final String CANT_MULTIPLY_SEQ_BY_NON_INT = "can't multiply sequence by non-int of type '%p'";
162162
public static final String CANT_PICKLE_FUNC_OBJS = "can't pickle function objects";
163+
public static final String CANT_SET_S_S = "can't set %s.%s";
163164
public static final String CANT_SET_ATTRIBUTES_OF_TYPE = "can't set attributes of %s";
164165
public static final String CANT_SET_ATTRIBUTES_OF_TYPE_S = "can't set attributes of built-in/extension type '%s'";
165166
public static final String CANT_SPECIFY_TIMEOUT_FOR_NONBLOCKING = "can't specify a timeout for a non-blocking call";

0 commit comments

Comments
 (0)