diff options
Diffstat (limited to 'src/bytecode.c')
-rw-r--r-- | src/bytecode.c | 21 |
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 |