|
32 | 32 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__GLOBALS__;
|
33 | 33 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__MODULE__;
|
34 | 34 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__;
|
| 35 | +import static com.oracle.graal.python.nodes.SpecialAttributeNames.__TEXT_SIGNATURE__; |
35 | 36 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__CALL__;
|
36 | 37 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__GET__;
|
37 | 38 | import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError;
|
|
58 | 59 | import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
|
59 | 60 | import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
|
60 | 61 | import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
|
61 |
| -import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; |
62 | 62 | import com.oracle.graal.python.nodes.subscript.GetItemNode;
|
63 | 63 | import com.oracle.truffle.api.CompilerDirectives;
|
64 | 64 | import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
|
@@ -300,19 +300,37 @@ Object builtinCode(PBuiltinFunction self, Object mapping) {
|
300 | 300 | }
|
301 | 301 | }
|
302 | 302 |
|
303 |
| - @Builtin(name = "__text_signature__", minNumOfPositionalArgs = 1, isGetter = true) |
| 303 | + @Builtin(name = __TEXT_SIGNATURE__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true) |
304 | 304 | @GenerateNodeFactory
|
305 |
| - public abstract static class TextSignatureNode extends PythonUnaryBuiltinNode { |
306 |
| - @Specialization |
307 |
| - protected Object doStatic(@SuppressWarnings("unused") PBuiltinFunction self) { |
308 |
| - return getSignature(self.getSignature()); |
| 305 | + public abstract static class TextSignatureNode extends PythonBinaryBuiltinNode { |
| 306 | + @Specialization(guards = {"!isBuiltinFunction(self)", "isNoValue(none)"}) |
| 307 | + Object getFunction(PFunction self, @SuppressWarnings("unused") PNone none, |
| 308 | + @Cached("create()") ReadAttributeFromObjectNode readNode) { |
| 309 | + Object signature = readNode.execute(self, __TEXT_SIGNATURE__); |
| 310 | + if (signature == PNone.NO_VALUE) { |
| 311 | + throw raise(AttributeError, "'function' object has no attribute '__text_signature__'"); |
| 312 | + } |
| 313 | + return signature; |
309 | 314 | }
|
310 | 315 |
|
311 |
| - @Specialization |
312 |
| - protected Object doStatic(@SuppressWarnings("unused") PFunction self) { |
| 316 | + @Specialization(guards = {"!isBuiltinFunction(self)", "!isNoValue(value)"}) |
| 317 | + Object setFunction(PFunction self, Object value, |
| 318 | + @Cached("create()") WriteAttributeToObjectNode writeNode) { |
| 319 | + writeNode.execute(self, __TEXT_SIGNATURE__, value); |
| 320 | + return PNone.NONE; |
| 321 | + } |
| 322 | + |
| 323 | + @Specialization(guards = "isNoValue(none)") |
| 324 | + protected Object getBuiltin(PBuiltinFunction self, @SuppressWarnings("unused") PNone none) { |
313 | 325 | return getSignature(self.getSignature());
|
314 | 326 | }
|
315 | 327 |
|
| 328 | + @Specialization(guards = "!isNoValue(value)") |
| 329 | + protected Object setBuiltin(@SuppressWarnings("unused") PBuiltinFunction self, |
| 330 | + @SuppressWarnings("unused") Object value) { |
| 331 | + throw raise(AttributeError, "AttributeError: attribute '__text_signature__' of 'builtin_function_or_method' objects is not writable"); |
| 332 | + } |
| 333 | + |
316 | 334 | @TruffleBoundary
|
317 | 335 | private static Object getSignature(Signature signature) {
|
318 | 336 | String[] keywordNames = signature.getKeywordNames();
|
|
0 commit comments