|
48 | 48 | import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_PY_MAPPING_SIZE;
|
49 | 49 | import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_PY_OBJECT_SIZE;
|
50 | 50 | 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; |
51 | 52 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.ConstCharPtrAsTruffleString;
|
52 | 53 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int;
|
53 | 54 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject;
|
|
57 | 58 | import static com.oracle.graal.python.nodes.ErrorMessages.BASE_MUST_BE;
|
58 | 59 | import static com.oracle.graal.python.nodes.ErrorMessages.OBJ_ISNT_MAPPING;
|
59 | 60 | 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__; |
60 | 62 | import static com.oracle.graal.python.nodes.SpecialMethodNames.T_ITEMS;
|
61 | 63 | import static com.oracle.graal.python.nodes.SpecialMethodNames.T_KEYS;
|
62 | 64 | import static com.oracle.graal.python.nodes.SpecialMethodNames.T_VALUES;
|
|
81 | 83 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode;
|
82 | 84 | import com.oracle.graal.python.builtins.modules.cext.PythonCextErrBuiltins.PyErr_Restore;
|
83 | 85 | 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; |
84 | 88 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction;
|
85 | 89 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToSulongNode;
|
86 | 90 | import com.oracle.graal.python.builtins.objects.cext.capi.DynamicObjectNativeWrapper.PrimitiveNativeWrapper;
|
87 |
| -import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor; |
88 | 91 | import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.ItemsNode;
|
89 | 92 | import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.KeysNode;
|
90 | 93 | import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.ValuesNode;
|
91 | 94 | 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; |
92 | 97 | import com.oracle.graal.python.builtins.objects.ints.PInt;
|
93 | 98 | import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes;
|
94 | 99 | import com.oracle.graal.python.builtins.objects.list.PList;
|
95 | 100 | import com.oracle.graal.python.builtins.objects.mappingproxy.PMappingproxy;
|
| 101 | +import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; |
96 | 102 | import com.oracle.graal.python.builtins.objects.type.TypeNodes.InlinedIsSameTypeNode;
|
| 103 | +import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; |
97 | 104 | import com.oracle.graal.python.lib.PyIndexCheckNode;
|
98 | 105 | import com.oracle.graal.python.lib.PyMappingCheckNode;
|
99 | 106 | import com.oracle.graal.python.lib.PyNumberCheckNode;
|
|
107 | 114 | import com.oracle.graal.python.lib.PySequenceCheckNode;
|
108 | 115 | import com.oracle.graal.python.lib.PySliceNew;
|
109 | 116 | 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; |
110 | 119 | import com.oracle.graal.python.nodes.builtins.ListNodes.ConstructListNode;
|
111 | 120 | import com.oracle.graal.python.nodes.call.CallNode;
|
112 | 121 | import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode;
|
@@ -879,19 +888,61 @@ Object check(Object object,
|
879 | 888 | }
|
880 | 889 | }
|
881 | 890 |
|
882 |
| - @CApiBuiltin(ret = ArgDescriptor.ConstCharPtr, args = {PyObject}, call = Direct) |
| 891 | + @CApiBuiltin(ret = ConstCharPtr, args = {PyObject}, call = Direct) |
883 | 892 | abstract static class PyObject_GetDoc extends CApiUnaryBuiltinNode {
|
884 | 893 | @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 | + } |
886 | 905 | return getNULL();
|
887 | 906 | }
|
888 | 907 | }
|
889 | 908 |
|
890 | 909 | @CApiBuiltin(ret = Int, args = {PyObject, ConstCharPtrAsTruffleString}, call = Direct)
|
891 | 910 | abstract static class PyObject_SetDoc extends CApiBinaryBuiltinNode {
|
892 | 911 | @Specialization
|
893 |
| - int check(@SuppressWarnings("unused") Object obj, @SuppressWarnings("unused") TruffleString value) { |
| 912 | + static int set(PBuiltinFunction obj, TruffleString value, |
| 913 | + @Shared("write") @Cached WriteAttributeToDynamicObjectNode write) { |
| 914 | + write.execute(obj, T___DOC__, value); |
| 915 | + return 1; |
| 916 | + } |
| 917 | + |
| 918 | + @Specialization |
| 919 | + static int set(PBuiltinMethod obj, TruffleString value, |
| 920 | + @Shared("write") @Cached WriteAttributeToDynamicObjectNode write) { |
| 921 | + set(obj.getFunction(), value, write); |
| 922 | + return 1; |
| 923 | + } |
| 924 | + |
| 925 | + @Specialization |
| 926 | + static int set(GetSetDescriptor obj, TruffleString value, |
| 927 | + @Shared("write") @Cached WriteAttributeToDynamicObjectNode write) { |
| 928 | + write.execute(obj, T___DOC__, value); |
894 | 929 | return 1;
|
895 | 930 | }
|
| 931 | + |
| 932 | + @Specialization(guards = "isType.execute(type)", limit = "1") |
| 933 | + static 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 | + static int set(Object obj, Object value) { |
| 944 | + CompilerDirectives.transferToInterpreterAndInvalidate(); |
| 945 | + throw CompilerDirectives.shouldNotReachHere("Don't know how to set doc for " + obj.getClass()); |
| 946 | + } |
896 | 947 | }
|
897 | 948 | }
|
0 commit comments