diff options
Diffstat (limited to 'src/bytecode.c')
| -rw-r--r-- | src/bytecode.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index d887668dd39..01ae8055ebf 100644 --- a/src/bytecode.c +++ b/src/bytecode.c | |||
| @@ -425,7 +425,7 @@ according to which any remaining arguments are pushed on the stack | |||
| 425 | before executing BYTESTR. | 425 | before executing BYTESTR. |
| 426 | 426 | ||
| 427 | usage: (byte-code BYTESTR VECTOR MAXDEP &optional ARGS-TEMPLATE &rest ARGS) */) | 427 | usage: (byte-code BYTESTR VECTOR MAXDEP &optional ARGS-TEMPLATE &rest ARGS) */) |
| 428 | (int nargs, Lisp_Object *args) | 428 | (size_t nargs, Lisp_Object *args) |
| 429 | { | 429 | { |
| 430 | Lisp_Object args_tmpl = nargs >= 4 ? args[3] : Qnil; | 430 | Lisp_Object args_tmpl = nargs >= 4 ? args[3] : Qnil; |
| 431 | int pnargs = nargs >= 4 ? nargs - 4 : 0; | 431 | int pnargs = nargs >= 4 ? nargs - 4 : 0; |
| @@ -631,7 +631,16 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 631 | { | 631 | { |
| 632 | Lisp_Object v1; | 632 | Lisp_Object v1; |
| 633 | v1 = TOP; | 633 | v1 = TOP; |
| 634 | TOP = CAR (v1); | 634 | if (CONSP (v1)) |
| 635 | TOP = XCAR (v1); | ||
| 636 | else if (NILP (v1)) | ||
| 637 | TOP = Qnil; | ||
| 638 | else | ||
| 639 | { | ||
| 640 | BEFORE_POTENTIAL_GC (); | ||
| 641 | wrong_type_argument (Qlistp, v1); | ||
| 642 | AFTER_POTENTIAL_GC (); | ||
| 643 | } | ||
| 635 | break; | 644 | break; |
| 636 | } | 645 | } |
| 637 | 646 | ||
| @@ -657,7 +666,17 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 657 | { | 666 | { |
| 658 | Lisp_Object v1; | 667 | Lisp_Object v1; |
| 659 | v1 = TOP; | 668 | v1 = TOP; |
| 660 | TOP = CDR (v1); | 669 | if (CONSP (v1)) |
| 670 | TOP = XCDR (v1); | ||
| 671 | else if (NILP (v1)) | ||
| 672 | TOP = Qnil; | ||
| 673 | else | ||
| 674 | { | ||
| 675 | BEFORE_POTENTIAL_GC (); | ||
| 676 | wrong_type_argument (Qlistp, v1); | ||
| 677 | AFTER_POTENTIAL_GC (); | ||
| 678 | } | ||
| 679 | break; | ||
| 661 | break; | 680 | break; |
| 662 | } | 681 | } |
| 663 | 682 | ||
| @@ -994,13 +1013,13 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 994 | v1 = POP; | 1013 | v1 = POP; |
| 995 | v2 = TOP; | 1014 | v2 = TOP; |
| 996 | CHECK_NUMBER (v2); | 1015 | CHECK_NUMBER (v2); |
| 997 | AFTER_POTENTIAL_GC (); | ||
| 998 | op = XINT (v2); | 1016 | op = XINT (v2); |
| 999 | immediate_quit = 1; | 1017 | immediate_quit = 1; |
| 1000 | while (--op >= 0 && CONSP (v1)) | 1018 | while (--op >= 0 && CONSP (v1)) |
| 1001 | v1 = XCDR (v1); | 1019 | v1 = XCDR (v1); |
| 1002 | immediate_quit = 0; | 1020 | immediate_quit = 0; |
| 1003 | TOP = CAR (v1); | 1021 | TOP = CAR (v1); |
| 1022 | AFTER_POTENTIAL_GC (); | ||
| 1004 | break; | 1023 | break; |
| 1005 | } | 1024 | } |
| 1006 | 1025 | ||