aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bytecode.c')
-rw-r--r--src/bytecode.c16
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) \
267DEFINE (Bstack_set2, 0263) \ 267DEFINE (Bstack_set2, 0263) \
268DEFINE (BdiscardN, 0266) \ 268DEFINE (BdiscardN, 0266) \
269 \ 269 \
270DEFINE (Bswitch, 0267) \
271 \
270DEFINE (Bconstant, 0300) 272DEFINE (Bconstant, 0300)
271 273
272enum byte_code_op 274enum byte_code_op
@@ -1411,6 +1413,20 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1411 DISCARD (op); 1413 DISCARD (op);
1412 NEXT; 1414 NEXT;
1413 1415
1416 CASE (Bswitch):
1417 {
1418 Lisp_Object jmp_table = POP;
1419 Lisp_Object v1 = POP;
1420 Lisp_Object dest = Fgethash(v1, jmp_table, Qnil);
1421 if (!NILP(dest)) {
1422 int car = XINT(XCAR(dest));
1423 int cdr = XINT(XCDR(dest));
1424 op = car + (cdr << 8); /* Simulate FETCH2 */
1425 goto op_branch;
1426 }
1427 }
1428 NEXT;
1429
1414 CASE_DEFAULT 1430 CASE_DEFAULT
1415 CASE (Bconstant): 1431 CASE (Bconstant):
1416 if (BYTE_CODE_SAFE 1432 if (BYTE_CODE_SAFE