Skip to content

Commit

Permalink
pythongh-98831: rewrite MAKE_FUNCTION and BUILD_SLICE in the instruct…
Browse files Browse the repository at this point in the history
…ion definition DSL (python#101529)
  • Loading branch information
iritkatriel authored Feb 3, 2023
1 parent 04e06e2 commit 433fb3e
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 54 deletions.
47 changes: 20 additions & 27 deletions Python/bytecodes.c
Original file line number Diff line number Diff line change
Expand Up @@ -2972,36 +2972,39 @@ dummy_func(
CHECK_EVAL_BREAKER();
}

// error: MAKE_FUNCTION has irregular stack effect
inst(MAKE_FUNCTION) {
PyObject *codeobj = POP();
PyFunctionObject *func = (PyFunctionObject *)
inst(MAKE_FUNCTION, (defaults if (oparg & 0x01),
kwdefaults if (oparg & 0x02),
annotations if (oparg & 0x04),
closure if (oparg & 0x08),
codeobj -- func)) {

PyFunctionObject *func_obj = (PyFunctionObject *)
PyFunction_New(codeobj, GLOBALS());

Py_DECREF(codeobj);
if (func == NULL) {
if (func_obj == NULL) {
goto error;
}

if (oparg & 0x08) {
assert(PyTuple_CheckExact(TOP()));
func->func_closure = POP();
assert(PyTuple_CheckExact(closure));
func_obj->func_closure = closure;
}
if (oparg & 0x04) {
assert(PyTuple_CheckExact(TOP()));
func->func_annotations = POP();
assert(PyTuple_CheckExact(annotations));
func_obj->func_annotations = annotations;
}
if (oparg & 0x02) {
assert(PyDict_CheckExact(TOP()));
func->func_kwdefaults = POP();
assert(PyDict_CheckExact(kwdefaults));
func_obj->func_kwdefaults = kwdefaults;
}
if (oparg & 0x01) {
assert(PyTuple_CheckExact(TOP()));
func->func_defaults = POP();
assert(PyTuple_CheckExact(defaults));
func_obj->func_defaults = defaults;
}

func->func_version = ((PyCodeObject *)codeobj)->co_version;
PUSH((PyObject *)func);
func_obj->func_version = ((PyCodeObject *)codeobj)->co_version;
func = (PyObject *)func_obj;
}

inst(RETURN_GENERATOR, (--)) {
Expand All @@ -3027,22 +3030,12 @@ dummy_func(
goto resume_frame;
}

// error: BUILD_SLICE has irregular stack effect
inst(BUILD_SLICE) {
PyObject *start, *stop, *step, *slice;
if (oparg == 3)
step = POP();
else
step = NULL;
stop = POP();
start = TOP();
inst(BUILD_SLICE, (start, stop, step if (oparg == 3) -- slice)) {
slice = PySlice_New(start, stop, step);
Py_DECREF(start);
Py_DECREF(stop);
Py_XDECREF(step);
SET_TOP(slice);
if (slice == NULL)
goto error;
ERROR_IF(slice == NULL, error);
}

// error: FORMAT_VALUE has irregular stack effect
Expand Down
52 changes: 29 additions & 23 deletions Python/generated_cases.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions Python/opcode_metadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -325,11 +325,11 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) {
case CALL_FUNCTION_EX:
return -1;
case MAKE_FUNCTION:
return -1;
return ((oparg & 0x01) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x08) ? 1 : 0) + 1;
case RETURN_GENERATOR:
return 0;
case BUILD_SLICE:
return -1;
return ((oparg == 3) ? 1 : 0) + 2;
case FORMAT_VALUE:
return -1;
case COPY:
Expand Down Expand Up @@ -671,11 +671,11 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) {
case CALL_FUNCTION_EX:
return -1;
case MAKE_FUNCTION:
return -1;
return 1;
case RETURN_GENERATOR:
return 0;
case BUILD_SLICE:
return -1;
return 1;
case FORMAT_VALUE:
return -1;
case COPY:
Expand Down

0 comments on commit 433fb3e

Please sign in to comment.