Skip to content

Commit 0bf21ff

Browse files
committed
Remove fixed varargs and kwargs from PArguments
1 parent 7cebaed commit 0bf21ff

File tree

11 files changed

+152
-284
lines changed

11 files changed

+152
-284
lines changed

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/ClinicTests.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -61,7 +61,6 @@
6161
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
6262
import com.oracle.graal.python.builtins.objects.PNone;
6363
import com.oracle.graal.python.builtins.objects.function.PArguments;
64-
import com.oracle.graal.python.builtins.objects.function.PKeyword;
6564
import com.oracle.graal.python.nodes.argument.ReadArgumentNode;
6665
import com.oracle.graal.python.nodes.argument.ReadIndexedArgumentNode;
6766
import com.oracle.graal.python.nodes.argument.ReadVarArgsNode;
@@ -211,15 +210,15 @@ public void testVarArgDefaultValues() {
211210
new ReadArgumentNode[]{
212211
ReadIndexedArgumentNode.create(0),
213212
ReadIndexedArgumentNode.create(1),
214-
ReadVarArgsNode.create(true),
213+
ReadVarArgsNode.create(3),
215214
ReadIndexedArgumentNode.create(2)
216215
}));
217-
Object[] scope_w = PArguments.create(2);
218-
scope_w[PArguments.USER_ARGUMENTS_OFFSET] = "abc";
219-
scope_w[PArguments.USER_ARGUMENTS_OFFSET + 1] = 42;
220-
PArguments.setVariableArguments(scope_w, 666);
221-
PArguments.setKeywordArguments(scope_w, new PKeyword[]{new PKeyword(tsLiteral("b"), PNone.NO_VALUE)});
222-
assertEquals(666, callTarget.call(scope_w));
216+
Object[] pArguments = PArguments.create(4);
217+
PArguments.setArgument(pArguments, 0, "abc");
218+
PArguments.setArgument(pArguments, 1, 42);
219+
PArguments.setArgument(pArguments, 2, PNone.NO_VALUE);
220+
PArguments.setArgument(pArguments, 3, new Object[]{666});
221+
assertEquals(666, callTarget.call(pArguments));
223222
}
224223

225224
private static CallTarget createCallTarget(PythonBinaryClinicBuiltinNode node) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ExternalFunctionNodes.java

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ private MethDirectRoot(PythonLanguage lang, TruffleString name, PExternalFunctio
699699
@Override
700700
protected Object[] prepareCArguments(VirtualFrame frame) {
701701
// return a copy of the args array since it will be modified
702-
Object[] varargs = PArguments.getVariableArguments(frame);
702+
Object[] varargs = (Object[]) PArguments.getArgument(frame, SIGNATURE.varArgsPArgumentsIndex());
703703
return PythonUtils.arrayCopyOf(varargs, varargs.length);
704704
}
705705

@@ -971,17 +971,17 @@ public static class MethKeywordsRoot extends MethodDescriptorRoot {
971971

972972
public MethKeywordsRoot(PythonLanguage language, TruffleString name, boolean isStatic, PExternalFunctionWrapper provider) {
973973
super(language, name, isStatic, provider);
974-
this.readVarargsNode = ReadVarArgsNode.create(true);
975-
this.readKwargsNode = ReadVarKeywordsNode.create(PythonUtils.EMPTY_TRUFFLESTRING_ARRAY);
974+
this.readVarargsNode = ReadVarArgsNode.create(SIGNATURE.varArgsPArgumentsIndex());
975+
this.readKwargsNode = ReadVarKeywordsNode.create(SIGNATURE.varKeywordsPArgumentsIndex());
976976
this.createArgsTupleNode = CreateArgsTupleNodeGen.create();
977977
this.freeNode = ReleaseNativeSequenceStorageNodeGen.create();
978978
}
979979

980980
@Override
981981
protected Object[] prepareCArguments(VirtualFrame frame) {
982982
Object self = readSelf(frame);
983-
Object[] args = readVarargsNode.executeObjectArray(frame);
984-
PKeyword[] kwargs = readKwargsNode.executePKeyword(frame);
983+
Object[] args = readVarargsNode.execute(frame);
984+
PKeyword[] kwargs = readKwargsNode.execute(frame);
985985
PythonLanguage language = getLanguage(PythonLanguage.class);
986986
return new Object[]{self, createArgsTupleNode.execute(language, args, seenNativeArgsTupleStorage), kwargs.length > 0 ? PFactory.createDict(language, kwargs) : PNone.NO_VALUE};
987987
}
@@ -1013,15 +1013,15 @@ public static final class MethVarargsRoot extends MethodDescriptorRoot {
10131013

10141014
public MethVarargsRoot(PythonLanguage language, TruffleString name, boolean isStatic, PExternalFunctionWrapper provider) {
10151015
super(language, name, isStatic, provider);
1016-
this.readVarargsNode = ReadVarArgsNode.create(true);
1016+
this.readVarargsNode = ReadVarArgsNode.create(SIGNATURE.varArgsPArgumentsIndex());
10171017
this.createArgsTupleNode = CreateArgsTupleNodeGen.create();
10181018
this.freeNode = ReleaseNativeSequenceStorageNodeGen.create();
10191019
}
10201020

10211021
@Override
10221022
protected Object[] prepareCArguments(VirtualFrame frame) {
10231023
Object self = readSelf(frame);
1024-
Object[] args = readVarargsNode.executeObjectArray(frame);
1024+
Object[] args = readVarargsNode.execute(frame);
10251025
return new Object[]{self, createArgsTupleNode.execute(getLanguage(PythonLanguage.class), args, seenNativeArgsTupleStorage)};
10261026
}
10271027

@@ -1100,11 +1100,11 @@ public MethNewRoot(PythonLanguage language, TruffleString name, boolean isStatic
11001100
@Override
11011101
protected Object[] prepareCArguments(VirtualFrame frame) {
11021102
Object methodSelf = readSelf(frame);
1103-
Object[] args = readVarargsNode.executeObjectArray(frame);
1103+
Object[] args = readVarargsNode.execute(frame);
11041104
// TODO checks
11051105
Object self = args[0];
11061106
args = PythonUtils.arrayCopyOfRange(args, 1, args.length);
1107-
PKeyword[] kwargs = readKwargsNode.executePKeyword(frame);
1107+
PKeyword[] kwargs = readKwargsNode.execute(frame);
11081108
PythonLanguage language = getLanguage(PythonLanguage.class);
11091109
return new Object[]{self, createArgsTupleNode.execute(language, args, seenNativeArgsTupleStorage), kwargs.length > 0 ? PFactory.createDict(language, kwargs) : PNone.NO_VALUE};
11101110
}
@@ -1192,15 +1192,15 @@ public static final class MethFastcallWithKeywordsRoot extends MethodDescriptorR
11921192

11931193
public MethFastcallWithKeywordsRoot(PythonLanguage language, TruffleString name, boolean isStatic, PExternalFunctionWrapper provider) {
11941194
super(language, name, isStatic, provider);
1195-
this.readVarargsNode = ReadVarArgsNode.create(true);
1196-
this.readKwargsNode = ReadVarKeywordsNode.create(PythonUtils.EMPTY_TRUFFLESTRING_ARRAY);
1195+
this.readVarargsNode = ReadVarArgsNode.create(SIGNATURE.varArgsPArgumentsIndex());
1196+
this.readKwargsNode = ReadVarKeywordsNode.create(SIGNATURE.varKeywordsPArgumentsIndex());
11971197
}
11981198

11991199
@Override
12001200
protected Object[] prepareCArguments(VirtualFrame frame) {
12011201
Object self = readSelf(frame);
1202-
Object[] args = readVarargsNode.executeObjectArray(frame);
1203-
PKeyword[] kwargs = readKwargsNode.executePKeyword(frame);
1202+
Object[] args = readVarargsNode.execute(frame);
1203+
PKeyword[] kwargs = readKwargsNode.execute(frame);
12041204
Object[] fastcallArgs = new Object[args.length + kwargs.length];
12051205
Object kwnamesTuple = PNone.NO_VALUE;
12061206
PythonUtils.arraycopy(args, 0, fastcallArgs, 0, args.length);
@@ -1240,16 +1240,16 @@ public static final class MethMethodRoot extends MethodDescriptorRoot {
12401240
public MethMethodRoot(PythonLanguage language, TruffleString name, boolean isStatic, PExternalFunctionWrapper provider) {
12411241
super(language, name, isStatic, provider);
12421242
this.readClsNode = ReadIndexedArgumentNode.create(1);
1243-
this.readVarargsNode = ReadVarArgsNode.create(true);
1244-
this.readKwargsNode = ReadVarKeywordsNode.create(PythonUtils.EMPTY_TRUFFLESTRING_ARRAY);
1243+
this.readVarargsNode = ReadVarArgsNode.create(SIGNATURE.varArgsPArgumentsIndex());
1244+
this.readKwargsNode = ReadVarKeywordsNode.create(SIGNATURE.varKeywordsPArgumentsIndex());
12451245
}
12461246

12471247
@Override
12481248
protected Object[] prepareCArguments(VirtualFrame frame) {
12491249
Object self = readSelf(frame);
12501250
Object cls = readClsNode.execute(frame);
1251-
Object[] args = readVarargsNode.executeObjectArray(frame);
1252-
PKeyword[] kwargs = readKwargsNode.executePKeyword(frame);
1251+
Object[] args = readVarargsNode.execute(frame);
1252+
PKeyword[] kwargs = readKwargsNode.execute(frame);
12531253
Object[] fastcallArgs = new Object[args.length + kwargs.length];
12541254
Object[] fastcallKwnames = new Object[kwargs.length];
12551255
PythonUtils.arraycopy(args, 0, fastcallArgs, 0, args.length);
@@ -1282,13 +1282,13 @@ public static final class MethFastcallRoot extends MethodDescriptorRoot {
12821282

12831283
public MethFastcallRoot(PythonLanguage language, TruffleString name, boolean isStatic, PExternalFunctionWrapper provider) {
12841284
super(language, name, isStatic, provider);
1285-
this.readVarargsNode = ReadVarArgsNode.create(true);
1285+
this.readVarargsNode = ReadVarArgsNode.create(SIGNATURE.varArgsPArgumentsIndex());
12861286
}
12871287

12881288
@Override
12891289
protected Object[] prepareCArguments(VirtualFrame frame) {
12901290
Object self = readSelf(frame);
1291-
Object[] args = readVarargsNode.executeObjectArray(frame);
1291+
Object[] args = readVarargsNode.execute(frame);
12921292
return new Object[]{self, new CPyObjectArrayWrapper(args), args.length};
12931293
}
12941294

@@ -1713,14 +1713,14 @@ static class MethPowRootNode extends MethodDescriptorRoot {
17131713

17141714
MethPowRootNode(PythonLanguage language, TruffleString name, PExternalFunctionWrapper provider) {
17151715
super(language, name, false, provider);
1716-
this.readVarargsNode = ReadVarArgsNode.create(true);
1716+
this.readVarargsNode = ReadVarArgsNode.create(SIGNATURE.varArgsPArgumentsIndex());
17171717
this.profile = ConditionProfile.create();
17181718
}
17191719

17201720
@Override
17211721
protected final Object[] prepareCArguments(VirtualFrame frame) {
17221722
Object self = readSelf(frame);
1723-
Object[] varargs = readVarargsNode.executeObjectArray(frame);
1723+
Object[] varargs = readVarargsNode.execute(frame);
17241724
Object arg0 = varargs[0];
17251725
Object arg1 = profile.profile(varargs.length > 1) ? varargs[1] : PNone.NONE;
17261726
return getArguments(self, arg0, arg1);

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

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,6 @@
4141
* The layout of an argument array for a Python frame.
4242
*
4343
* +-------------------+
44-
* INDEX_VARIABLE_ARGUMENTS -> | Object[] |
45-
* +-------------------+
46-
* INDEX_KEYWORD_ARGUMENTS -> | PKeyword[] |
47-
* +-------------------+
4844
* INDEX_GENERATOR_FRAME -> | MaterializedFrame |
4945
* +-------------------+
5046
* SPECIAL_ARGUMENT -> | Object |
@@ -67,17 +63,14 @@
6763
*/
6864
//@formatter:on
6965
public final class PArguments {
70-
71-
private static final int INDEX_VARIABLE_ARGUMENTS = 0;
72-
private static final int INDEX_KEYWORD_ARGUMENTS = 1;
73-
private static final int INDEX_GENERATOR_FRAME = 2;
74-
private static final int INDEX_SPECIAL_ARGUMENT = 3;
75-
private static final int INDEX_GLOBALS_ARGUMENT = 4;
76-
private static final int INDEX_CLOSURE = 5;
77-
private static final int INDEX_CALLER_FRAME_INFO = 6;
78-
private static final int INDEX_CURRENT_FRAME_INFO = 7;
79-
private static final int INDEX_CURRENT_EXCEPTION = 8;
80-
public static final int USER_ARGUMENTS_OFFSET = 9;
66+
private static final int INDEX_GENERATOR_FRAME = 0;
67+
private static final int INDEX_SPECIAL_ARGUMENT = 1;
68+
private static final int INDEX_GLOBALS_ARGUMENT = 2;
69+
private static final int INDEX_CLOSURE = 3;
70+
private static final int INDEX_CALLER_FRAME_INFO = 4;
71+
private static final int INDEX_CURRENT_FRAME_INFO = 5;
72+
private static final int INDEX_CURRENT_EXCEPTION = 6;
73+
public static final int USER_ARGUMENTS_OFFSET = 7;
8174

8275
public static boolean isPythonFrame(Frame frame) {
8376
return frame != null && isPythonFrame(frame.getArguments());
@@ -98,34 +91,7 @@ public static Object[] create() {
9891
}
9992

10093
public static Object[] create(int userArgumentLength) {
101-
Object[] initialArguments = new Object[USER_ARGUMENTS_OFFSET + userArgumentLength];
102-
initialArguments[INDEX_VARIABLE_ARGUMENTS] = PythonUtils.EMPTY_OBJECT_ARRAY;
103-
initialArguments[INDEX_KEYWORD_ARGUMENTS] = PKeyword.EMPTY_KEYWORDS;
104-
return initialArguments;
105-
}
106-
107-
public static void setVariableArguments(Object[] arguments, Object... variableArguments) {
108-
arguments[INDEX_VARIABLE_ARGUMENTS] = variableArguments;
109-
}
110-
111-
public static Object[] getVariableArguments(Frame frame) {
112-
return getVariableArguments(frame.getArguments());
113-
}
114-
115-
public static Object[] getVariableArguments(Object[] frame) {
116-
return (Object[]) frame[INDEX_VARIABLE_ARGUMENTS];
117-
}
118-
119-
public static void setKeywordArguments(Object[] arguments, PKeyword[] keywordArguments) {
120-
arguments[INDEX_KEYWORD_ARGUMENTS] = keywordArguments;
121-
}
122-
123-
public static PKeyword[] getKeywordArguments(Frame frame) {
124-
return getKeywordArguments(frame.getArguments());
125-
}
126-
127-
public static PKeyword[] getKeywordArguments(Object[] frame) {
128-
return (PKeyword[]) frame[INDEX_KEYWORD_ARGUMENTS];
94+
return new Object[USER_ARGUMENTS_OFFSET + userArgumentLength];
12995
}
13096

13197
/**

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,14 @@ public boolean takesKeywordArgs() {
138138
return keywordOnlyNames.length > 0 || takesVarKeywordArgs;
139139
}
140140

141+
public int varArgsPArgumentsIndex() {
142+
return getMaxNumOfPositionalArgs() + getNumOfRequiredKeywords();
143+
}
144+
145+
public int varKeywordsPArgumentsIndex() {
146+
return getMaxNumOfPositionalArgs() + getNumOfRequiredKeywords() + (takesVarArgs() ? 1 : 0);
147+
}
148+
141149
public boolean takesPositionalOnly() {
142150
return !takesVarArgs() && !takesVarKeywordArgs && keywordOnlyNames.length == 0;
143151
}

0 commit comments

Comments
 (0)