diff options
Diffstat (limited to 'src/eval.c')
| -rw-r--r-- | src/eval.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/src/eval.c b/src/eval.c index ac98ca11bd4..d460048e04b 100644 --- a/src/eval.c +++ b/src/eval.c | |||
| @@ -2792,6 +2792,9 @@ funcall_lambda (Lisp_Object fun, ptrdiff_t nargs, | |||
| 2792 | } | 2792 | } |
| 2793 | else if (COMPILEDP (fun)) | 2793 | else if (COMPILEDP (fun)) |
| 2794 | { | 2794 | { |
| 2795 | ptrdiff_t size = ASIZE (fun) & PSEUDOVECTOR_SIZE_MASK; | ||
| 2796 | if (size <= COMPILED_STACK_DEPTH) | ||
| 2797 | xsignal1 (Qinvalid_function, fun); | ||
| 2795 | syms_left = AREF (fun, COMPILED_ARGLIST); | 2798 | syms_left = AREF (fun, COMPILED_ARGLIST); |
| 2796 | if (INTEGERP (syms_left)) | 2799 | if (INTEGERP (syms_left)) |
| 2797 | /* A byte-code object with a non-nil `push args' slot means we | 2800 | /* A byte-code object with a non-nil `push args' slot means we |
| @@ -2889,19 +2892,25 @@ DEFUN ("fetch-bytecode", Ffetch_bytecode, Sfetch_bytecode, | |||
| 2889 | { | 2892 | { |
| 2890 | Lisp_Object tem; | 2893 | Lisp_Object tem; |
| 2891 | 2894 | ||
| 2892 | if (COMPILEDP (object) && CONSP (AREF (object, COMPILED_BYTECODE))) | 2895 | if (COMPILEDP (object)) |
| 2893 | { | 2896 | { |
| 2894 | tem = read_doc_string (AREF (object, COMPILED_BYTECODE)); | 2897 | ptrdiff_t size = ASIZE (object) & PSEUDOVECTOR_SIZE_MASK; |
| 2895 | if (!CONSP (tem)) | 2898 | if (size <= COMPILED_STACK_DEPTH) |
| 2899 | xsignal1 (Qinvalid_function, object); | ||
| 2900 | if (CONSP (AREF (object, COMPILED_BYTECODE))) | ||
| 2896 | { | 2901 | { |
| 2897 | tem = AREF (object, COMPILED_BYTECODE); | 2902 | tem = read_doc_string (AREF (object, COMPILED_BYTECODE)); |
| 2898 | if (CONSP (tem) && STRINGP (XCAR (tem))) | 2903 | if (!CONSP (tem)) |
| 2899 | error ("Invalid byte code in %s", SDATA (XCAR (tem))); | 2904 | { |
| 2900 | else | 2905 | tem = AREF (object, COMPILED_BYTECODE); |
| 2901 | error ("Invalid byte code"); | 2906 | if (CONSP (tem) && STRINGP (XCAR (tem))) |
| 2907 | error ("Invalid byte code in %s", SDATA (XCAR (tem))); | ||
| 2908 | else | ||
| 2909 | error ("Invalid byte code"); | ||
| 2910 | } | ||
| 2911 | ASET (object, COMPILED_BYTECODE, XCAR (tem)); | ||
| 2912 | ASET (object, COMPILED_CONSTANTS, XCDR (tem)); | ||
| 2902 | } | 2913 | } |
| 2903 | ASET (object, COMPILED_BYTECODE, XCAR (tem)); | ||
| 2904 | ASET (object, COMPILED_CONSTANTS, XCDR (tem)); | ||
| 2905 | } | 2914 | } |
| 2906 | return object; | 2915 | return object; |
| 2907 | } | 2916 | } |