mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
GH-105678: Split MAKE_FUNCTION into MAKE_FUNCTION and SET_FUNCTION_ATTRIBUTE (GH-105680)
This commit is contained in:
parent
217589d4f3
commit
09ffa69e2e
12 changed files with 480 additions and 430 deletions
|
@ -83,15 +83,14 @@ dummy_func(
|
|||
// Dummy labels.
|
||||
pop_1_error:
|
||||
// Dummy locals.
|
||||
PyObject *annotations;
|
||||
PyObject *dummy;
|
||||
PyObject *attr;
|
||||
PyObject *attrs;
|
||||
PyObject *bottom;
|
||||
PyObject *callable;
|
||||
PyObject *callargs;
|
||||
PyObject *closure;
|
||||
PyObject *codeobj;
|
||||
PyObject *cond;
|
||||
PyObject *defaults;
|
||||
PyObject *descr;
|
||||
_PyInterpreterFrame entry_frame;
|
||||
PyObject *exc;
|
||||
|
@ -3297,11 +3296,7 @@ dummy_func(
|
|||
CHECK_EVAL_BREAKER();
|
||||
}
|
||||
|
||||
inst(MAKE_FUNCTION, (defaults if (oparg & MAKE_FUNCTION_DEFAULTS),
|
||||
kwdefaults if (oparg & MAKE_FUNCTION_KWDEFAULTS),
|
||||
annotations if (oparg & MAKE_FUNCTION_ANNOTATIONS),
|
||||
closure if (oparg & MAKE_FUNCTION_CLOSURE),
|
||||
codeobj -- func)) {
|
||||
inst(MAKE_FUNCTION, (codeobj -- func)) {
|
||||
|
||||
PyFunctionObject *func_obj = (PyFunctionObject *)
|
||||
PyFunction_New(codeobj, GLOBALS());
|
||||
|
@ -3311,27 +3306,37 @@ dummy_func(
|
|||
goto error;
|
||||
}
|
||||
|
||||
if (oparg & MAKE_FUNCTION_CLOSURE) {
|
||||
assert(PyTuple_CheckExact(closure));
|
||||
func_obj->func_closure = closure;
|
||||
}
|
||||
if (oparg & MAKE_FUNCTION_ANNOTATIONS) {
|
||||
assert(PyTuple_CheckExact(annotations));
|
||||
func_obj->func_annotations = annotations;
|
||||
}
|
||||
if (oparg & MAKE_FUNCTION_KWDEFAULTS) {
|
||||
assert(PyDict_CheckExact(kwdefaults));
|
||||
func_obj->func_kwdefaults = kwdefaults;
|
||||
}
|
||||
if (oparg & MAKE_FUNCTION_DEFAULTS) {
|
||||
assert(PyTuple_CheckExact(defaults));
|
||||
func_obj->func_defaults = defaults;
|
||||
}
|
||||
|
||||
func_obj->func_version = ((PyCodeObject *)codeobj)->co_version;
|
||||
func = (PyObject *)func_obj;
|
||||
}
|
||||
|
||||
inst(SET_FUNCTION_ATTRIBUTE, (attr, func -- func)) {
|
||||
assert(PyFunction_Check(func));
|
||||
PyFunctionObject *func_obj = (PyFunctionObject *)func;
|
||||
switch(oparg) {
|
||||
case MAKE_FUNCTION_CLOSURE:
|
||||
assert(func_obj->func_closure == NULL);
|
||||
func_obj->func_closure = attr;
|
||||
break;
|
||||
case MAKE_FUNCTION_ANNOTATIONS:
|
||||
assert(func_obj->func_annotations == NULL);
|
||||
func_obj->func_annotations = attr;
|
||||
break;
|
||||
case MAKE_FUNCTION_KWDEFAULTS:
|
||||
assert(PyDict_CheckExact(attr));
|
||||
assert(func_obj->func_kwdefaults == NULL);
|
||||
func_obj->func_kwdefaults = attr;
|
||||
break;
|
||||
case MAKE_FUNCTION_DEFAULTS:
|
||||
assert(PyTuple_CheckExact(attr));
|
||||
assert(func_obj->func_defaults == NULL);
|
||||
func_obj->func_defaults = attr;
|
||||
break;
|
||||
default:
|
||||
Py_UNREACHABLE();
|
||||
}
|
||||
}
|
||||
|
||||
inst(RETURN_GENERATOR, (--)) {
|
||||
assert(PyFunction_Check(frame->f_funcobj));
|
||||
PyFunctionObject *func = (PyFunctionObject *)frame->f_funcobj;
|
||||
|
|
|
@ -1823,7 +1823,21 @@ compiler_make_closure(struct compiler *c, location loc,
|
|||
ADDOP_I(c, loc, BUILD_TUPLE, co->co_nfreevars);
|
||||
}
|
||||
ADDOP_LOAD_CONST(c, loc, (PyObject*)co);
|
||||
ADDOP_I(c, loc, MAKE_FUNCTION, flags);
|
||||
|
||||
ADDOP(c, loc, MAKE_FUNCTION);
|
||||
|
||||
if (flags & MAKE_FUNCTION_CLOSURE) {
|
||||
ADDOP_I(c, loc, SET_FUNCTION_ATTRIBUTE, MAKE_FUNCTION_CLOSURE);
|
||||
}
|
||||
if (flags & MAKE_FUNCTION_ANNOTATIONS) {
|
||||
ADDOP_I(c, loc, SET_FUNCTION_ATTRIBUTE, MAKE_FUNCTION_ANNOTATIONS);
|
||||
}
|
||||
if (flags & MAKE_FUNCTION_KWDEFAULTS) {
|
||||
ADDOP_I(c, loc, SET_FUNCTION_ATTRIBUTE, MAKE_FUNCTION_KWDEFAULTS);
|
||||
}
|
||||
if (flags & MAKE_FUNCTION_DEFAULTS) {
|
||||
ADDOP_I(c, loc, SET_FUNCTION_ATTRIBUTE, MAKE_FUNCTION_DEFAULTS);
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
600
Python/generated_cases.c.h
generated
600
Python/generated_cases.c.h
generated
File diff suppressed because it is too large
Load diff
|
@ -395,7 +395,9 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) {
|
|||
case CALL_FUNCTION_EX:
|
||||
return ((oparg & 1) ? 1 : 0) + 3;
|
||||
case MAKE_FUNCTION:
|
||||
return ((oparg & MAKE_FUNCTION_DEFAULTS) ? 1 : 0) + ((oparg & MAKE_FUNCTION_KWDEFAULTS) ? 1 : 0) + ((oparg & MAKE_FUNCTION_ANNOTATIONS) ? 1 : 0) + ((oparg & MAKE_FUNCTION_CLOSURE) ? 1 : 0) + 1;
|
||||
return 1;
|
||||
case SET_FUNCTION_ATTRIBUTE:
|
||||
return 2;
|
||||
case RETURN_GENERATOR:
|
||||
return 0;
|
||||
case BUILD_SLICE:
|
||||
|
@ -812,6 +814,8 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) {
|
|||
return 1;
|
||||
case MAKE_FUNCTION:
|
||||
return 1;
|
||||
case SET_FUNCTION_ATTRIBUTE:
|
||||
return 1;
|
||||
case RETURN_GENERATOR:
|
||||
return 0;
|
||||
case BUILD_SLICE:
|
||||
|
@ -1049,7 +1053,8 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[512] = {
|
|||
[CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = { true, INSTR_FMT_IBC00 },
|
||||
[INSTRUMENTED_CALL_FUNCTION_EX] = { true, INSTR_FMT_IX },
|
||||
[CALL_FUNCTION_EX] = { true, INSTR_FMT_IB },
|
||||
[MAKE_FUNCTION] = { true, INSTR_FMT_IB },
|
||||
[MAKE_FUNCTION] = { true, INSTR_FMT_IX },
|
||||
[SET_FUNCTION_ATTRIBUTE] = { true, INSTR_FMT_IB },
|
||||
[RETURN_GENERATOR] = { true, INSTR_FMT_IX },
|
||||
[BUILD_SLICE] = { true, INSTR_FMT_IB },
|
||||
[FORMAT_VALUE] = { true, INSTR_FMT_IB },
|
||||
|
|
30
Python/opcode_targets.h
generated
30
Python/opcode_targets.h
generated
|
@ -23,20 +23,21 @@ static void *opcode_targets[256] = {
|
|||
&&TARGET_BINARY_SUBSCR_LIST_INT,
|
||||
&&TARGET_BINARY_SUBSCR_TUPLE_INT,
|
||||
&&TARGET_CALL_PY_EXACT_ARGS,
|
||||
&&TARGET_CALL_PY_WITH_DEFAULTS,
|
||||
&&TARGET_MAKE_FUNCTION,
|
||||
&&TARGET_BINARY_SUBSCR,
|
||||
&&TARGET_BINARY_SLICE,
|
||||
&&TARGET_STORE_SLICE,
|
||||
&&TARGET_CALL_PY_WITH_DEFAULTS,
|
||||
&&TARGET_CALL_BOUND_METHOD_EXACT_ARGS,
|
||||
&&TARGET_CALL_BUILTIN_CLASS,
|
||||
&&TARGET_GET_LEN,
|
||||
&&TARGET_MATCH_MAPPING,
|
||||
&&TARGET_MATCH_SEQUENCE,
|
||||
&&TARGET_MATCH_KEYS,
|
||||
&&TARGET_CALL_BUILTIN_FAST_WITH_KEYWORDS,
|
||||
&&TARGET_CALL_BUILTIN_CLASS,
|
||||
&&TARGET_PUSH_EXC_INFO,
|
||||
&&TARGET_CHECK_EXC_MATCH,
|
||||
&&TARGET_CHECK_EG_MATCH,
|
||||
&&TARGET_CALL_BUILTIN_FAST_WITH_KEYWORDS,
|
||||
&&TARGET_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS,
|
||||
&&TARGET_CALL_NO_KW_BUILTIN_FAST,
|
||||
&&TARGET_CALL_NO_KW_BUILTIN_O,
|
||||
|
@ -47,7 +48,6 @@ static void *opcode_targets[256] = {
|
|||
&&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS,
|
||||
&&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_O,
|
||||
&&TARGET_CALL_NO_KW_STR_1,
|
||||
&&TARGET_CALL_NO_KW_TUPLE_1,
|
||||
&&TARGET_WITH_EXCEPT_START,
|
||||
&&TARGET_GET_AITER,
|
||||
&&TARGET_GET_ANEXT,
|
||||
|
@ -55,39 +55,39 @@ static void *opcode_targets[256] = {
|
|||
&&TARGET_BEFORE_WITH,
|
||||
&&TARGET_END_ASYNC_FOR,
|
||||
&&TARGET_CLEANUP_THROW,
|
||||
&&TARGET_CALL_NO_KW_TUPLE_1,
|
||||
&&TARGET_CALL_NO_KW_TYPE_1,
|
||||
&&TARGET_COMPARE_OP_FLOAT,
|
||||
&&TARGET_COMPARE_OP_INT,
|
||||
&&TARGET_COMPARE_OP_STR,
|
||||
&&TARGET_STORE_SUBSCR,
|
||||
&&TARGET_DELETE_SUBSCR,
|
||||
&&TARGET_COMPARE_OP_STR,
|
||||
&&TARGET_FOR_ITER_LIST,
|
||||
&&TARGET_FOR_ITER_TUPLE,
|
||||
&&TARGET_FOR_ITER_RANGE,
|
||||
&&TARGET_FOR_ITER_GEN,
|
||||
&&TARGET_LOAD_SUPER_ATTR_ATTR,
|
||||
&&TARGET_LOAD_SUPER_ATTR_METHOD,
|
||||
&&TARGET_GET_ITER,
|
||||
&&TARGET_GET_YIELD_FROM_ITER,
|
||||
&&TARGET_LOAD_ATTR_CLASS,
|
||||
&&TARGET_LOAD_SUPER_ATTR_METHOD,
|
||||
&&TARGET_LOAD_BUILD_CLASS,
|
||||
&&TARGET_LOAD_ATTR_CLASS,
|
||||
&&TARGET_LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN,
|
||||
&&TARGET_LOAD_ATTR_INSTANCE_VALUE,
|
||||
&&TARGET_LOAD_ASSERTION_ERROR,
|
||||
&&TARGET_RETURN_GENERATOR,
|
||||
&&TARGET_LOAD_ATTR_INSTANCE_VALUE,
|
||||
&&TARGET_LOAD_ATTR_MODULE,
|
||||
&&TARGET_LOAD_ATTR_PROPERTY,
|
||||
&&TARGET_LOAD_ATTR_SLOT,
|
||||
&&TARGET_LOAD_ATTR_WITH_HINT,
|
||||
&&TARGET_LOAD_ATTR_METHOD_LAZY_DICT,
|
||||
&&TARGET_LOAD_ATTR_METHOD_NO_DICT,
|
||||
&&TARGET_LOAD_ATTR_METHOD_WITH_VALUES,
|
||||
&&TARGET_RETURN_VALUE,
|
||||
&&TARGET_LOAD_GLOBAL_BUILTIN,
|
||||
&&TARGET_LOAD_ATTR_METHOD_WITH_VALUES,
|
||||
&&TARGET_SETUP_ANNOTATIONS,
|
||||
&&TARGET_LOAD_GLOBAL_MODULE,
|
||||
&&TARGET_LOAD_GLOBAL_BUILTIN,
|
||||
&&TARGET_LOAD_LOCALS,
|
||||
&&TARGET_STORE_ATTR_INSTANCE_VALUE,
|
||||
&&TARGET_LOAD_GLOBAL_MODULE,
|
||||
&&TARGET_POP_EXCEPT,
|
||||
&&TARGET_STORE_NAME,
|
||||
&&TARGET_DELETE_NAME,
|
||||
|
@ -110,9 +110,9 @@ static void *opcode_targets[256] = {
|
|||
&&TARGET_IMPORT_NAME,
|
||||
&&TARGET_IMPORT_FROM,
|
||||
&&TARGET_JUMP_FORWARD,
|
||||
&&TARGET_STORE_ATTR_INSTANCE_VALUE,
|
||||
&&TARGET_STORE_ATTR_SLOT,
|
||||
&&TARGET_STORE_ATTR_WITH_HINT,
|
||||
&&TARGET_STORE_SUBSCR_DICT,
|
||||
&&TARGET_POP_JUMP_IF_FALSE,
|
||||
&&TARGET_POP_JUMP_IF_TRUE,
|
||||
&&TARGET_LOAD_GLOBAL,
|
||||
|
@ -131,7 +131,7 @@ static void *opcode_targets[256] = {
|
|||
&&TARGET_POP_JUMP_IF_NONE,
|
||||
&&TARGET_RAISE_VARARGS,
|
||||
&&TARGET_GET_AWAITABLE,
|
||||
&&TARGET_MAKE_FUNCTION,
|
||||
&&TARGET_STORE_SUBSCR_DICT,
|
||||
&&TARGET_BUILD_SLICE,
|
||||
&&TARGET_JUMP_BACKWARD_NO_INTERRUPT,
|
||||
&&TARGET_MAKE_CELL,
|
||||
|
@ -176,7 +176,7 @@ static void *opcode_targets[256] = {
|
|||
&&TARGET_CALL_INTRINSIC_2,
|
||||
&&TARGET_LOAD_FROM_DICT_OR_GLOBALS,
|
||||
&&TARGET_LOAD_FROM_DICT_OR_DEREF,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_SET_FUNCTION_ATTRIBUTE,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue