| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -859,41 +859,31 @@ dummy_func( | |||
| 859 | 859 | } | |
| 860 | 860 | } | |
| 861 | 861 | ||
| 862 | - // stack effect: (__0 -- __array[oparg]) | ||
| 863 | - inst(UNPACK_SEQUENCE) { | ||
| 862 | + inst(UNPACK_SEQUENCE, (unused/1, seq -- unused[oparg])) { | ||
| 864 | 863 | #if ENABLE_SPECIALIZATION | |
| 865 | 864 | _PyUnpackSequenceCache *cache = (_PyUnpackSequenceCache *)next_instr; | |
| 866 | 865 | if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { | |
| 867 | 866 | assert(cframe.use_tracing == 0); | |
| 868 | - PyObject *seq = TOP(); | ||
| 869 | 867 | next_instr--; | |
| 870 | 868 | _Py_Specialize_UnpackSequence(seq, next_instr, oparg); | |
| 871 | 869 | DISPATCH_SAME_OPARG(); | |
| 872 | 870 | } | |
| 873 | 871 | STAT_INC(UNPACK_SEQUENCE, deferred); | |
| 874 | 872 | DECREMENT_ADAPTIVE_COUNTER(cache->counter); | |
| 875 | 873 | #endif /* ENABLE_SPECIALIZATION */ | |
| 876 | - PyObject *seq = POP(); | ||
| 877 | - PyObject **top = stack_pointer + oparg; | ||
| 878 | - if (!unpack_iterable(tstate, seq, oparg, -1, top)) { | ||
| 879 | - Py_DECREF(seq); | ||
| 880 | - goto error; | ||
| 881 | - } | ||
| 882 | - STACK_GROW(oparg); | ||
| 874 | + PyObject **top = stack_pointer + oparg - 1; | ||
| 875 | + int res = unpack_iterable(tstate, seq, oparg, -1, top); | ||
| 883 | 876 | Py_DECREF(seq); | |
| 884 | - JUMPBY(INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE); | ||
| 877 | + ERROR_IF(res == 0, error); | ||
| 885 | 878 | } | |
| 886 | 879 | ||
| 887 | - // stack effect: (__0 -- __array[oparg]) | ||
| 888 | - inst(UNPACK_SEQUENCE_TWO_TUPLE) { | ||
| 889 | - PyObject *seq = TOP(); | ||
| 880 | + inst(UNPACK_SEQUENCE_TWO_TUPLE, (unused/1, seq -- v1, v0)) { | ||
| 890 | 881 | DEOPT_IF(!PyTuple_CheckExact(seq), UNPACK_SEQUENCE); | |
| 891 | 882 | DEOPT_IF(PyTuple_GET_SIZE(seq) != 2, UNPACK_SEQUENCE); | |
| 892 | 883 | STAT_INC(UNPACK_SEQUENCE, hit); | |
| 893 | - SET_TOP(Py_NewRef(PyTuple_GET_ITEM(seq, 1))); | ||
| 894 | - PUSH(Py_NewRef(PyTuple_GET_ITEM(seq, 0))); | ||
| 884 | + v1 = Py_NewRef(PyTuple_GET_ITEM(seq, 1)); | ||
| 885 | + v0 = Py_NewRef(PyTuple_GET_ITEM(seq, 0)); | ||
| 895 | 886 | Py_DECREF(seq); | |
| 896 | - JUMPBY(INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE); | ||
| 897 | 887 | } | |
| 898 | 888 | ||
| 899 | 889 | // stack effect: (__0 -- __array[oparg]) | |
@@ -926,17 +916,12 @@ dummy_func( | |||
| 926 | 916 | JUMPBY(INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE); | |
| 927 | 917 | } | |
| 928 | 918 | ||
| 929 | - // error: UNPACK_EX has irregular stack effect | ||
| 930 | - inst(UNPACK_EX) { | ||
| 919 | + inst(UNPACK_EX, (seq -- unused[oparg & 0xFF], unused, unused[oparg >> 8])) { | ||
| 931 | 920 | int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); | |
| 932 | - PyObject *seq = POP(); | ||
| 933 | - PyObject **top = stack_pointer + totalargs; | ||
| 934 | - if (!unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8, top)) { | ||
| 935 | - Py_DECREF(seq); | ||
| 936 | - goto error; | ||
| 937 | - } | ||
| 938 | - STACK_GROW(totalargs); | ||
| 921 | + PyObject **top = stack_pointer + totalargs - 1; | ||
| 922 | + int res = unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8, top); | ||
| 939 | 923 | Py_DECREF(seq); | |
| 924 | + ERROR_IF(res == 0, error); | ||
| 940 | 925 | } | |
| 941 | 926 | ||
| 942 | 927 | family(store_attr, INLINE_CACHE_ENTRIES_STORE_ATTR) = { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -121,15 +121,15 @@ _PyOpcode_num_popped(int opcode, int oparg, bool jump) { | |||
| 121 | 121 | case DELETE_NAME: | |
| 122 | 122 | return 0; | |
| 123 | 123 | case UNPACK_SEQUENCE: | |
| 124 | - return -1; | ||
| 124 | + return 1; | ||
| 125 | 125 | case UNPACK_SEQUENCE_TWO_TUPLE: | |
| 126 | - return -1; | ||
| 126 | + return 1; | ||
| 127 | 127 | case UNPACK_SEQUENCE_TUPLE: | |
| 128 | 128 | return -1; | |
| 129 | 129 | case UNPACK_SEQUENCE_LIST: | |
| 130 | 130 | return -1; | |
| 131 | 131 | case UNPACK_EX: | |
| 132 | - return -1; | ||
| 132 | + return 1; | ||
| 133 | 133 | case STORE_ATTR: | |
| 134 | 134 | return 2; | |
| 135 | 135 | case DELETE_ATTR: | |
@@ -467,15 +467,15 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { | |||
| 467 | 467 | case DELETE_NAME: | |
| 468 | 468 | return 0; | |
| 469 | 469 | case UNPACK_SEQUENCE: | |
| 470 | - return -1; | ||
| 470 | + return oparg; | ||
| 471 | 471 | case UNPACK_SEQUENCE_TWO_TUPLE: | |
| 472 | - return -1; | ||
| 472 | + return 2; | ||
| 473 | 473 | case UNPACK_SEQUENCE_TUPLE: | |
| 474 | 474 | return -1; | |
| 475 | 475 | case UNPACK_SEQUENCE_LIST: | |
| 476 | 476 | return -1; | |
| 477 | 477 | case UNPACK_EX: | |
| 478 | - return -1; | ||
| 478 | + return (oparg & 0xFF) + (oparg >> 8) + 1; | ||
| 479 | 479 | case STORE_ATTR: | |
| 480 | 480 | return 0; | |
| 481 | 481 | case DELETE_ATTR: | |
@@ -759,8 +759,8 @@ struct opcode_metadata { | |||
| 759 | 759 | [LOAD_BUILD_CLASS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX }, | |
| 760 | 760 | [STORE_NAME] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB }, | |
| 761 | 761 | [DELETE_NAME] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB }, | |
| 762 | - [UNPACK_SEQUENCE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB }, | ||
| 763 | - [UNPACK_SEQUENCE_TWO_TUPLE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX }, | ||
| 762 | + [UNPACK_SEQUENCE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC }, | ||
| 763 | + [UNPACK_SEQUENCE_TWO_TUPLE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IXC }, | ||
| 764 | 764 | [UNPACK_SEQUENCE_TUPLE] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB }, | |
| 765 | 765 | [UNPACK_SEQUENCE_LIST] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB }, | |
| 766 | 766 | [UNPACK_EX] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB }, | |
| Back | FazBrowse Home | New Git URL |
0 commit comments