aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-11-14 15:38:49 +0200
committerGitHub <noreply@github.com>2023-11-14 15:38:49 +0200
commitb11c443bb2ebfdd009e43ff208fa6324b658d15d (patch)
treebe88b76437cb273397ad5276796c008434e8ea6a /Python
parent4f04172c9287c507f1426e02ddfc432f1f3ade54 (diff)
downloadcpython-b11c443bb2ebfdd009e43ff208fa6324b658d15d.tar.gz
cpython-b11c443bb2ebfdd009e43ff208fa6324b658d15d.zip
gh-111789: Simplify bytecodes.c by using PyDict_GetItemRef() (GH-111978)
Diffstat (limited to 'Python')
-rw-r--r--Python/bytecodes.c63
-rw-r--r--Python/executor_cases.c.h64
-rw-r--r--Python/generated_cases.c.h64
3 files changed, 51 insertions, 140 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index d914f27ba9d..bb8123ee0bd 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -643,16 +643,12 @@ dummy_func(
inst(BINARY_SUBSCR_DICT, (unused/1, dict, sub -- res)) {
DEOPT_IF(!PyDict_CheckExact(dict));
STAT_INC(BINARY_SUBSCR, hit);
- res = PyDict_GetItemWithError(dict, sub);
- if (res == NULL) {
- if (!_PyErr_Occurred(tstate)) {
- _PyErr_SetKeyError(sub);
- }
- DECREF_INPUTS();
- ERROR_IF(true, error);
+ int rc = PyDict_GetItemRef(dict, sub, &res);
+ if (rc == 0) {
+ _PyErr_SetKeyError(sub);
}
- Py_INCREF(res); // Do this before DECREF'ing dict, sub
DECREF_INPUTS();
+ ERROR_IF(rc <= 0, error); // not found or error
}
inst(BINARY_SUBSCR_GETITEM, (unused/1, container, sub -- unused)) {
@@ -1349,14 +1345,10 @@ dummy_func(
GOTO_ERROR(error);
}
if (v == NULL) {
- v = PyDict_GetItemWithError(GLOBALS(), name);
- if (v != NULL) {
- Py_INCREF(v);
- }
- else if (_PyErr_Occurred(tstate)) {
+ if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
GOTO_ERROR(error);
}
- else {
+ if (v == NULL) {
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
GOTO_ERROR(error);
}
@@ -1383,14 +1375,10 @@ dummy_func(
GOTO_ERROR(error);
}
if (v == NULL) {
- v = PyDict_GetItemWithError(GLOBALS(), name);
- if (v != NULL) {
- Py_INCREF(v);
- }
- else if (_PyErr_Occurred(tstate)) {
+ if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
GOTO_ERROR(error);
}
- else {
+ if (v == NULL) {
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
GOTO_ERROR(error);
}
@@ -1663,34 +1651,17 @@ dummy_func(
ERROR_IF(true, error);
}
/* check if __annotations__ in locals()... */
- if (PyDict_CheckExact(LOCALS())) {
- ann_dict = _PyDict_GetItemWithError(LOCALS(),
- &_Py_ID(__annotations__));
- if (ann_dict == NULL) {
- ERROR_IF(_PyErr_Occurred(tstate), error);
- /* ...if not, create a new one */
- ann_dict = PyDict_New();
- ERROR_IF(ann_dict == NULL, error);
- err = PyDict_SetItem(LOCALS(), &_Py_ID(__annotations__),
- ann_dict);
- Py_DECREF(ann_dict);
- ERROR_IF(err, error);
- }
+ ERROR_IF(PyMapping_GetOptionalItem(LOCALS(), &_Py_ID(__annotations__), &ann_dict) < 0, error);
+ if (ann_dict == NULL) {
+ ann_dict = PyDict_New();
+ ERROR_IF(ann_dict == NULL, error);
+ err = PyObject_SetItem(LOCALS(), &_Py_ID(__annotations__),
+ ann_dict);
+ Py_DECREF(ann_dict);
+ ERROR_IF(err, error);
}
else {
- /* do the same if locals() is not a dict */
- ERROR_IF(PyMapping_GetOptionalItem(LOCALS(), &_Py_ID(__annotations__), &ann_dict) < 0, error);
- if (ann_dict == NULL) {
- ann_dict = PyDict_New();
- ERROR_IF(ann_dict == NULL, error);
- err = PyObject_SetItem(LOCALS(), &_Py_ID(__annotations__),
- ann_dict);
- Py_DECREF(ann_dict);
- ERROR_IF(err, error);
- }
- else {
- Py_DECREF(ann_dict);
- }
+ Py_DECREF(ann_dict);
}
}
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 877328a4ab6..ac542a562ea 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -512,18 +512,13 @@
dict = stack_pointer[-2];
DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR);
STAT_INC(BINARY_SUBSCR, hit);
- res = PyDict_GetItemWithError(dict, sub);
- if (res == NULL) {
- if (!_PyErr_Occurred(tstate)) {
- _PyErr_SetKeyError(sub);
- }
- Py_DECREF(dict);
- Py_DECREF(sub);
- if (true) goto pop_2_error_tier_two;
+ int rc = PyDict_GetItemRef(dict, sub, &res);
+ if (rc == 0) {
+ _PyErr_SetKeyError(sub);
}
- Py_INCREF(res); // Do this before DECREF'ing dict, sub
Py_DECREF(dict);
Py_DECREF(sub);
+ if (rc <= 0) goto pop_2_error_tier_two;
STACK_SHRINK(1);
stack_pointer[-1] = res;
break;
@@ -1022,14 +1017,10 @@
GOTO_ERROR(error);
}
if (v == NULL) {
- v = PyDict_GetItemWithError(GLOBALS(), name);
- if (v != NULL) {
- Py_INCREF(v);
- }
- else if (_PyErr_Occurred(tstate)) {
+ if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
GOTO_ERROR(error);
}
- else {
+ if (v == NULL) {
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
GOTO_ERROR(error);
}
@@ -1059,14 +1050,10 @@
GOTO_ERROR(error);
}
if (v == NULL) {
- v = PyDict_GetItemWithError(GLOBALS(), name);
- if (v != NULL) {
- Py_INCREF(v);
- }
- else if (_PyErr_Occurred(tstate)) {
+ if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
GOTO_ERROR(error);
}
- else {
+ if (v == NULL) {
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
GOTO_ERROR(error);
}
@@ -1404,34 +1391,17 @@
if (true) goto error_tier_two;
}
/* check if __annotations__ in locals()... */
- if (PyDict_CheckExact(LOCALS())) {
- ann_dict = _PyDict_GetItemWithError(LOCALS(),
- &_Py_ID(__annotations__));
- if (ann_dict == NULL) {
- if (_PyErr_Occurred(tstate)) goto error_tier_two;
- /* ...if not, create a new one */
- ann_dict = PyDict_New();
- if (ann_dict == NULL) goto error_tier_two;
- err = PyDict_SetItem(LOCALS(), &_Py_ID(__annotations__),
- ann_dict);
- Py_DECREF(ann_dict);
- if (err) goto error_tier_two;
- }
+ if (PyMapping_GetOptionalItem(LOCALS(), &_Py_ID(__annotations__), &ann_dict) < 0) goto error_tier_two;
+ if (ann_dict == NULL) {
+ ann_dict = PyDict_New();
+ if (ann_dict == NULL) goto error_tier_two;
+ err = PyObject_SetItem(LOCALS(), &_Py_ID(__annotations__),
+ ann_dict);
+ Py_DECREF(ann_dict);
+ if (err) goto error_tier_two;
}
else {
- /* do the same if locals() is not a dict */
- if (PyMapping_GetOptionalItem(LOCALS(), &_Py_ID(__annotations__), &ann_dict) < 0) goto error_tier_two;
- if (ann_dict == NULL) {
- ann_dict = PyDict_New();
- if (ann_dict == NULL) goto error_tier_two;
- err = PyObject_SetItem(LOCALS(), &_Py_ID(__annotations__),
- ann_dict);
- Py_DECREF(ann_dict);
- if (err) goto error_tier_two;
- }
- else {
- Py_DECREF(ann_dict);
- }
+ Py_DECREF(ann_dict);
}
break;
}
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index b9a2b227549..6cbc54c8e62 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -896,18 +896,13 @@
dict = stack_pointer[-2];
DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR);
STAT_INC(BINARY_SUBSCR, hit);
- res = PyDict_GetItemWithError(dict, sub);
- if (res == NULL) {
- if (!_PyErr_Occurred(tstate)) {
- _PyErr_SetKeyError(sub);
- }
- Py_DECREF(dict);
- Py_DECREF(sub);
- if (true) goto pop_2_error;
+ int rc = PyDict_GetItemRef(dict, sub, &res);
+ if (rc == 0) {
+ _PyErr_SetKeyError(sub);
}
- Py_INCREF(res); // Do this before DECREF'ing dict, sub
Py_DECREF(dict);
Py_DECREF(sub);
+ if (rc <= 0) goto pop_2_error;
STACK_SHRINK(1);
stack_pointer[-1] = res;
DISPATCH();
@@ -1950,14 +1945,10 @@
GOTO_ERROR(error);
}
if (v == NULL) {
- v = PyDict_GetItemWithError(GLOBALS(), name);
- if (v != NULL) {
- Py_INCREF(v);
- }
- else if (_PyErr_Occurred(tstate)) {
+ if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
GOTO_ERROR(error);
}
- else {
+ if (v == NULL) {
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
GOTO_ERROR(error);
}
@@ -1990,14 +1981,10 @@
GOTO_ERROR(error);
}
if (v == NULL) {
- v = PyDict_GetItemWithError(GLOBALS(), name);
- if (v != NULL) {
- Py_INCREF(v);
- }
- else if (_PyErr_Occurred(tstate)) {
+ if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
GOTO_ERROR(error);
}
- else {
+ if (v == NULL) {
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
GOTO_ERROR(error);
}
@@ -2422,34 +2409,17 @@
if (true) goto error;
}
/* check if __annotations__ in locals()... */
- if (PyDict_CheckExact(LOCALS())) {
- ann_dict = _PyDict_GetItemWithError(LOCALS(),
- &_Py_ID(__annotations__));
- if (ann_dict == NULL) {
- if (_PyErr_Occurred(tstate)) goto error;
- /* ...if not, create a new one */
- ann_dict = PyDict_New();
- if (ann_dict == NULL) goto error;
- err = PyDict_SetItem(LOCALS(), &_Py_ID(__annotations__),
- ann_dict);
- Py_DECREF(ann_dict);
- if (err) goto error;
- }
+ if (PyMapping_GetOptionalItem(LOCALS(), &_Py_ID(__annotations__), &ann_dict) < 0) goto error;
+ if (ann_dict == NULL) {
+ ann_dict = PyDict_New();
+ if (ann_dict == NULL) goto error;
+ err = PyObject_SetItem(LOCALS(), &_Py_ID(__annotations__),
+ ann_dict);
+ Py_DECREF(ann_dict);
+ if (err) goto error;
}
else {
- /* do the same if locals() is not a dict */
- if (PyMapping_GetOptionalItem(LOCALS(), &_Py_ID(__annotations__), &ann_dict) < 0) goto error;
- if (ann_dict == NULL) {
- ann_dict = PyDict_New();
- if (ann_dict == NULL) goto error;
- err = PyObject_SetItem(LOCALS(), &_Py_ID(__annotations__),
- ann_dict);
- Py_DECREF(ann_dict);
- if (err) goto error;
- }
- else {
- Py_DECREF(ann_dict);
- }
+ Py_DECREF(ann_dict);
}
DISPATCH();
}