Skip to content

Commit 7bd13fd

Browse files
committed
Fix $callable hidden kwargs leaking into signatures
1 parent f57dfe2 commit 7bd13fd

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ static TruffleString getBuiltin(PBuiltinFunction self, @SuppressWarnings("unused
308308

309309
@TruffleBoundary
310310
public static TruffleString signatureToText(Signature signature, boolean skipSelf) {
311-
TruffleString[] keywordNames = signature.getKeywordNames();
311+
TruffleString[] keywordNames = signature.getVisibleKeywordNames();
312312
boolean takesVarArgs = signature.takesVarArgs();
313313
boolean takesVarKeywordArgs = signature.takesVarKeywordArgs();
314314

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ public static Object createInspectSignagure(Signature signature, boolean skipSel
172172
Object inspectParameter = PyObjectGetAttr.executeUncached(inspect, tsLiteral("Parameter"));
173173
Object[] parameterKinds = new Object[ParameterKinds.VALUES.length];
174174

175-
TruffleString[] keywordNames = signature.getKeywordNames();
175+
TruffleString[] keywordNames = signature.getVisibleKeywordNames();
176176
boolean takesVarArgs = signature.takesVarArgs();
177177
boolean takesVarKeywordArgs = signature.takesVarKeywordArgs();
178178
TruffleString[] parameterNames = signature.getParameterIds();

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,14 @@
2727

2828
import static com.oracle.graal.python.nodes.BuiltinNames.T_SELF;
2929
import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING;
30+
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
31+
32+
import java.util.ArrayList;
33+
import java.util.List;
3034

3135
import com.oracle.graal.python.util.PythonUtils;
3236
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
37+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
3338
import com.oracle.truffle.api.strings.TruffleString;
3439

3540
public final class Signature {
@@ -127,6 +132,21 @@ public final TruffleString[] getKeywordNames() {
127132
return keywordOnlyNames;
128133
}
129134

135+
@TruffleBoundary
136+
public TruffleString[] getVisibleKeywordNames() {
137+
/*
138+
* C slot wrappers (ab)use keyword defaults for storing the function pointers, we need to
139+
* filter them out. Their names start with a dollar sign.
140+
*/
141+
List<TruffleString> visibleKeywordNames = new ArrayList<>(keywordOnlyNames.length);
142+
for (TruffleString k : keywordOnlyNames) {
143+
if (k.byteLength(TS_ENCODING) > 0 && k.codePointAtByteIndexUncached(0, TS_ENCODING) != '$') {
144+
visibleKeywordNames.add(k);
145+
}
146+
}
147+
return visibleKeywordNames.toArray(TruffleString[]::new);
148+
}
149+
130150
public final boolean takesKeywordArgs() {
131151
return keywordOnlyNames.length > 0 || takesVarKeywordArgs;
132152
}

0 commit comments

Comments
 (0)