Skip to content
This repository was archived by the owner on Feb 13, 2025. It is now read-only.

Commit 6e3bb41

Browse files
author
Anselm Kruis
committed
Stackless issue #137: Add Stackless support to "call" functions
Add Stackless support to all call-API-functions in abstract.c
1 parent 56748e9 commit 6e3bb41

File tree

1 file changed

+36
-10
lines changed

1 file changed

+36
-10
lines changed

Objects/abstract.c

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2333,28 +2333,24 @@ _PyObject_FastCall(PyObject *func, PyObject **args, int nargs, PyObject *kwargs)
23332333
static PyObject*
23342334
call_function_tail(PyObject *callable, PyObject *args)
23352335
{
2336-
STACKLESS_GETARG();
23372336
PyObject *result;
23382337

23392338
assert(args != NULL);
23402339

2341-
STACKLESS_PROMOTE_ALL();
23422340
if (!PyTuple_Check(args)) {
23432341
result = _PyObject_FastCall(callable, &args, 1, NULL);
23442342
}
23452343
else {
23462344
result = PyObject_Call(callable, args, NULL);
23472345
}
2348-
STACKLESS_ASSERT();
23492346

23502347
return result;
23512348
}
23522349

23532350
PyObject *
23542351
PyObject_CallFunction(PyObject *callable, const char *format, ...)
23552352
{
2356-
/* Maybe need to pass this through.. need to check that.
2357-
STACKLESS_GETARG(); */
2353+
STACKLESS_GETARG();
23582354
va_list va;
23592355
PyObject *args, *result;
23602356

@@ -2363,7 +2359,10 @@ PyObject_CallFunction(PyObject *callable, const char *format, ...)
23632359
}
23642360

23652361
if (!format || !*format) {
2366-
return _PyObject_FastCall(callable, NULL, 0, NULL);
2362+
STACKLESS_PROMOTE_ALL();
2363+
result = _PyObject_FastCall(callable, NULL, 0, NULL);
2364+
STACKLESS_ASSERT();
2365+
return result;
23672366
}
23682367

23692368
va_start(va, format);
@@ -2373,16 +2372,17 @@ PyObject_CallFunction(PyObject *callable, const char *format, ...)
23732372
return NULL;
23742373
}
23752374

2375+
STACKLESS_PROMOTE_ALL();
23762376
result = call_function_tail(callable, args);
2377+
STACKLESS_ASSERT();
23772378
Py_DECREF(args);
23782379
return result;
23792380
}
23802381

23812382
PyObject *
23822383
_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
23832384
{
2384-
/* Maybe need to pass this through.. need to check that.
2385-
STACKLESS_GETARG(); */
2385+
STACKLESS_GETARG();
23862386
va_list va;
23872387
PyObject *args, *result;
23882388

@@ -2391,7 +2391,10 @@ _PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
23912391
}
23922392

23932393
if (!format || !*format) {
2394-
return _PyObject_FastCall(callable, NULL, 0, NULL);
2394+
STACKLESS_PROMOTE_ALL();
2395+
result = _PyObject_FastCall(callable, NULL, 0, NULL);
2396+
STACKLESS_ASSERT();
2397+
return result;
23952398
}
23962399

23972400
va_start(va, format);
@@ -2401,14 +2404,17 @@ _PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
24012404
return NULL;
24022405
}
24032406

2407+
STACKLESS_PROMOTE_ALL();
24042408
result = call_function_tail(callable, args);
2409+
STACKLESS_ASSERT();
24052410
Py_DECREF(args);
24062411
return result;
24072412
}
24082413

24092414
static PyObject*
24102415
callmethod(PyObject* func, const char *format, va_list va, int is_size_t)
24112416
{
2417+
STACKLESS_GETARG();
24122418
PyObject *args, *result;
24132419

24142420
assert(func != NULL);
@@ -2419,7 +2425,10 @@ callmethod(PyObject* func, const char *format, va_list va, int is_size_t)
24192425
}
24202426

24212427
if (!format || !*format) {
2422-
return _PyObject_FastCall(func, NULL, 0, NULL);
2428+
STACKLESS_PROMOTE_ALL();
2429+
result = _PyObject_FastCall(func, NULL, 0, NULL);
2430+
STACKLESS_ASSERT();
2431+
return result;
24232432
}
24242433

24252434
if (is_size_t) {
@@ -2432,14 +2441,17 @@ callmethod(PyObject* func, const char *format, va_list va, int is_size_t)
24322441
return NULL;
24332442
}
24342443

2444+
STACKLESS_PROMOTE_ALL();
24352445
result = call_function_tail(func, args);
2446+
STACKLESS_ASSERT();
24362447
Py_DECREF(args);
24372448
return result;
24382449
}
24392450

24402451
PyObject *
24412452
PyObject_CallMethod(PyObject *o, const char *name, const char *format, ...)
24422453
{
2454+
STACKLESS_GETARG();
24432455
va_list va;
24442456
PyObject *func = NULL;
24452457
PyObject *retval = NULL;
@@ -2453,7 +2465,9 @@ PyObject_CallMethod(PyObject *o, const char *name, const char *format, ...)
24532465
return NULL;
24542466

24552467
va_start(va, format);
2468+
STACKLESS_PROMOTE_ALL();
24562469
retval = callmethod(func, format, va, 0);
2470+
STACKLESS_ASSERT();
24572471
va_end(va);
24582472
Py_DECREF(func);
24592473
return retval;
@@ -2463,6 +2477,7 @@ PyObject *
24632477
_PyObject_CallMethodId(PyObject *o, _Py_Identifier *name,
24642478
const char *format, ...)
24652479
{
2480+
STACKLESS_GETARG();
24662481
va_list va;
24672482
PyObject *func = NULL;
24682483
PyObject *retval = NULL;
@@ -2476,7 +2491,9 @@ _PyObject_CallMethodId(PyObject *o, _Py_Identifier *name,
24762491
return NULL;
24772492

24782493
va_start(va, format);
2494+
STACKLESS_PROMOTE_ALL();
24792495
retval = callmethod(func, format, va, 0);
2496+
STACKLESS_ASSERT();
24802497
va_end(va);
24812498
Py_DECREF(func);
24822499
return retval;
@@ -2486,6 +2503,7 @@ PyObject *
24862503
_PyObject_CallMethod_SizeT(PyObject *o, const char *name,
24872504
const char *format, ...)
24882505
{
2506+
STACKLESS_GETARG();
24892507
va_list va;
24902508
PyObject *func = NULL;
24912509
PyObject *retval;
@@ -2498,7 +2516,9 @@ _PyObject_CallMethod_SizeT(PyObject *o, const char *name,
24982516
if (func == NULL)
24992517
return NULL;
25002518
va_start(va, format);
2519+
STACKLESS_PROMOTE_ALL();
25012520
retval = callmethod(func, format, va, 1);
2521+
STACKLESS_ASSERT();
25022522
va_end(va);
25032523
Py_DECREF(func);
25042524
return retval;
@@ -2508,6 +2528,7 @@ PyObject *
25082528
_PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name,
25092529
const char *format, ...)
25102530
{
2531+
STACKLESS_GETARG();
25112532
va_list va;
25122533
PyObject *func = NULL;
25132534
PyObject *retval;
@@ -2521,7 +2542,9 @@ _PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name,
25212542
return NULL;
25222543
}
25232544
va_start(va, format);
2545+
STACKLESS_PROMOTE_ALL();
25242546
retval = callmethod(func, format, va, 1);
2547+
STACKLESS_ASSERT();
25252548
va_end(va);
25262549
Py_DECREF(func);
25272550
return retval;
@@ -2585,6 +2608,7 @@ PyObject *
25852608
_PyObject_CallMethodIdObjArgs(PyObject *callable,
25862609
struct _Py_Identifier *name, ...)
25872610
{
2611+
STACKLESS_GETARG();
25882612
PyObject *args, *tmp;
25892613
va_list vargs;
25902614

@@ -2604,7 +2628,9 @@ _PyObject_CallMethodIdObjArgs(PyObject *callable,
26042628
Py_DECREF(callable);
26052629
return NULL;
26062630
}
2631+
STACKLESS_PROMOTE_ALL();
26072632
tmp = PyObject_Call(callable, args, NULL);
2633+
STACKLESS_ASSERT();
26082634
Py_DECREF(args);
26092635
Py_DECREF(callable);
26102636

0 commit comments

Comments
 (0)