mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
gh-111789: Simplify bytecodes.c by using PyDict_GetItemRef() (GH-111978)
This commit is contained in:
parent
4f04172c92
commit
b11c443bb2
3 changed files with 51 additions and 140 deletions
|
@ -643,16 +643,12 @@ dummy_func(
|
||||||
inst(BINARY_SUBSCR_DICT, (unused/1, dict, sub -- res)) {
|
inst(BINARY_SUBSCR_DICT, (unused/1, dict, sub -- res)) {
|
||||||
DEOPT_IF(!PyDict_CheckExact(dict));
|
DEOPT_IF(!PyDict_CheckExact(dict));
|
||||||
STAT_INC(BINARY_SUBSCR, hit);
|
STAT_INC(BINARY_SUBSCR, hit);
|
||||||
res = PyDict_GetItemWithError(dict, sub);
|
int rc = PyDict_GetItemRef(dict, sub, &res);
|
||||||
if (res == NULL) {
|
if (rc == 0) {
|
||||||
if (!_PyErr_Occurred(tstate)) {
|
_PyErr_SetKeyError(sub);
|
||||||
_PyErr_SetKeyError(sub);
|
|
||||||
}
|
|
||||||
DECREF_INPUTS();
|
|
||||||
ERROR_IF(true, error);
|
|
||||||
}
|
}
|
||||||
Py_INCREF(res); // Do this before DECREF'ing dict, sub
|
|
||||||
DECREF_INPUTS();
|
DECREF_INPUTS();
|
||||||
|
ERROR_IF(rc <= 0, error); // not found or error
|
||||||
}
|
}
|
||||||
|
|
||||||
inst(BINARY_SUBSCR_GETITEM, (unused/1, container, sub -- unused)) {
|
inst(BINARY_SUBSCR_GETITEM, (unused/1, container, sub -- unused)) {
|
||||||
|
@ -1349,14 +1345,10 @@ dummy_func(
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
if (v == NULL) {
|
if (v == NULL) {
|
||||||
v = PyDict_GetItemWithError(GLOBALS(), name);
|
if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
|
||||||
if (v != NULL) {
|
|
||||||
Py_INCREF(v);
|
|
||||||
}
|
|
||||||
else if (_PyErr_Occurred(tstate)) {
|
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
else {
|
if (v == NULL) {
|
||||||
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
|
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
|
@ -1383,14 +1375,10 @@ dummy_func(
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
if (v == NULL) {
|
if (v == NULL) {
|
||||||
v = PyDict_GetItemWithError(GLOBALS(), name);
|
if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
|
||||||
if (v != NULL) {
|
|
||||||
Py_INCREF(v);
|
|
||||||
}
|
|
||||||
else if (_PyErr_Occurred(tstate)) {
|
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
else {
|
if (v == NULL) {
|
||||||
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
|
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
|
@ -1663,34 +1651,17 @@ dummy_func(
|
||||||
ERROR_IF(true, error);
|
ERROR_IF(true, error);
|
||||||
}
|
}
|
||||||
/* check if __annotations__ in locals()... */
|
/* check if __annotations__ in locals()... */
|
||||||
if (PyDict_CheckExact(LOCALS())) {
|
ERROR_IF(PyMapping_GetOptionalItem(LOCALS(), &_Py_ID(__annotations__), &ann_dict) < 0, error);
|
||||||
ann_dict = _PyDict_GetItemWithError(LOCALS(),
|
if (ann_dict == NULL) {
|
||||||
&_Py_ID(__annotations__));
|
ann_dict = PyDict_New();
|
||||||
if (ann_dict == NULL) {
|
ERROR_IF(ann_dict == NULL, error);
|
||||||
ERROR_IF(_PyErr_Occurred(tstate), error);
|
err = PyObject_SetItem(LOCALS(), &_Py_ID(__annotations__),
|
||||||
/* ...if not, create a new one */
|
ann_dict);
|
||||||
ann_dict = PyDict_New();
|
Py_DECREF(ann_dict);
|
||||||
ERROR_IF(ann_dict == NULL, error);
|
ERROR_IF(err, error);
|
||||||
err = PyDict_SetItem(LOCALS(), &_Py_ID(__annotations__),
|
|
||||||
ann_dict);
|
|
||||||
Py_DECREF(ann_dict);
|
|
||||||
ERROR_IF(err, error);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* do the same if locals() is not a dict */
|
Py_DECREF(ann_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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
64
Python/executor_cases.c.h
generated
64
Python/executor_cases.c.h
generated
|
@ -512,18 +512,13 @@
|
||||||
dict = stack_pointer[-2];
|
dict = stack_pointer[-2];
|
||||||
DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR);
|
DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR);
|
||||||
STAT_INC(BINARY_SUBSCR, hit);
|
STAT_INC(BINARY_SUBSCR, hit);
|
||||||
res = PyDict_GetItemWithError(dict, sub);
|
int rc = PyDict_GetItemRef(dict, sub, &res);
|
||||||
if (res == NULL) {
|
if (rc == 0) {
|
||||||
if (!_PyErr_Occurred(tstate)) {
|
_PyErr_SetKeyError(sub);
|
||||||
_PyErr_SetKeyError(sub);
|
|
||||||
}
|
|
||||||
Py_DECREF(dict);
|
|
||||||
Py_DECREF(sub);
|
|
||||||
if (true) goto pop_2_error_tier_two;
|
|
||||||
}
|
}
|
||||||
Py_INCREF(res); // Do this before DECREF'ing dict, sub
|
|
||||||
Py_DECREF(dict);
|
Py_DECREF(dict);
|
||||||
Py_DECREF(sub);
|
Py_DECREF(sub);
|
||||||
|
if (rc <= 0) goto pop_2_error_tier_two;
|
||||||
STACK_SHRINK(1);
|
STACK_SHRINK(1);
|
||||||
stack_pointer[-1] = res;
|
stack_pointer[-1] = res;
|
||||||
break;
|
break;
|
||||||
|
@ -1022,14 +1017,10 @@
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
if (v == NULL) {
|
if (v == NULL) {
|
||||||
v = PyDict_GetItemWithError(GLOBALS(), name);
|
if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
|
||||||
if (v != NULL) {
|
|
||||||
Py_INCREF(v);
|
|
||||||
}
|
|
||||||
else if (_PyErr_Occurred(tstate)) {
|
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
else {
|
if (v == NULL) {
|
||||||
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
|
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
|
@ -1059,14 +1050,10 @@
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
if (v == NULL) {
|
if (v == NULL) {
|
||||||
v = PyDict_GetItemWithError(GLOBALS(), name);
|
if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
|
||||||
if (v != NULL) {
|
|
||||||
Py_INCREF(v);
|
|
||||||
}
|
|
||||||
else if (_PyErr_Occurred(tstate)) {
|
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
else {
|
if (v == NULL) {
|
||||||
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
|
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
|
@ -1404,34 +1391,17 @@
|
||||||
if (true) goto error_tier_two;
|
if (true) goto error_tier_two;
|
||||||
}
|
}
|
||||||
/* check if __annotations__ in locals()... */
|
/* check if __annotations__ in locals()... */
|
||||||
if (PyDict_CheckExact(LOCALS())) {
|
if (PyMapping_GetOptionalItem(LOCALS(), &_Py_ID(__annotations__), &ann_dict) < 0) goto error_tier_two;
|
||||||
ann_dict = _PyDict_GetItemWithError(LOCALS(),
|
if (ann_dict == NULL) {
|
||||||
&_Py_ID(__annotations__));
|
ann_dict = PyDict_New();
|
||||||
if (ann_dict == NULL) {
|
if (ann_dict == NULL) goto error_tier_two;
|
||||||
if (_PyErr_Occurred(tstate)) goto error_tier_two;
|
err = PyObject_SetItem(LOCALS(), &_Py_ID(__annotations__),
|
||||||
/* ...if not, create a new one */
|
ann_dict);
|
||||||
ann_dict = PyDict_New();
|
Py_DECREF(ann_dict);
|
||||||
if (ann_dict == NULL) goto error_tier_two;
|
if (err) goto error_tier_two;
|
||||||
err = PyDict_SetItem(LOCALS(), &_Py_ID(__annotations__),
|
|
||||||
ann_dict);
|
|
||||||
Py_DECREF(ann_dict);
|
|
||||||
if (err) goto error_tier_two;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* do the same if locals() is not a dict */
|
Py_DECREF(ann_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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
64
Python/generated_cases.c.h
generated
64
Python/generated_cases.c.h
generated
|
@ -896,18 +896,13 @@
|
||||||
dict = stack_pointer[-2];
|
dict = stack_pointer[-2];
|
||||||
DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR);
|
DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR);
|
||||||
STAT_INC(BINARY_SUBSCR, hit);
|
STAT_INC(BINARY_SUBSCR, hit);
|
||||||
res = PyDict_GetItemWithError(dict, sub);
|
int rc = PyDict_GetItemRef(dict, sub, &res);
|
||||||
if (res == NULL) {
|
if (rc == 0) {
|
||||||
if (!_PyErr_Occurred(tstate)) {
|
_PyErr_SetKeyError(sub);
|
||||||
_PyErr_SetKeyError(sub);
|
|
||||||
}
|
|
||||||
Py_DECREF(dict);
|
|
||||||
Py_DECREF(sub);
|
|
||||||
if (true) goto pop_2_error;
|
|
||||||
}
|
}
|
||||||
Py_INCREF(res); // Do this before DECREF'ing dict, sub
|
|
||||||
Py_DECREF(dict);
|
Py_DECREF(dict);
|
||||||
Py_DECREF(sub);
|
Py_DECREF(sub);
|
||||||
|
if (rc <= 0) goto pop_2_error;
|
||||||
STACK_SHRINK(1);
|
STACK_SHRINK(1);
|
||||||
stack_pointer[-1] = res;
|
stack_pointer[-1] = res;
|
||||||
DISPATCH();
|
DISPATCH();
|
||||||
|
@ -1950,14 +1945,10 @@
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
if (v == NULL) {
|
if (v == NULL) {
|
||||||
v = PyDict_GetItemWithError(GLOBALS(), name);
|
if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
|
||||||
if (v != NULL) {
|
|
||||||
Py_INCREF(v);
|
|
||||||
}
|
|
||||||
else if (_PyErr_Occurred(tstate)) {
|
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
else {
|
if (v == NULL) {
|
||||||
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
|
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
|
@ -1990,14 +1981,10 @@
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
if (v == NULL) {
|
if (v == NULL) {
|
||||||
v = PyDict_GetItemWithError(GLOBALS(), name);
|
if (PyDict_GetItemRef(GLOBALS(), name, &v) < 0) {
|
||||||
if (v != NULL) {
|
|
||||||
Py_INCREF(v);
|
|
||||||
}
|
|
||||||
else if (_PyErr_Occurred(tstate)) {
|
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
else {
|
if (v == NULL) {
|
||||||
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
|
if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) {
|
||||||
GOTO_ERROR(error);
|
GOTO_ERROR(error);
|
||||||
}
|
}
|
||||||
|
@ -2422,34 +2409,17 @@
|
||||||
if (true) goto error;
|
if (true) goto error;
|
||||||
}
|
}
|
||||||
/* check if __annotations__ in locals()... */
|
/* check if __annotations__ in locals()... */
|
||||||
if (PyDict_CheckExact(LOCALS())) {
|
if (PyMapping_GetOptionalItem(LOCALS(), &_Py_ID(__annotations__), &ann_dict) < 0) goto error;
|
||||||
ann_dict = _PyDict_GetItemWithError(LOCALS(),
|
if (ann_dict == NULL) {
|
||||||
&_Py_ID(__annotations__));
|
ann_dict = PyDict_New();
|
||||||
if (ann_dict == NULL) {
|
if (ann_dict == NULL) goto error;
|
||||||
if (_PyErr_Occurred(tstate)) goto error;
|
err = PyObject_SetItem(LOCALS(), &_Py_ID(__annotations__),
|
||||||
/* ...if not, create a new one */
|
ann_dict);
|
||||||
ann_dict = PyDict_New();
|
Py_DECREF(ann_dict);
|
||||||
if (ann_dict == NULL) goto error;
|
if (err) goto error;
|
||||||
err = PyDict_SetItem(LOCALS(), &_Py_ID(__annotations__),
|
|
||||||
ann_dict);
|
|
||||||
Py_DECREF(ann_dict);
|
|
||||||
if (err) goto error;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* do the same if locals() is not a dict */
|
Py_DECREF(ann_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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
DISPATCH();
|
DISPATCH();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue