Skip to content

Commit 90923d7

Browse files
committed
[GR-44691] Fix segfaults seen in Numpy tests.
PullRequest: graalpython/2673
2 parents 4c5daa0 + 76f6373 commit 90923d7

File tree

7 files changed

+94
-55
lines changed

7 files changed

+94
-55
lines changed

graalpython/com.oracle.graal.python.cext/src/capi.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ PyAPI_FUNC(RESULT) get_##NAME(RECEIVER obj) { \
429429

430430
TYPE_FIELD_GETTER(PyObject*, ob_type)
431431
PRIMITIVE_FIELD_GETTER(PyObject*, Py_ssize_t, ob_refcnt)
432+
PRIMITIVE_FIELD_GETTER(PyVarObject*, Py_ssize_t, ob_size)
432433
OBJECT_FIELD_GETTER(PyTypeObject*, tp_dict)
433434
OBJECT_FIELD_GETTER(PyTypeObject*, tp_base)
434435
OBJECT_FIELD_GETTER(PyTypeObject*, tp_bases)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltinRegistry.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1592,7 +1592,7 @@ static CApiBuiltinNode createBuiltinNode(int id) {
15921592
case 216:
15931593
return com.oracle.graal.python.builtins.modules.cext.PythonCextBytesBuiltinsFactory.PyTruffle_ByteArray_EmptyWithCapacityNodeGen.create();
15941594
case 217:
1595-
return com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltinsFactory.PyTruffle_Bytes_AsStringNodeGen.create();
1595+
return com.oracle.graal.python.builtins.modules.cext.PythonCextBytesBuiltinsFactory.PyTruffle_Bytes_AsStringNodeGen.create();
15961596
case 218:
15971597
return com.oracle.graal.python.builtins.modules.cext.PythonCextBytesBuiltinsFactory.PyTruffle_Bytes_CheckEmbeddedNullNodeGen.create();
15981598
case 219:

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltins.java

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,6 @@
8484
import com.oracle.graal.python.builtins.modules.GraalPythonModuleBuiltins.DebugNode;
8585
import com.oracle.graal.python.builtins.modules.SysModuleBuiltins.GetFileSystemEncodingNode;
8686
import com.oracle.graal.python.builtins.objects.PNone;
87-
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
88-
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
8987
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
9088
import com.oracle.graal.python.builtins.objects.cext.capi.CApiCodeGen;
9189
import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext;
@@ -95,12 +93,10 @@
9593
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsCharPointerNode;
9694
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ClearNativeWrapperNode;
9795
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction;
98-
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToSulongNode;
9996
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.TransformExceptionToNativeNode;
10097
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.TransformExceptionToNativeNodeGen;
10198
import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
10299
import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol;
103-
import com.oracle.graal.python.builtins.objects.cext.capi.NativeMember;
104100
import com.oracle.graal.python.builtins.objects.cext.capi.PyCFunctionDecorator;
105101
import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper;
106102
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativePointer;
@@ -111,7 +107,6 @@
111107
import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.HandleReleaser;
112108
import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.HandleTester;
113109
import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CArrayWrapper;
114-
import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CStringWrapper;
115110
import com.oracle.graal.python.builtins.objects.cext.common.CExtParseArgumentsNode;
116111
import com.oracle.graal.python.builtins.objects.cext.common.CExtParseArgumentsNode.SplitFormatStringNode;
117112
import com.oracle.graal.python.builtins.objects.cext.common.CExtToJavaNode;
@@ -150,7 +145,6 @@
150145
import com.oracle.graal.python.nodes.util.CannotCastException;
151146
import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
152147
import com.oracle.graal.python.nodes.util.CastToJavaLongLossyNode;
153-
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
154148
import com.oracle.graal.python.runtime.PythonContext;
155149
import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
156150
import com.oracle.graal.python.runtime.PythonOptions;
@@ -1105,32 +1099,6 @@ private static Object[] collect(MroSequenceStorage mro, int idx) {
11051099
}
11061100
}
11071101

1108-
@CApiBuiltin(ret = Pointer, args = {PyObject}, call = Ignored)
1109-
abstract static class PyTruffle_Bytes_AsString extends CApiUnaryBuiltinNode {
1110-
@Specialization
1111-
static Object doBytes(PBytes bytes) {
1112-
return new PySequenceArrayWrapper(bytes, 1);
1113-
}
1114-
1115-
@Specialization
1116-
static Object doUnicode(PString str,
1117-
@Cached CastToTruffleStringNode castToStringNode) {
1118-
return new CStringWrapper(castToStringNode.execute(str));
1119-
}
1120-
1121-
@Specialization
1122-
static Object doNative(PythonAbstractNativeObject obj,
1123-
@Cached ToSulongNode toSulong,
1124-
@Cached PCallCapiFunction callMemberGetterNode) {
1125-
return callMemberGetterNode.call(NativeMember.OB_SVAL.getGetterFunctionName(), toSulong.execute(obj));
1126-
}
1127-
1128-
@Fallback
1129-
Object doUnicode(Object o) {
1130-
throw raise(PythonErrorType.TypeError, ErrorMessages.EXPECTED_S_P_FOUND, "bytes", o);
1131-
}
1132-
}
1133-
11341102
@CApiBuiltin(ret = PyFrameObjectTransfer, args = {PyThreadState, PyCodeObject, PyObject, PyObject}, call = Direct)
11351103
abstract static class PyFrame_New extends CApiQuaternaryBuiltinNode {
11361104
@Specialization

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBytesBuiltins.java

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.ConstCharPtrAsTruffleString;
5050
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.INT8_T_PTR;
5151
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int;
52+
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Pointer;
5253
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject;
5354
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer;
5455
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_ssize_t;
@@ -69,16 +70,24 @@
6970
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
7071
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
7172
import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
73+
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
7274
import com.oracle.graal.python.builtins.objects.cext.capi.CApiGuards;
75+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
7376
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsPythonObjectNode;
77+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToSulongNode;
78+
import com.oracle.graal.python.builtins.objects.cext.capi.NativeMember;
79+
import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper;
7480
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper;
7581
import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor;
82+
import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers;
7683
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.GetByteArrayNode;
7784
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
7885
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemScalarNode;
7986
import com.oracle.graal.python.builtins.objects.ints.PInt;
87+
import com.oracle.graal.python.builtins.objects.str.PString;
8088
import com.oracle.graal.python.builtins.objects.str.StringBuiltins.EncodeNode;
8189
import com.oracle.graal.python.builtins.objects.str.StringBuiltins.ModNode;
90+
import com.oracle.graal.python.lib.PyBytesCheckNode;
8291
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
8392
import com.oracle.graal.python.lib.PyObjectLookupAttr;
8493
import com.oracle.graal.python.lib.PyObjectSizeNode;
@@ -88,11 +97,13 @@
8897
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
8998
import com.oracle.graal.python.nodes.object.InlinedGetClassNode;
9099
import com.oracle.graal.python.nodes.util.CastToByteNode;
100+
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
91101
import com.oracle.graal.python.runtime.exception.PythonErrorType;
92102
import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage;
93103
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
94104
import com.oracle.graal.python.util.OverflowException;
95105
import com.oracle.truffle.api.CompilerDirectives;
106+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
96107
import com.oracle.truffle.api.dsl.Bind;
97108
import com.oracle.truffle.api.dsl.Cached;
98109
import com.oracle.truffle.api.dsl.Cached.Exclusive;
@@ -110,14 +121,28 @@ public final class PythonCextBytesBuiltins {
110121
@CApiBuiltin(ret = Py_ssize_t, args = {PyObject}, call = Direct)
111122
public abstract static class PyBytes_Size extends CApiUnaryBuiltinNode {
112123
@Specialization
113-
public static int size(PBytes obj,
124+
static int doPBytes(PBytes obj,
114125
@Cached PyObjectSizeNode sizeNode) {
115126
return sizeNode.execute(null, obj);
116127
}
117128

129+
@Specialization
130+
Object doOther(PythonAbstractNativeObject obj,
131+
@Bind("this") Node inliningTarget,
132+
@Cached InlinedGetClassNode getClassNode,
133+
@Cached IsSubtypeNode isSubtypeNode,
134+
@Cached ToSulongNode toSulongNode,
135+
@Cached CExtNodes.PCallCapiFunction callMemberGetterNode) {
136+
if (PyBytesCheckNode.check(null, obj, inliningTarget, getClassNode, isSubtypeNode)) {
137+
return callMemberGetterNode.call(NativeMember.OB_SIZE.getGetterFunctionName(), toSulongNode.execute(obj));
138+
}
139+
return fallback(obj);
140+
}
141+
118142
@Fallback
119-
public int fallback(Object obj) {
120-
throw raiseFallback(obj, PythonBuiltinClassType.PBytes);
143+
@TruffleBoundary
144+
int fallback(Object obj) {
145+
throw raise(TypeError, ErrorMessages.EXPECTED_BYTES_P_FOUND, obj);
121146
}
122147
}
123148

@@ -382,4 +407,30 @@ static int doBytes(PBytes bytes,
382407
return 0;
383408
}
384409
}
410+
411+
@CApiBuiltin(ret = Pointer, args = {PyObject}, call = Ignored)
412+
abstract static class PyTruffle_Bytes_AsString extends CApiUnaryBuiltinNode {
413+
@Specialization
414+
static Object doBytes(PBytes bytes) {
415+
return new PySequenceArrayWrapper(bytes, 1);
416+
}
417+
418+
@Specialization
419+
static Object doUnicode(PString str,
420+
@Cached CastToTruffleStringNode castToStringNode) {
421+
return new CArrayWrappers.CStringWrapper(castToStringNode.execute(str));
422+
}
423+
424+
@Specialization
425+
static Object doNative(PythonAbstractNativeObject obj,
426+
@Cached CExtNodes.ToSulongNode toSulong,
427+
@Cached CExtNodes.PCallCapiFunction callMemberGetterNode) {
428+
return callMemberGetterNode.call(NativeMember.OB_SVAL.getGetterFunctionName(), toSulong.execute(obj));
429+
}
430+
431+
@Fallback
432+
Object doUnicode(Object o) {
433+
throw raise(PythonErrorType.TypeError, ErrorMessages.EXPECTED_S_P_FOUND, "bytes", o);
434+
}
435+
}
385436
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ public enum NativeCAPISymbol implements NativeCExtSymbol {
117117
FUN_PY_FLOAT_AS_DOUBLE("truffle_read_ob_fval"),
118118
FUN_GET_OB_TYPE("get_ob_type"),
119119
FUN_GET_OB_REFCNT("get_ob_refcnt"),
120+
FUN_GET_OB_SIZE("get_ob_size"),
120121
FUN_GET_TP_DICT("get_tp_dict"),
121122
FUN_GET_TP_BASE("get_tp_base"),
122123
FUN_GET_TP_BASES("get_tp_bases"),

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSizeNode.java

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2023, 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
@@ -45,6 +45,8 @@
4545
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
4646

4747
import com.oracle.graal.python.builtins.objects.PNone;
48+
import com.oracle.graal.python.builtins.objects.bytes.BytesBuiltins;
49+
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
4850
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageLen;
4951
import com.oracle.graal.python.builtins.objects.dict.PDict;
5052
import com.oracle.graal.python.builtins.objects.list.PList;
@@ -59,9 +61,11 @@
5961
import com.oracle.graal.python.nodes.PRaiseNode;
6062
import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode;
6163
import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode;
62-
import com.oracle.graal.python.nodes.object.GetClassNode;
64+
import com.oracle.graal.python.nodes.object.InlinedGetClassNode;
65+
import com.oracle.graal.python.nodes.object.InlinedGetClassNode.GetPythonObjectClassNode;
6366
import com.oracle.graal.python.nodes.util.CastToJavaIntLossyNode;
6467
import com.oracle.graal.python.runtime.exception.PException;
68+
import com.oracle.truffle.api.dsl.Bind;
6569
import com.oracle.truffle.api.dsl.Cached;
6670
import com.oracle.truffle.api.dsl.Cached.Shared;
6771
import com.oracle.truffle.api.dsl.Fallback;
@@ -94,39 +98,51 @@ static int doTruffleString(TruffleString str,
9498
return codePointLengthNode.execute(str, TS_ENCODING);
9599
}
96100

97-
@Specialization(guards = "cannotBeOverridden(object, getClassNode)", limit = "1")
101+
@Specialization(guards = "cannotBeOverridden(object, inliningTarget, getClassNode)", limit = "1")
98102
static int doList(PList object,
99-
@Shared("getClass") @SuppressWarnings("unused") @Cached GetClassNode getClassNode) {
103+
@SuppressWarnings("unused") @Bind("this") Node inliningTarget,
104+
@Shared("getClass") @SuppressWarnings("unused") @Cached GetPythonObjectClassNode getClassNode) {
100105
return object.getSequenceStorage().length();
101106
}
102107

103-
@Specialization(guards = "cannotBeOverridden(object, getClassNode)", limit = "1")
108+
@Specialization(guards = "cannotBeOverridden(object, inliningTarget, getClassNode)", limit = "1")
104109
static int doTuple(PTuple object,
105-
@Shared("getClass") @SuppressWarnings("unused") @Cached GetClassNode getClassNode) {
110+
@SuppressWarnings("unused") @Bind("this") Node inliningTarget,
111+
@Shared("getClass") @SuppressWarnings("unused") @Cached GetPythonObjectClassNode getClassNode) {
106112
return object.getSequenceStorage().length();
107113
}
108114

109-
@Specialization(guards = "cannotBeOverridden(object, getClassNode)", limit = "1")
115+
@Specialization(guards = "cannotBeOverridden(object, inliningTarget, getClassNode)", limit = "1")
110116
static int doDict(PDict object,
111-
@Shared("getClass") @SuppressWarnings("unused") @Cached GetClassNode getClassNode,
117+
@SuppressWarnings("unused") @Bind("this") Node inliningTarget,
118+
@Shared("getClass") @SuppressWarnings("unused") @Cached GetPythonObjectClassNode getClassNode,
112119
@Shared("hashingStorageLen") @Cached HashingStorageLen lenNode) {
113120
return lenNode.execute(object.getDictStorage());
114121
}
115122

116-
@Specialization(guards = "cannotBeOverridden(object, getClassNode)", limit = "1")
123+
@Specialization(guards = "cannotBeOverridden(object, inliningTarget, getClassNode)", limit = "1")
117124
static int doSet(PSet object,
118-
@Shared("getClass") @SuppressWarnings("unused") @Cached GetClassNode getClassNode,
125+
@SuppressWarnings("unused") @Bind("this") Node inliningTarget,
126+
@Shared("getClass") @SuppressWarnings("unused") @Cached GetPythonObjectClassNode getClassNode,
119127
@Shared("hashingStorageLen") @Cached HashingStorageLen lenNode) {
120128
return lenNode.execute(object.getDictStorage());
121129
}
122130

123-
@Specialization(guards = "cannotBeOverridden(object, getClassNode)", limit = "1")
131+
@Specialization(guards = "cannotBeOverridden(object, inliningTarget, getClassNode)", limit = "1")
124132
static int doPString(PString object,
125-
@Shared("getClass") @SuppressWarnings("unused") @Cached GetClassNode getClassNode,
133+
@SuppressWarnings("unused") @Bind("this") Node inliningTarget,
134+
@Shared("getClass") @SuppressWarnings("unused") @Cached GetPythonObjectClassNode getClassNode,
126135
@Cached StringNodes.StringLenNode lenNode) {
127136
return lenNode.execute(object);
128137
}
129138

139+
@Specialization(guards = "cannotBeOverridden(object, inliningTarget, getClassNode)", limit = "1")
140+
static int doPBytes(PBytes object,
141+
@SuppressWarnings("unused") @Bind("this") Node inliningTarget,
142+
@Shared("getClass") @SuppressWarnings("unused") @Cached GetPythonObjectClassNode getClassNode) {
143+
return BytesBuiltins.LenNode.len(object);
144+
}
145+
130146
@Fallback
131147
static int doOthers(VirtualFrame frame, Object object,
132148
@Cached PyObjectSizeGenericNode genericNode) {
@@ -142,14 +158,15 @@ abstract static class PyObjectSizeGenericNode extends Node {
142158

143159
@Specialization(rewriteOn = UnexpectedResultException.class)
144160
static int doInt(VirtualFrame frame, Object object,
145-
@Shared("getClass") @Cached GetClassNode getClassNode,
161+
@Bind("this") Node inliningTarget,
162+
@Shared("getClass") @Cached InlinedGetClassNode getClassNode,
146163
@Shared("lookupLen") @Cached(parameters = "Len") LookupSpecialMethodSlotNode lookupLen,
147164
@Shared("callLen") @Cached CallUnaryMethodNode callLen,
148165
@Shared("index") @Cached PyNumberIndexNode indexNode,
149166
@Shared("castLossy") @Cached CastToJavaIntLossyNode castLossy,
150167
@Shared("asSize") @Cached PyNumberAsSizeNode asSizeNode,
151168
@Shared("raise") @Cached PRaiseNode raiseNode) throws UnexpectedResultException {
152-
Object lenDescr = lookupLen.execute(frame, getClassNode.execute(object), object);
169+
Object lenDescr = lookupLen.execute(frame, getClassNode.execute(inliningTarget, object), object);
153170
if (lenDescr == PNone.NO_VALUE) {
154171
throw raiseNode.raise(TypeError, ErrorMessages.OBJ_HAS_NO_LEN, object);
155172
}
@@ -163,14 +180,15 @@ static int doInt(VirtualFrame frame, Object object,
163180

164181
@Specialization(replaces = "doInt")
165182
static int doObject(VirtualFrame frame, Object object,
166-
@Shared("getClass") @Cached GetClassNode getClassNode,
183+
@Bind("this") Node inliningTarget,
184+
@Shared("getClass") @Cached InlinedGetClassNode getClassNode,
167185
@Shared("lookupLen") @Cached(parameters = "Len") LookupSpecialMethodSlotNode lookupLen,
168186
@Shared("callLen") @Cached CallUnaryMethodNode callLen,
169187
@Shared("index") @Cached PyNumberIndexNode indexNode,
170188
@Shared("castLossy") @Cached CastToJavaIntLossyNode castLossy,
171189
@Shared("asSize") @Cached PyNumberAsSizeNode asSizeNode,
172190
@Shared("raise") @Cached PRaiseNode raiseNode) {
173-
Object lenDescr = lookupLen.execute(frame, getClassNode.execute(object), object);
191+
Object lenDescr = lookupLen.execute(frame, getClassNode.execute(inliningTarget, object), object);
174192
if (lenDescr == PNone.NO_VALUE) {
175193
throw raiseNode.raise(TypeError, ErrorMessages.OBJ_HAS_NO_LEN, object);
176194
}

graalpython/lib-graalpython/patches/numpy/sdist/numpy-1.23.5.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -270,13 +270,13 @@ index 4fb4d4b..a721a60 100644
270270
return -1;
271271
}
272272
- *out_objs = PySequence_Fast_ITEMS(seq);
273-
- *out_kwd_obj = seq;
274-
+ *out_kwd_obj = PyTuple_Pack(1, *out_kwd_obj);
273+
*out_kwd_obj = seq;
275274
return PySequence_Fast_GET_SIZE(seq);
276275
}
277276
else {
278-
Py_INCREF(*out_kwd_obj);
277+
- Py_INCREF(*out_kwd_obj);
279278
- *out_objs = out_kwd_obj;
279+
+ *out_kwd_obj = PyTuple_Pack(1, *out_kwd_obj);
280280
return 1;
281281
}
282282
}

0 commit comments

Comments
 (0)