]> granicus.if.org Git - python/commitdiff
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
authorAntoine Pitrou <solipsis@pitrou.net>
Sat, 4 Sep 2010 18:43:52 +0000 (18:43 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Sat, 4 Sep 2010 18:43:52 +0000 (18:43 +0000)
by the new (and simpler) DUP_TOP_TWO.  Performance isn't changed, but
our bytecode is a bit simplified.  Patch by Demur Rumed.

Doc/library/dis.rst
Include/opcode.h
Lib/opcode.py
Misc/ACKS
Misc/NEWS
Python/ceval.c
Python/compile.c
Python/import.c
Python/opcode_targets.h

index e5c1c1a6566a0d379235f45137328bb7d6489d2b..a377fc8394791ad409c4675b972ec1eaae43e2b0 100644 (file)
@@ -184,15 +184,15 @@ The Python compiler currently generates the following bytecode instructions.
    three.
 
 
-.. opcode:: ROT_FOUR
+.. opcode:: DUP_TOP
 
-   Lifts second, third and forth stack item one position up, moves top down to
-   position four.
+   Duplicates the reference on top of the stack.
 
 
-.. opcode:: DUP_TOP
+.. opcode:: DUP_TOP_TWO
 
-   Duplicates the reference on top of the stack.
+   Duplicates the two references on top of the stack, leaving them in the
+   same order.
 
 
 **Unary operations**
@@ -531,12 +531,6 @@ the more significant byte last.
    are put onto the stack right-to-left.
 
 
-.. opcode:: DUP_TOPX (count)
-
-   Duplicate *count* items, keeping them in the same order. Due to implementation
-   limits, *count* should be between 1 and 5 inclusive.
-
-
 .. opcode:: STORE_ATTR (namei)
 
    Implements ``TOS.name = TOS1``, where *namei* is the index of name in
index 7ffa359bca09e39de79b604e486e6bc7de24f775..1114c9386a81283fbdf98204fe47c2e2fde30652 100644 (file)
@@ -12,7 +12,7 @@ extern "C" {
 #define ROT_TWO                2
 #define ROT_THREE      3
 #define DUP_TOP                4
-#define ROT_FOUR       5
+#define DUP_TOP_TWO     5
 #define NOP            9
 
 #define UNARY_POSITIVE 10
@@ -83,7 +83,7 @@ extern "C" {
 #define DELETE_ATTR    96      /* "" */
 #define STORE_GLOBAL   97      /* "" */
 #define DELETE_GLOBAL  98      /* "" */
-#define DUP_TOPX       99      /* number of items to duplicate */
+
 #define LOAD_CONST     100     /* Index in const list */
 #define LOAD_NAME      101     /* Index in name list */
 #define BUILD_TUPLE    102     /* Number of tuple items */
index e8cccc32ea11b1bef70e500178ce0198186205af..9833b6ca64c89df5887d87b4f5b597151d766830 100644 (file)
@@ -48,7 +48,7 @@ def_op('POP_TOP', 1)
 def_op('ROT_TWO', 2)
 def_op('ROT_THREE', 3)
 def_op('DUP_TOP', 4)
-def_op('ROT_FOUR', 5)
+def_op('DUP_TOP_TWO', 5)
 
 def_op('NOP', 9)
 def_op('UNARY_POSITIVE', 10)
@@ -116,7 +116,6 @@ name_op('STORE_ATTR', 95)       # Index in name list
 name_op('DELETE_ATTR', 96)      # ""
 name_op('STORE_GLOBAL', 97)     # ""
 name_op('DELETE_GLOBAL', 98)    # ""
-def_op('DUP_TOPX', 99)          # number of items to duplicate
 def_op('LOAD_CONST', 100)       # Index in const list
 hasconst.append(100)
 name_op('LOAD_NAME', 101)       # Index in name list
index dc0a6346dc0cbf754ef0c0614ee67ad977c56896..2c24d2f060c76af635f951c89f83eae41302d0d1 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -700,6 +700,7 @@ Craig Rowland
 Clinton Roy
 Paul Rubin
 Sam Ruby
+Demur Rumed
 Audun S. Runde
 Rauli Ruohonen
 Jeff Rush
index d7976bc062e72071c8ca79eb568056d5b993d599..77e9dd5a3d559c273392bd02b44ded3e61230fab 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,10 @@ What's New in Python 3.2 Alpha 2?
 Core and Builtins
 -----------------
 
+- Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
+  by the new (and simpler) DUP_TOP_TWO.  Performance isn't changed, but
+  our bytecode is a bit simplified.  Patch by Demur Rumed.
+
 - Issue #9766: Rename poorly named variables exposed by _warnings to prevent
   confusion with the proper variables names from 'warnings' itself.
 
index 4d583a57deec71a6ce4d98e88c7b184512bb6bf0..1f78f95b4996acb687a0690b8fa6eff6f46ead68 100644 (file)
@@ -1420,50 +1420,21 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
             SET_THIRD(v);
             FAST_DISPATCH();
 
-        TARGET(ROT_FOUR)
-            u = TOP();
-            v = SECOND();
-            w = THIRD();
-            x = FOURTH();
-            SET_TOP(v);
-            SET_SECOND(w);
-            SET_THIRD(x);
-            SET_FOURTH(u);
-            FAST_DISPATCH();
-
         TARGET(DUP_TOP)
             v = TOP();
             Py_INCREF(v);
             PUSH(v);
             FAST_DISPATCH();
 
-        TARGET(DUP_TOPX)
-            if (oparg == 2) {
-                x = TOP();
-                Py_INCREF(x);
-                w = SECOND();
-                Py_INCREF(w);
-                STACKADJ(2);
-                SET_TOP(x);
-                SET_SECOND(w);
-                FAST_DISPATCH();
-            } else if (oparg == 3) {
-                x = TOP();
-                Py_INCREF(x);
-                w = SECOND();
-                Py_INCREF(w);
-                v = THIRD();
-                Py_INCREF(v);
-                STACKADJ(3);
-                SET_TOP(x);
-                SET_SECOND(w);
-                SET_THIRD(v);
-                FAST_DISPATCH();
-            }
-            Py_FatalError("invalid argument to DUP_TOPX"
-                          " (bytecode corruption?)");
-            /* Never returns, so don't bother to set why. */
-            break;
+        TARGET(DUP_TOP_TWO)
+            x = TOP();
+            Py_INCREF(x);
+            w = SECOND();
+            Py_INCREF(w);
+            STACKADJ(2);
+            SET_TOP(x);
+            SET_SECOND(w);
+            FAST_DISPATCH();
 
         TARGET(UNARY_POSITIVE)
             v = TOP();
index aae0339c2cf6343504ea4f74e27c3f90992b8acc..6963a151a76b4838a1978fc6b897d6cedd73a590 100644 (file)
@@ -680,8 +680,8 @@ opcode_stack_effect(int opcode, int oparg)
             return 0;
         case DUP_TOP:
             return 1;
-        case ROT_FOUR:
-            return 0;
+        case DUP_TOP_TWO:
+            return 2;
 
         case UNARY_POSITIVE:
         case UNARY_NEGATIVE:
@@ -782,8 +782,6 @@ opcode_stack_effect(int opcode, int oparg)
             return -1;
         case DELETE_GLOBAL:
             return 0;
-        case DUP_TOPX:
-            return oparg;
         case LOAD_CONST:
             return 1;
         case LOAD_NAME:
@@ -3404,7 +3402,7 @@ compiler_handle_subscr(struct compiler *c, const char *kind,
             return 0;
     }
     if (ctx == AugLoad) {
-        ADDOP_I(c, DUP_TOPX, 2);
+        ADDOP(c, DUP_TOP_TWO);
     }
     else if (ctx == AugStore) {
         ADDOP(c, ROT_THREE);
index a5277af938221e6347518853647aaf561729fe71..d6b19e8f97562a0a82095bffdc665860b6836352 100644 (file)
@@ -101,12 +101,14 @@ typedef unsigned short mode_t;
                introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
        Python 3.2a0: 3160 (add SETUP_WITH)
                      tag: cpython-32
+       Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR)
+                     tag: cpython-32
 */
 
 /* If you change MAGIC, you must change TAG and you must insert the old value
    into _PyMagicNumberTags below.
 */
-#define MAGIC (3160 | ((long)'\r'<<16) | ((long)'\n'<<24))
+#define MAGIC (3170 | ((long)'\r'<<16) | ((long)'\n'<<24))
 #define TAG "cpython-32"
 #define CACHEDIR "__pycache__"
 /* Current magic word and string tag as globals. */
index 20c9f258e491fc97432eeb6b4f1492a4a3abe08b..8b59c2db7883c010227b8e1ae99a1e038c2bf475 100644 (file)
@@ -4,7 +4,7 @@ static void *opcode_targets[256] = {
     &&TARGET_ROT_TWO,
     &&TARGET_ROT_THREE,
     &&TARGET_DUP_TOP,
-    &&TARGET_ROT_FOUR,
+    &&TARGET_DUP_TOP_TWO,
     &&_unknown_opcode,
     &&_unknown_opcode,
     &&_unknown_opcode,
@@ -98,7 +98,7 @@ static void *opcode_targets[256] = {
     &&TARGET_DELETE_ATTR,
     &&TARGET_STORE_GLOBAL,
     &&TARGET_DELETE_GLOBAL,
-    &&TARGET_DUP_TOPX,
+    &&_unknown_opcode,
     &&TARGET_LOAD_CONST,
     &&TARGET_LOAD_NAME,
     &&TARGET_BUILD_TUPLE,