summaryrefslogtreecommitdiff
path: root/src/bytecode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bytecode.c')
-rw-r--r--src/bytecode.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index 499fb881e2e..288d78efe41 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -267,6 +267,8 @@ DEFINE (Bstack_set, 0262) \
DEFINE (Bstack_set2, 0263) \
DEFINE (BdiscardN, 0266) \
\
+DEFINE (Bswitch, 0267) \
+ \
DEFINE (Bconstant, 0300)
enum byte_code_op
@@ -1411,6 +1413,25 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
DISCARD (op);
NEXT;
+ CASE (Bswitch):
+ {
+ Lisp_Object jmp_table = POP;
+ Lisp_Object v1 = POP;
+#ifdef BYTE_CODE_SAFE
+ CHECK_TYPE (HASH_TABLE_P (jmp_table), Qhash_table_p, jmp_table);
+#endif
+ struct Lisp_Hash_Table *h = XHASH_TABLE(jmp_table);
+ ptrdiff_t i = hash_lookup(h, v1, NULL);
+ if (i >= 0) {
+ Lisp_Object dest = HASH_VALUE(h, i);
+ int car = XINT(XCAR(dest));
+ int cdr = XINT(XCDR(dest));
+ op = car + (cdr << 8); /* Simulate FETCH2 */
+ goto op_branch;
+ }
+ }
+ NEXT;
+
CASE_DEFAULT
CASE (Bconstant):
if (BYTE_CODE_SAFE