Skip to content

Commit a0f354c

Browse files
committed
Actually set docstrings from PyObject_SetDoc
1 parent 2fb6f17 commit a0f354c

File tree

2 files changed

+55
-5
lines changed

2 files changed

+55
-5
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextAbstractBuiltins.java

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_PY_MAPPING_SIZE;
4949
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_PY_OBJECT_SIZE;
5050
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_PY_SEQUENCE_SIZE;
51+
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.ConstCharPtr;
5152
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.ConstCharPtrAsTruffleString;
5253
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int;
5354
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject;
@@ -57,6 +58,7 @@
5758
import static com.oracle.graal.python.nodes.ErrorMessages.BASE_MUST_BE;
5859
import static com.oracle.graal.python.nodes.ErrorMessages.OBJ_ISNT_MAPPING;
5960
import static com.oracle.graal.python.nodes.ErrorMessages.P_OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT;
61+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__;
6062
import static com.oracle.graal.python.nodes.SpecialMethodNames.T_ITEMS;
6163
import static com.oracle.graal.python.nodes.SpecialMethodNames.T_KEYS;
6264
import static com.oracle.graal.python.nodes.SpecialMethodNames.T_VALUES;
@@ -81,19 +83,24 @@
8183
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode;
8284
import com.oracle.graal.python.builtins.modules.cext.PythonCextErrBuiltins.PyErr_Restore;
8385
import com.oracle.graal.python.builtins.objects.PNone;
86+
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
87+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsCharPointerNode;
8488
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction;
8589
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToSulongNode;
8690
import com.oracle.graal.python.builtins.objects.cext.capi.DynamicObjectNativeWrapper.PrimitiveNativeWrapper;
87-
import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor;
8891
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.ItemsNode;
8992
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.KeysNode;
9093
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.ValuesNode;
9194
import com.oracle.graal.python.builtins.objects.dict.PDict;
95+
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
96+
import com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptor;
9297
import com.oracle.graal.python.builtins.objects.ints.PInt;
9398
import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes;
9499
import com.oracle.graal.python.builtins.objects.list.PList;
95100
import com.oracle.graal.python.builtins.objects.mappingproxy.PMappingproxy;
101+
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
96102
import com.oracle.graal.python.builtins.objects.type.TypeNodes.InlinedIsSameTypeNode;
103+
import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode;
97104
import com.oracle.graal.python.lib.PyIndexCheckNode;
98105
import com.oracle.graal.python.lib.PyMappingCheckNode;
99106
import com.oracle.graal.python.lib.PyNumberCheckNode;
@@ -107,6 +114,8 @@
107114
import com.oracle.graal.python.lib.PySequenceCheckNode;
108115
import com.oracle.graal.python.lib.PySliceNew;
109116
import com.oracle.graal.python.nodes.ErrorMessages;
117+
import com.oracle.graal.python.nodes.attributes.WriteAttributeToDynamicObjectNode;
118+
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
110119
import com.oracle.graal.python.nodes.builtins.ListNodes.ConstructListNode;
111120
import com.oracle.graal.python.nodes.call.CallNode;
112121
import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode;
@@ -879,19 +888,60 @@ Object check(Object object,
879888
}
880889
}
881890

882-
@CApiBuiltin(ret = ArgDescriptor.ConstCharPtr, args = {PyObject}, call = Direct)
891+
@CApiBuiltin(ret = ConstCharPtr, args = {PyObject}, call = Direct)
883892
abstract static class PyObject_GetDoc extends CApiUnaryBuiltinNode {
884893
@Specialization
885-
Object check(@SuppressWarnings("unused") Object obj) {
894+
Object get(Object obj,
895+
@Cached PyObjectLookupAttr lookupAttr,
896+
@Cached AsCharPointerNode asCharPointerNode) {
897+
try {
898+
Object doc = lookupAttr.execute(null, obj, T___DOC__);
899+
if (!(doc instanceof PNone)) {
900+
return asCharPointerNode.execute(doc);
901+
}
902+
} catch (PException e) {
903+
// ignore
904+
}
886905
return getNULL();
887906
}
888907
}
889908

890909
@CApiBuiltin(ret = Int, args = {PyObject, ConstCharPtrAsTruffleString}, call = Direct)
891910
abstract static class PyObject_SetDoc extends CApiBinaryBuiltinNode {
892911
@Specialization
893-
int check(@SuppressWarnings("unused") Object obj, @SuppressWarnings("unused") TruffleString value) {
912+
int set(PBuiltinFunction obj, TruffleString value,
913+
@Cached WriteAttributeToDynamicObjectNode write) {
914+
write.execute(obj, T___DOC__, value);
915+
return 1;
916+
}
917+
918+
@Specialization
919+
int set(PBuiltinMethod obj, TruffleString value,
920+
@Cached WriteAttributeToDynamicObjectNode write) {
921+
set(obj.getFunction(), value, write);
922+
return 1;
923+
}
924+
925+
@Specialization
926+
int set(GetSetDescriptor obj, TruffleString value,
927+
@Cached WriteAttributeToDynamicObjectNode write) {
928+
write.execute(obj, T___DOC__, value);
894929
return 1;
895930
}
931+
932+
@Specialization(guards = "isType.execute(type)", limit = "1")
933+
int set(PythonNativeClass type, TruffleString value,
934+
@SuppressWarnings("unused") @Cached IsTypeNode isType,
935+
// TODO we should write to tp_doc, this writes to __doc__ in the type dict
936+
@Cached("createForceType()") WriteAttributeToObjectNode write) {
937+
write.execute(type, T___DOC__, value);
938+
return 1;
939+
}
940+
941+
@Fallback
942+
@SuppressWarnings("unused")
943+
int set(Object obj, Object value) {
944+
throw CompilerDirectives.shouldNotReachHere("Don't know how to set doc for " + obj.getClass());
945+
}
896946
}
897947
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ static Object notImplemented(Object self, Object other) {
365365
}
366366
}
367367

368-
@Builtin(name = J___STR__, minNumOfPositionalArgs = 1)
368+
@Builtin(name = J___STR__, minNumOfPositionalArgs = 1, doc = "Return str(self).")
369369
@GenerateNodeFactory
370370
abstract static class StrNode extends PythonUnaryBuiltinNode {
371371
@Specialization

0 commit comments

Comments
 (0)