Skip to content

Commit b43fbab

Browse files
committed
Fix tp_descr_get external function wrapper: the last arg is optional
1 parent a1b2033 commit b43fbab

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_tp_slots.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class MyC:
8181
raw = TestDescrSetAndDel()
8282
raw.__set__('foo', 42)
8383
assert raw.__get__(raw, 'foo') == 42
84+
assert raw.__get__(raw) == 42
8485
raw.__delete__(raw)
8586
assert raw.__get__(raw, 'foo') is None
8687

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -380,15 +380,15 @@ public enum PExternalFunctionWrapper implements NativeCExtSymbol {
380380
GE(26, PyObjectTransfer, PyObject, PyObject, Int),
381381
ITERNEXT(27, IterResult, PyObject),
382382
INQUIRY(28, InquiryResult, PyObject),
383-
DELITEM(29, Int, PyObject, Py_ssize_t, PyObject),
383+
DELITEM(29, defaults(1), Int, PyObject, Py_ssize_t, PyObject),
384384
GETITEM(30, PyObjectTransfer, PyObject, Py_ssize_t),
385385
GETTER(31, PyObjectTransfer, PyObject, Pointer),
386386
SETTER(32, Int, PyObject, PyObject, Pointer),
387387
INITPROC(33, InitResult, PyObject, PyObject, PyObject),
388388
HASHFUNC(34, PrimitiveResult64, PyObject),
389389
CALL(35, PyObjectTransfer, PyObject, PyObject, PyObject),
390390
SETATTRO(36, InitResult, PyObject, PyObject, PyObject),
391-
DESCR_GET(37, PyObjectTransfer, PyObject, PyObject, PyObject),
391+
DESCR_GET(37, defaults(1), PyObjectTransfer, PyObject, PyObject, PyObject),
392392
DESCR_SET(38, InitResult, PyObject, PyObject, PyObject),
393393
LENFUNC(39, PrimitiveResult64, PyObject),
394394
OBJOBJPROC(40, InquiryResult, PyObject, PyObject),
@@ -400,14 +400,19 @@ public enum PExternalFunctionWrapper implements NativeCExtSymbol {
400400
DESCR_DELETE(46, InitResult, PyObject, PyObject, PyObject), // the last one is always NULL
401401
DELATTRO(47, InitResult, PyObject, PyObject, PyObject); // the last one is always NULL
402402

403+
private static int defaults(int x) {
404+
return x;
405+
}
406+
403407
@CompilationFinal(dimensions = 1) private static final PExternalFunctionWrapper[] VALUES = values();
404408
@CompilationFinal(dimensions = 1) private static final PExternalFunctionWrapper[] BY_ID = new PExternalFunctionWrapper[50];
405409

406410
public final String signature;
407411
public final ArgDescriptor returnValue;
408412
public final ArgDescriptor[] arguments;
413+
public final int numDefaults;
409414

410-
PExternalFunctionWrapper(int value, ArgDescriptor returnValue, ArgDescriptor... arguments) {
415+
PExternalFunctionWrapper(int value, int numDefaults, ArgDescriptor returnValue, ArgDescriptor... arguments) {
411416
this.value = value;
412417
this.returnValue = returnValue;
413418
this.arguments = arguments;
@@ -419,6 +424,11 @@ public enum PExternalFunctionWrapper implements NativeCExtSymbol {
419424
}
420425
s.append("):").append(returnValue.getNFISignature());
421426
this.signature = s.toString();
427+
this.numDefaults = numDefaults;
428+
}
429+
430+
PExternalFunctionWrapper(int value, ArgDescriptor returnValue, ArgDescriptor... arguments) {
431+
this(value, 0, returnValue, arguments);
422432
}
423433

424434
private final int value;
@@ -693,7 +703,7 @@ public static PBuiltinFunction createWrapperFunction(TruffleString name, Object
693703

694704
// generate default values for positional args (if necessary)
695705
if (numDefaults == -1) {
696-
numDefaults = sig == DELITEM ? 1 : 0;
706+
numDefaults = sig.numDefaults;
697707
}
698708
Object[] defaults = PBuiltinFunction.generateDefaults(numDefaults);
699709

0 commit comments

Comments
 (0)