diff options
Diffstat (limited to 'src/bytecode.c')
-rw-r--r-- | src/bytecode.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index a64bc171d14..1695af9cb02 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,20 @@ 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; + Lisp_Object dest = Fgethash(v1, jmp_table, Qnil); + if (!NILP(dest)) { + 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 |