summaryrefslogtreecommitdiff
path: root/Python/wordcode_helpers.h
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2016-05-26 22:56:51 -0700
committerBenjamin Peterson <benjamin@python.org>2016-05-26 22:56:51 -0700
commitf701975a05ebda1c87ee2d078d2917676dc0de8b (patch)
tree862aecee76f5699e7d5b47b02389c3d9824b1f91 /Python/wordcode_helpers.h
parent4d34b84dfcd51bf1d018cd301943433e6a1dff33 (diff)
parentb71ef42e94fb122b4321d4c8fae7b7c41cbd65b3 (diff)
downloadcpython-f701975a05ebda1c87ee2d078d2917676dc0de8b.tar.gz
merge 3.5
Diffstat (limited to 'Python/wordcode_helpers.h')
-rw-r--r--Python/wordcode_helpers.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/Python/wordcode_helpers.h b/Python/wordcode_helpers.h
new file mode 100644
index 0000000000..b61ba33d8f
--- /dev/null
+++ b/Python/wordcode_helpers.h
@@ -0,0 +1,38 @@
+/* This file contains code shared by the compiler and the peephole
+ optimizer.
+ */
+
+/* Minimum number of bytes necessary to encode instruction with EXTENDED_ARGs */
+static int
+instrsize(unsigned int oparg)
+{
+ return oparg <= 0xff ? 2 :
+ oparg <= 0xffff ? 4 :
+ oparg <= 0xffffff ? 6 :
+ 8;
+}
+
+/* Spits out op/oparg pair using ilen bytes. codestr should be pointed at the
+ desired location of the first EXTENDED_ARG */
+static void
+write_op_arg(unsigned char *codestr, unsigned char opcode,
+ unsigned int oparg, int ilen)
+{
+ switch (ilen) {
+ case 8:
+ *codestr++ = EXTENDED_ARG;
+ *codestr++ = (oparg >> 24) & 0xff;
+ case 6:
+ *codestr++ = EXTENDED_ARG;
+ *codestr++ = (oparg >> 16) & 0xff;
+ case 4:
+ *codestr++ = EXTENDED_ARG;
+ *codestr++ = (oparg >> 8) & 0xff;
+ case 2:
+ *codestr++ = opcode;
+ *codestr++ = oparg & 0xff;
+ break;
+ default:
+ assert(0);
+ }
+}