|
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