Skip to content

Commit d5d9a05

Browse files
committed
[GR-36885] Support NumPy/HPy
PullRequest: graalpython/2302
2 parents d0011d1 + 8abd650 commit d5d9a05

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+3736
-171
lines changed

graalpython/com.oracle.graal.python.cext/hpy/hpy.c

Lines changed: 119 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -765,11 +765,11 @@ HPyAPI_STORAGE HPy_ssize_t _HPy_IMPL_NAME(Long_AsSsize_t)(HPyContext *ctx, HPy h
765765
}
766766

767767
HPyAPI_STORAGE void* _HPy_IMPL_NAME(Long_AsVoidPtr)(HPyContext *ctx, HPy h) {
768-
return (void *) UPCALL_I64(ctx_Long_AsVoidPtr, ctx, h);
768+
return (void *) UPCALL_I64(ctx_Long_AsVoidPtr, ctx, h);
769769
}
770770

771771
HPyAPI_STORAGE double _HPy_IMPL_NAME(Long_AsDouble)(HPyContext *ctx, HPy h) {
772-
return UPCALL_DOUBLE(ctx_Long_AsDouble, ctx, h);
772+
return UPCALL_DOUBLE(ctx_Long_AsDouble, ctx, h);
773773
}
774774

775775
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Float_FromDouble)(HPyContext *ctx, double v)
@@ -988,11 +988,11 @@ HPyAPI_STORAGE void _HPy_IMPL_NAME(Err_SetObject)(HPyContext *ctx, HPy h_type, H
988988
}
989989

990990
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Err_SetFromErrnoWithFilename)(HPyContext *ctx, HPy h_type, const char *filename_fsencoded) {
991-
return UPCALL_HPY(ctx_Err_SetFromErrnoWithFilename, ctx, h_type, filename_fsencoded);
991+
return UPCALL_HPY(ctx_Err_SetFromErrnoWithFilename, ctx, h_type, filename_fsencoded);
992992
}
993993

994994
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Err_SetFromErrnoWithFilenameObjects)(HPyContext *ctx, HPy h_type, HPy filename1, HPy filename2) {
995-
return UPCALL_HPY(ctx_Err_SetFromErrnoWithFilenameObjects, ctx, h_type, filename1, filename2);
995+
return UPCALL_HPY(ctx_Err_SetFromErrnoWithFilenameObjects, ctx, h_type, filename1, filename2);
996996
}
997997

998998
HPyAPI_STORAGE int _HPy_IMPL_NAME(Err_Occurred)(HPyContext *ctx)
@@ -1001,7 +1001,7 @@ HPyAPI_STORAGE int _HPy_IMPL_NAME(Err_Occurred)(HPyContext *ctx)
10011001
}
10021002

10031003
HPyAPI_STORAGE int _HPy_IMPL_NAME(Err_ExceptionMatches)(HPyContext *ctx, HPy exc) {
1004-
return (int) UPCALL_I32(ctx_Err_ExceptionMatches, ctx, exc);
1004+
return (int) UPCALL_I32(ctx_Err_ExceptionMatches, ctx, exc);
10051005
}
10061006

10071007
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Err_NoMemory)(HPyContext *ctx)
@@ -1023,15 +1023,15 @@ HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Err_NewExceptionWithDoc)(HPyContext *ctx, cons
10231023
}
10241024

10251025
HPyAPI_STORAGE int _HPy_IMPL_NAME(Err_WarnEx)(HPyContext *ctx, HPy category, const char *message, HPy_ssize_t stack_level) {
1026-
return (int) UPCALL_I32(ctx_Err_WarnEx, ctx, category, message, stack_level);
1026+
return (int) UPCALL_I32(ctx_Err_WarnEx, ctx, category, message, stack_level);
10271027
}
10281028

10291029
HPyAPI_STORAGE void _HPy_IMPL_NAME(Err_WriteUnraisable)(HPyContext *ctx, HPy obj) {
1030-
UPCALL_VOID(ctx_Err_WriteUnraisable, ctx, obj);
1030+
UPCALL_VOID(ctx_Err_WriteUnraisable, ctx, obj);
10311031
}
10321032

10331033
HPyAPI_STORAGE void _HPy_IMPL_NAME(FatalError)(HPyContext *ctx, const char *msg) {
1034-
UPCALL_VOID(ctx_FatalError, ctx, msg);
1034+
UPCALL_VOID(ctx_FatalError, ctx, msg);
10351035
}
10361036

10371037
HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(IsTrue)(HPyContext *ctx, HPy h)
@@ -1095,7 +1095,7 @@ HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(GetItem_s)(HPyContext *ctx, HPy obj,
10951095
}
10961096

10971097
HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(Contains)(HPyContext *ctx, HPy container, HPy key) {
1098-
return (int) UPCALL_I32(ctx_Contains, ctx, container, key);
1098+
return (int) UPCALL_I32(ctx_Contains, ctx, container, key);
10991099
}
11001100

11011101
HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(SetItem)(HPyContext *ctx, HPy obj, HPy key, HPy value)
@@ -1224,7 +1224,7 @@ HPyAPI_STORAGE int _HPy_IMPL_NAME(Unicode_Check)(HPyContext *ctx, HPy h)
12241224
}
12251225

12261226
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_AsASCIIString)(HPyContext *ctx, HPy h) {
1227-
return UPCALL_HPY(ctx_Unicode_AsASCIIString, ctx, h);
1227+
return UPCALL_HPY(ctx_Unicode_AsASCIIString, ctx, h);
12281228
}
12291229

12301230
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_AsLatin1String)(HPyContext *ctx, HPy h) {
@@ -1251,23 +1251,23 @@ HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_DecodeFSDefault)(HPyContext *ctx, cons
12511251
}
12521252

12531253
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_DecodeFSDefaultAndSize)(HPyContext *ctx, const char *v, HPy_ssize_t size) {
1254-
return UPCALL_HPY(ctx_Unicode_DecodeFSDefaultAndSize, ctx, v, size);
1254+
return UPCALL_HPY(ctx_Unicode_DecodeFSDefaultAndSize, ctx, v, size);
12551255
}
12561256

12571257
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_EncodeFSDefault)(HPyContext *ctx, HPy h) {
1258-
return UPCALL_HPY(ctx_Unicode_EncodeFSDefault, ctx, h);
1258+
return UPCALL_HPY(ctx_Unicode_EncodeFSDefault, ctx, h);
12591259
}
12601260

12611261
HPyAPI_STORAGE uint32_t _HPy_IMPL_NAME(Unicode_ReadChar)(HPyContext *ctx, HPy h, HPy_ssize_t index) {
12621262
return (uint32_t) UPCALL_I32(ctx_Unicode_ReadChar, ctx, h, index);
12631263
}
12641264

12651265
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_DecodeLatin1)(HPyContext *ctx, const char *s, HPy_ssize_t size, const char *errors) {
1266-
return UPCALL_HPY(ctx_Unicode_DecodeLatin1, ctx, s, size, errors );
1266+
return UPCALL_HPY(ctx_Unicode_DecodeLatin1, ctx, s, size, errors );
12671267
}
12681268

12691269
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_DecodeASCII)(HPyContext *ctx, const char *s, HPy_ssize_t size, const char *errors) {
1270-
return UPCALL_HPY(ctx_Unicode_DecodeASCII, ctx, s, size, errors );
1270+
return UPCALL_HPY(ctx_Unicode_DecodeASCII, ctx, s, size, errors );
12711271
}
12721272

12731273
HPyAPI_STORAGE int _HPy_IMPL_NAME(List_Check)(HPyContext *ctx, HPy h)
@@ -1399,6 +1399,86 @@ HPyAPI_STORAGE void _HPy_IMPL_NAME(Dump)(HPyContext *ctx, HPy h) {
13991399
UPCALL_VOID(ctx_Dump, ctx, h);
14001400
}
14011401

1402+
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(MaybeGetAttr_s)(HPyContext *ctx, HPy obj, const char *name) {
1403+
return UPCALL_HPY(ctx_MaybeGetAttr_s, ctx, obj, name);
1404+
}
1405+
1406+
HPyAPI_STORAGE int _HPy_IMPL_NAME(SetType)(HPyContext *ctx, HPy obj, HPy type) {
1407+
return (int) UPCALL_I32(ctx_SetType, ctx, obj, type);
1408+
}
1409+
1410+
HPyAPI_STORAGE int _HPy_IMPL_NAME(Type_IsSubtype)(HPyContext *ctx, HPy sub, HPy type) {
1411+
return (int) UPCALL_I32(ctx_Type_IsSubtype, ctx, sub, type);
1412+
}
1413+
1414+
HPyAPI_STORAGE const char* _HPy_IMPL_NAME(Type_GetName)(HPyContext *ctx, HPy type) {
1415+
return UPCALL_CHARPTR(ctx_Type_GetName, ctx, type);
1416+
}
1417+
1418+
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_FromEncodedObject)(HPyContext *ctx, HPy obj, const char *encoding, const char *errors) {
1419+
return UPCALL_HPY(ctx_Unicode_FromEncodedObject, ctx, obj, encoding, errors);
1420+
}
1421+
1422+
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_InternFromString)(HPyContext *ctx, const char *str) {
1423+
return UPCALL_HPY(ctx_Unicode_InternFromString, ctx, str);
1424+
}
1425+
1426+
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_Substring)(HPyContext *ctx, HPy obj, HPy_ssize_t start, HPy_ssize_t end) {
1427+
return UPCALL_HPY(ctx_Unicode_Substring, ctx, obj, start, end);
1428+
}
1429+
1430+
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Dict_Keys)(HPyContext *ctx, HPy h) {
1431+
return UPCALL_HPY(ctx_Dict_Keys, ctx, h);
1432+
}
1433+
1434+
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Dict_GetItem)(HPyContext *ctx, HPy op, HPy key) {
1435+
return UPCALL_HPY(ctx_Dict_GetItem, ctx, op, key);
1436+
}
1437+
1438+
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(ContextVar_New)(HPyContext *ctx, const char *name, HPy default_value) {
1439+
return UPCALL_HPY(ctx_ContextVar_New, ctx, name, default_value);
1440+
}
1441+
1442+
HPyAPI_STORAGE int _HPy_IMPL_NAME(ContextVar_Get)(HPyContext *ctx, HPy context_var, HPy default_value, _HPyPtr result) {
1443+
return (int) UPCALL_I32(ctx_ContextVar_Get, ctx, context_var, default_value, result);
1444+
}
1445+
1446+
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(ContextVar_Set)(HPyContext *ctx, HPy context_var, HPy value) {
1447+
return UPCALL_HPY(ctx_ContextVar_Set, ctx, context_var, value);
1448+
}
1449+
1450+
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Capsule_New)(HPyContext *ctx, void *pointer, const char *name, HPyCapsule_Destructor destructor) {
1451+
return UPCALL_HPY(ctx_Capsule_New, ctx, pointer, name, destructor);
1452+
}
1453+
1454+
HPyAPI_STORAGE void *_HPy_IMPL_NAME(Capsule_Get)(HPyContext *ctx, HPy capsule, _HPyCapsule_key key, const char *name) {
1455+
return UPCALL_HPY(ctx_Capsule_Get, ctx, capsule, (int32_t)key, name);
1456+
}
1457+
1458+
HPyAPI_STORAGE int _HPy_IMPL_NAME(Capsule_IsValid)(HPyContext *ctx, HPy capsule, const char *name) {
1459+
return (int) UPCALL_I32(ctx_Capsule_IsValid, ctx, capsule, name);
1460+
}
1461+
1462+
HPyAPI_STORAGE int _HPy_IMPL_NAME(Capsule_Set)(HPyContext *ctx, HPy capsule, _HPyCapsule_key key, void *value) {
1463+
return (int) UPCALL_I32(ctx_Capsule_Set, ctx, capsule, (int32_t)key, value);
1464+
}
1465+
1466+
HPyAPI_STORAGE int _HPy_IMPL_NAME(Type_CheckSlot)(HPyContext *ctx, HPy type, HPyDef *expected) {
1467+
return (int) UPCALL_I32(ctx_Type_CheckSlot, ctx, type, expected);
1468+
}
1469+
1470+
HPyAPI_STORAGE int _HPy_IMPL_NAME(Sequence_Check)(HPyContext *ctx, HPy obj) {
1471+
return (int) UPCALL_I32(ctx_Sequence_Check, ctx, obj);
1472+
}
1473+
1474+
HPyAPI_STORAGE int _HPy_IMPL_NAME(Slice_Unpack)(HPyContext *ctx, HPy slice, HPy_ssize_t *start, HPy_ssize_t *stop, HPy_ssize_t *step) {
1475+
return (int) UPCALL_I32(ctx_Slice_Unpack, ctx, slice, start, stop, step);
1476+
}
1477+
1478+
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(SeqIter_New)(HPyContext *ctx, HPy seq) {
1479+
return UPCALL_HPY(ctx_SeqIter_New, ctx, seq);
1480+
}
1481+
14021482
#undef HPy
14031483
#undef HPyListBuilder
14041484
#undef HPyTupleBuilder
@@ -1498,6 +1578,11 @@ HPyContext *graal_hpy_context_to_native(HPyContext *managed_context, HPyContext
14981578
COPY(h_UnicodeType);
14991579
COPY(h_TupleType);
15001580
COPY(h_ListType);
1581+
COPY(h_ComplexType);
1582+
COPY(h_BytesType);
1583+
COPY(h_MemoryViewType);
1584+
COPY(h_CapsuleType);
1585+
COPY(h_SliceType);
15011586
#undef COPY
15021587

15031588
#define HPY_CTX_UPCALL(__fun) { void* v = overrides->__fun; if (v != NULL) native_context->__fun = v; else native_context->__fun = __fun; }
@@ -1652,6 +1737,26 @@ HPyContext *graal_hpy_context_to_native(HPyContext *managed_context, HPyContext
16521737
HPY_CTX_UPCALL(ctx_Unicode_ReadChar);
16531738
HPY_CTX_UPCALL(ctx_Unicode_DecodeLatin1);
16541739
HPY_CTX_UPCALL(ctx_Unicode_DecodeASCII);
1740+
HPY_CTX_UPCALL(ctx_MaybeGetAttr_s);
1741+
HPY_CTX_UPCALL(ctx_SetType);
1742+
HPY_CTX_UPCALL(ctx_Type_IsSubtype);
1743+
HPY_CTX_UPCALL(ctx_Type_GetName);
1744+
HPY_CTX_UPCALL(ctx_Unicode_FromEncodedObject);
1745+
HPY_CTX_UPCALL(ctx_Unicode_InternFromString);
1746+
HPY_CTX_UPCALL(ctx_Unicode_Substring);
1747+
HPY_CTX_UPCALL(ctx_Dict_Keys);
1748+
HPY_CTX_UPCALL(ctx_Dict_GetItem);
1749+
HPY_CTX_UPCALL(ctx_ContextVar_New);
1750+
HPY_CTX_UPCALL(ctx_ContextVar_Get);
1751+
HPY_CTX_UPCALL(ctx_ContextVar_Set);
1752+
HPY_CTX_UPCALL(ctx_Capsule_New);
1753+
HPY_CTX_UPCALL(ctx_Capsule_Get);
1754+
HPY_CTX_UPCALL(ctx_Capsule_IsValid);
1755+
HPY_CTX_UPCALL(ctx_Capsule_Set);
1756+
HPY_CTX_UPCALL(ctx_Type_CheckSlot);
1757+
HPY_CTX_UPCALL(ctx_Sequence_Check);
1758+
HPY_CTX_UPCALL(ctx_Slice_Unpack);
1759+
HPY_CTX_UPCALL(ctx_SeqIter_New);
16551760

16561761
#undef HPY_CTX_UPCALL
16571762

graalpython/com.oracle.graal.python.cext/include/Python.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
#include "pythonrun.h"
9696
#include "ceval.h"
9797
#include "pyerrors.h"
98+
#include "context.h"
9899
#include "modsupport.h"
99100
#include "tupleobject.h"
100101
#include "structseq.h"
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/* Copyright (c) 2022, Oracle and/or its affiliates.
2+
* Copyright (C) 1996-2017 Python Software Foundation
3+
*
4+
* Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
5+
*/
6+
#ifndef Py_CONTEXT_H
7+
#define Py_CONTEXT_H
8+
#ifdef __cplusplus
9+
extern "C" {
10+
#endif
11+
12+
#ifndef Py_LIMITED_API
13+
14+
15+
PyAPI_DATA(PyTypeObject) PyContext_Type;
16+
typedef struct _pycontextobject PyContext;
17+
18+
PyAPI_DATA(PyTypeObject) PyContextVar_Type;
19+
typedef struct _pycontextvarobject PyContextVar;
20+
21+
PyAPI_DATA(PyTypeObject) PyContextToken_Type;
22+
typedef struct _pycontexttokenobject PyContextToken;
23+
24+
25+
#define PyContext_CheckExact(o) (Py_TYPE(o) == &PyContext_Type)
26+
#define PyContextVar_CheckExact(o) (Py_TYPE(o) == &PyContextVar_Type)
27+
#define PyContextToken_CheckExact(o) (Py_TYPE(o) == &PyContextToken_Type)
28+
29+
30+
PyAPI_FUNC(PyObject *) PyContext_New(void);
31+
PyAPI_FUNC(PyObject *) PyContext_Copy(PyObject *);
32+
PyAPI_FUNC(PyObject *) PyContext_CopyCurrent(void);
33+
34+
PyAPI_FUNC(int) PyContext_Enter(PyObject *);
35+
PyAPI_FUNC(int) PyContext_Exit(PyObject *);
36+
37+
38+
/* Create a new context variable.
39+
40+
default_value can be NULL.
41+
*/
42+
PyAPI_FUNC(PyObject *) PyContextVar_New(
43+
const char *name, PyObject *default_value);
44+
45+
46+
/* Get a value for the variable.
47+
48+
Returns -1 if an error occurred during lookup.
49+
50+
Returns 0 if value either was or was not found.
51+
52+
If value was found, *value will point to it.
53+
If not, it will point to:
54+
55+
- default_value, if not NULL;
56+
- the default value of "var", if not NULL;
57+
- NULL.
58+
59+
'*value' will be a new ref, if not NULL.
60+
*/
61+
PyAPI_FUNC(int) PyContextVar_Get(
62+
PyObject *var, PyObject *default_value, PyObject **value);
63+
64+
65+
/* Set a new value for the variable.
66+
Returns NULL if an error occurs.
67+
*/
68+
PyAPI_FUNC(PyObject *) PyContextVar_Set(PyObject *var, PyObject *value);
69+
70+
71+
/* Reset a variable to its previous value.
72+
Returns 0 on success, -1 on error.
73+
*/
74+
PyAPI_FUNC(int) PyContextVar_Reset(PyObject *var, PyObject *token);
75+
76+
77+
/* This method is exposed only for CPython tests. Don not use it. */
78+
PyAPI_FUNC(PyObject *) _PyContext_NewHamtForTests(void);
79+
80+
81+
PyAPI_FUNC(int) PyContext_ClearFreeList(void);
82+
83+
84+
#endif /* !Py_LIMITED_API */
85+
86+
#ifdef __cplusplus
87+
}
88+
#endif
89+
#endif /* !Py_CONTEXT_H */

graalpython/com.oracle.graal.python.cext/include/hpy.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,12 @@ typedef struct { void* _i; } HPyThreadState;
162162
#define HPy_IsNull(h) ((h)._i == NULL)
163163
#endif
164164

165+
#define HPyListBuilder_IsNull(h) ((h)._lst == 0)
166+
#define HPyTupleBuilder_IsNull(h) ((h)._tup == 0)
167+
168+
#define HPyListBuilder_IsNull(h) ((h)._lst == 0)
169+
#define HPyTupleBuilder_IsNull(h) ((h)._tup == 0)
170+
165171
#define HPyField_NULL _hfconv(0)
166172
#define HPyField_IsNull(f) ((f)._i == 0)
167173

@@ -185,12 +191,23 @@ typedef struct _HPyContext_s HPyContext;
185191
typedef intptr_t HPy_ssize_t;
186192
typedef intptr_t HPy_hash_t;
187193
typedef uint32_t HPy_UCS4;
194+
195+
/* HPyCapsule field keys */
196+
typedef enum {
197+
HPyCapsule_key_Pointer = 0,
198+
HPyCapsule_key_Name = 1,
199+
HPyCapsule_key_Context = 2,
200+
HPyCapsule_key_Destructor = 3,
201+
} _HPyCapsule_key;
202+
188203
#else
189204
typedef Py_ssize_t HPy_ssize_t;
190205
typedef Py_hash_t HPy_hash_t;
191206
typedef Py_UCS4 HPy_UCS4;
192207
#endif
193208

209+
typedef void (*HPyCapsule_Destructor)(const char *name, void *pointer, void *context);
210+
194211

195212
/* ~~~~~~~~~~~~~~~~ Additional #includes ~~~~~~~~~~~~~~~~ */
196213

@@ -203,6 +220,7 @@ typedef struct _HPyContext_s HPyContext;
203220
#include "hpy/runtime/argparse.h"
204221
#include "hpy/runtime/buildvalue.h"
205222
#include "hpy/runtime/helpers.h"
223+
#include "hpy/runtime/structseq.h"
206224

207225
#ifdef HPY_UNIVERSAL_ABI
208226
# include "hpy/universal/autogen_ctx.h"

graalpython/com.oracle.graal.python.cext/include/hpy/autogen_hpyslot.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ typedef enum {
8080
HPy_sq_item = 44,
8181
HPy_sq_length = 45,
8282
HPy_sq_repeat = 46,
83+
HPy_tp_call = 50,
8384
HPy_tp_init = 60,
85+
HPy_tp_iter = 62,
8486
HPy_tp_new = 65,
8587
HPy_tp_repr = 66,
8688
HPy_tp_richcompare = 67,
@@ -137,7 +139,9 @@ typedef enum {
137139
#define _HPySlot_SIG__HPy_sq_item HPyFunc_SSIZEARGFUNC
138140
#define _HPySlot_SIG__HPy_sq_length HPyFunc_LENFUNC
139141
#define _HPySlot_SIG__HPy_sq_repeat HPyFunc_SSIZEARGFUNC
142+
#define _HPySlot_SIG__HPy_tp_call HPyFunc_KEYWORDS
140143
#define _HPySlot_SIG__HPy_tp_init HPyFunc_INITPROC
144+
#define _HPySlot_SIG__HPy_tp_iter HPyFunc_GETITERFUNC
141145
#define _HPySlot_SIG__HPy_tp_new HPyFunc_KEYWORDS
142146
#define _HPySlot_SIG__HPy_tp_repr HPyFunc_REPRFUNC
143147
#define _HPySlot_SIG__HPy_tp_richcompare HPyFunc_RICHCMPFUNC

0 commit comments

Comments
 (0)