aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Python/wordcode_helpers.h
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/tools/python3/src/Python/wordcode_helpers.h
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/tools/python3/src/Python/wordcode_helpers.h')
-rw-r--r--contrib/tools/python3/src/Python/wordcode_helpers.h44
1 files changed, 44 insertions, 0 deletions
diff --git a/contrib/tools/python3/src/Python/wordcode_helpers.h b/contrib/tools/python3/src/Python/wordcode_helpers.h
new file mode 100644
index 0000000000..c8f7a0f41f
--- /dev/null
+++ b/contrib/tools/python3/src/Python/wordcode_helpers.h
@@ -0,0 +1,44 @@
+/* This file contains code shared by the compiler and the peephole
+ optimizer.
+ */
+
+#ifdef WORDS_BIGENDIAN
+# define PACKOPARG(opcode, oparg) ((_Py_CODEUNIT)(((opcode) << 8) | (oparg)))
+#else
+# define PACKOPARG(opcode, oparg) ((_Py_CODEUNIT)(((oparg) << 8) | (opcode)))
+#endif
+
+/* Minimum number of code units necessary to encode instruction with
+ EXTENDED_ARGs */
+static int
+instrsize(unsigned int oparg)
+{
+ return oparg <= 0xff ? 1 :
+ oparg <= 0xffff ? 2 :
+ oparg <= 0xffffff ? 3 :
+ 4;
+}
+
+/* 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(_Py_CODEUNIT *codestr, unsigned char opcode,
+ unsigned int oparg, int ilen)
+{
+ switch (ilen) {
+ case 4:
+ *codestr++ = PACKOPARG(EXTENDED_ARG, (oparg >> 24) & 0xff);
+ /* fall through */
+ case 3:
+ *codestr++ = PACKOPARG(EXTENDED_ARG, (oparg >> 16) & 0xff);
+ /* fall through */
+ case 2:
+ *codestr++ = PACKOPARG(EXTENDED_ARG, (oparg >> 8) & 0xff);
+ /* fall through */
+ case 1:
+ *codestr++ = PACKOPARG(opcode, oparg & 0xff);
+ break;
+ default:
+ Py_UNREACHABLE();
+ }
+}