Skip to content

Commit 1ce27d7

Browse files
committed
basic implementation to emulate cpython's __text_signature__
1 parent 6f50dd3 commit 1ce27d7

File tree

2 files changed

+78
-1
lines changed

2 files changed

+78
-1
lines changed

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

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import com.oracle.graal.python.builtins.objects.cell.PCell;
4949
import com.oracle.graal.python.builtins.objects.code.PCode;
5050
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
51+
import com.oracle.graal.python.builtins.objects.function.Arity.KeywordName;
5152
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
5253
import com.oracle.graal.python.builtins.objects.method.PMethod;
5354
import com.oracle.graal.python.builtins.objects.module.PythonModule;
@@ -63,6 +64,7 @@
6364
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6465
import com.oracle.graal.python.nodes.subscript.GetItemNode;
6566
import com.oracle.truffle.api.CompilerDirectives;
67+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
6668
import com.oracle.truffle.api.dsl.Cached;
6769
import com.oracle.truffle.api.dsl.Fallback;
6870
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
@@ -283,7 +285,65 @@ Object builtinCode(PBuiltinFunction self) {
283285
public abstract static class TextSignatureNode extends PythonUnaryBuiltinNode {
284286
@Specialization
285287
protected Object doStatic(@SuppressWarnings("unused") PBuiltinFunction self) {
286-
return "";
288+
boolean enclosingType = self.getEnclosingType() != null;
289+
Arity arity = self.getArity();
290+
return getSignature(enclosingType, arity);
291+
}
292+
293+
@Specialization
294+
protected Object doStatic(@SuppressWarnings("unused") PFunction self) {
295+
boolean enclosingType = self.getEnclosingClassName() != null;
296+
Arity arity = self.getArity();
297+
return getSignature(enclosingType, arity);
298+
}
299+
300+
@TruffleBoundary
301+
private static Object getSignature(boolean enclosingType, Arity arity) {
302+
int minArgs = arity.getMinNumOfPositionalArgs();
303+
KeywordName[] keywordNames = arity.getKeywordNames();
304+
int requiredKeywords = arity.getNumOfRequiredKeywords();
305+
boolean takesVarArgs = arity.takesVarArgs();
306+
boolean takesVarKeywordArgs = arity.takesVarKeywordArgs();
307+
308+
StringBuilder sb = new StringBuilder();
309+
char argName = 'a';
310+
sb.append('(');
311+
if (minArgs > 0) {
312+
if (!enclosingType) {
313+
sb.append("$module");
314+
} else {
315+
sb.append("self");
316+
}
317+
for (int i = 1; i < minArgs; i++) {
318+
sb.append(", ").append(argName++);
319+
}
320+
}
321+
if (minArgs > 0) {
322+
sb.append(", /");
323+
}
324+
if (keywordNames.length > 0) {
325+
int i = 0;
326+
while (i < requiredKeywords) {
327+
sb.append(", ").append(keywordNames[i++]);
328+
}
329+
if (takesVarArgs) {
330+
sb.append(", *args");
331+
} else {
332+
sb.append(", *");
333+
}
334+
while (i < keywordNames.length) {
335+
sb.append(", ").append(keywordNames[i]).append("=?");
336+
}
337+
if (takesVarKeywordArgs) {
338+
sb.append(", **kwargs");
339+
}
340+
}
341+
sb.append(')');
342+
return sb.toString();
343+
}
344+
345+
public static TextSignatureNode create() {
346+
return AbstractFunctionBuiltinsFactory.TextSignatureNodeFactory.create();
287347
}
288348
}
289349
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
3838
import com.oracle.graal.python.builtins.PythonBuiltins;
3939
import com.oracle.graal.python.builtins.objects.PNone;
40+
import com.oracle.graal.python.builtins.objects.function.AbstractFunctionBuiltins;
4041
import com.oracle.graal.python.builtins.objects.module.PythonModule;
4142
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4243
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
@@ -121,4 +122,20 @@ private PException raiseCannotPickle() {
121122
throw raise(TypeError, "can't pickle function objects");
122123
}
123124
}
125+
126+
@Builtin(name = "__text_signature__", fixedNumOfPositionalArgs = 1, isGetter = true)
127+
@GenerateNodeFactory
128+
public abstract static class TextSignatureNode extends PythonUnaryBuiltinNode {
129+
@Child AbstractFunctionBuiltins.TextSignatureNode subNode = AbstractFunctionBuiltins.TextSignatureNode.create();
130+
131+
@Specialization
132+
Object getTextSignature(PBuiltinMethod self) {
133+
return subNode.execute(self.getFunction());
134+
}
135+
136+
@Specialization
137+
Object getTextSignature(PMethod self) {
138+
return subNode.execute(self.getFunction());
139+
}
140+
}
124141
}

0 commit comments

Comments
 (0)