Skip to content

Commit 74cb6ea

Browse files
committed
[GR-21485] Make __text_signature__ writable
PullRequest: graalpython/832
2 parents 6d2744b + bfb0781 commit 74cb6ea

File tree

4 files changed

+43
-16
lines changed

4 files changed

+43
-16
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_functions.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
1+
# Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
22
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
33
#
44
# The Universal Permissive License (UPL), Version 1.0
@@ -243,3 +243,9 @@ def foo(): pass
243243
new_dict = { "customProp": "hello, world"}
244244
foo.__dict__ = new_dict
245245
assert foo.customProp == "hello, world"
246+
247+
248+
def test_function_text_signature_writable():
249+
def foo(): pass
250+
foo.__text_signature__ = 'foo()'
251+
assert foo.__text_signature__ == 'foo()'

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/AbstractFunctionBuiltins.java

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__GLOBALS__;
3333
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__MODULE__;
3434
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__;
35+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__TEXT_SIGNATURE__;
3536
import static com.oracle.graal.python.nodes.SpecialMethodNames.__CALL__;
3637
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GET__;
3738
import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError;
@@ -58,7 +59,6 @@
5859
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
5960
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
6061
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
61-
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6262
import com.oracle.graal.python.nodes.subscript.GetItemNode;
6363
import com.oracle.truffle.api.CompilerDirectives;
6464
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -300,19 +300,37 @@ Object builtinCode(PBuiltinFunction self, Object mapping) {
300300
}
301301
}
302302

303-
@Builtin(name = "__text_signature__", minNumOfPositionalArgs = 1, isGetter = true)
303+
@Builtin(name = __TEXT_SIGNATURE__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true)
304304
@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;
309314
}
310315

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) {
313325
return getSignature(self.getSignature());
314326
}
315327

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+
316334
@TruffleBoundary
317335
private static Object getSignature(Signature signature) {
318336
String[] keywordNames = signature.getKeywordNames();

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/BuiltinMethodBuiltins.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2019, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2020, Oracle and/or its affiliates.
33
* Copyright (c) 2014, Regents of the University of California
44
*
55
* All rights reserved.
@@ -26,6 +26,7 @@
2626

2727
package com.oracle.graal.python.builtins.objects.method;
2828

29+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__TEXT_SIGNATURE__;
2930
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REDUCE__;
3031
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
3132
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
@@ -44,6 +45,7 @@
4445
import com.oracle.graal.python.nodes.SpecialAttributeNames;
4546
import com.oracle.graal.python.nodes.attributes.GetAttributeNode;
4647
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
48+
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
4749
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
4850
import com.oracle.graal.python.nodes.object.GetLazyClassNode;
4951
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
@@ -160,19 +162,19 @@ private PException raiseCannotPickle() {
160162
}
161163
}
162164

163-
@Builtin(name = "__text_signature__", minNumOfPositionalArgs = 1, isGetter = true)
165+
@Builtin(name = __TEXT_SIGNATURE__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true)
164166
@GenerateNodeFactory
165-
public abstract static class TextSignatureNode extends PythonUnaryBuiltinNode {
167+
public abstract static class TextSignatureNode extends PythonBinaryBuiltinNode {
166168
@Child AbstractFunctionBuiltins.TextSignatureNode subNode = AbstractFunctionBuiltins.TextSignatureNode.create();
167169

168170
@Specialization
169-
Object getTextSignature(VirtualFrame frame, PBuiltinMethod self) {
170-
return subNode.execute(frame, self.getFunction());
171+
Object getTextSignature(VirtualFrame frame, PBuiltinMethod self, Object value) {
172+
return subNode.execute(frame, self.getFunction(), value);
171173
}
172174

173175
@Specialization
174-
Object getTextSignature(VirtualFrame frame, PMethod self) {
175-
return subNode.execute(frame, self.getFunction());
176+
Object getTextSignature(VirtualFrame frame, PMethod self, Object value) {
177+
return subNode.execute(frame, self.getFunction(), value);
176178
}
177179
}
178180
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public abstract class SpecialAttributeNames {
6565
public static final String __PATH__ = "__path__";
6666
public static final String __FILE__ = "__file__";
6767
public static final String __CACHED__ = "__cached__";
68+
public static final String __TEXT_SIGNATURE__ = "__text_signature__";
6869
public static final String __TRACEBACK__ = "__traceback__";
6970
public static final String __CAUSE__ = "__cause__";
7071
public static final String __CONTEXT__ = "__context__";

0 commit comments

Comments
 (0)