• Stefan Monnier's avatar
    Introduce new bytecodes for efficient catch/condition-case in lexbind. · adf2aa61
    Stefan Monnier authored
    * lisp/emacs-lisp/byte-opt.el (byte-optimize-form-code-walker):
    Optimize under `condition-case' and `catch' if
    byte-compile--use-old-handlers is nil.
    (disassemble-offset): Handle new bytecodes.
    
    * lisp/emacs-lisp/bytecomp.el (byte-pushcatch, byte-pushconditioncase)
    (byte-pophandler): New byte codes.
    (byte-goto-ops): Adjust accordingly.
    (byte-compile--use-old-handlers): New var.
    (byte-compile-catch): Use new byte codes depending on
    byte-compile--use-old-handlers.
    (byte-compile-condition-case--old): Rename from
    byte-compile-condition-case.
    (byte-compile-condition-case--new): New function.
    (byte-compile-condition-case): New function that dispatches depending
    on byte-compile--use-old-handlers.
    (byte-compile-unwind-protect): Pass a function to byte-unwind-protect
    when we can.
    
    * lisp/emacs-lisp/cconv.el (cconv-convert, cconv-analyse-form): Adjust for
    the new compilation scheme using the new byte-codes.
    
    * src/alloc.c (Fgarbage_collect): Merge scans of handlerlist and catchlist,
    and make them unconditional now that they're heap-allocated.
    
    * src/bytecode.c (BYTE_CODES): Add Bpushcatch, Bpushconditioncase
    and Bpophandler.
    (bcall0): New function.
    (exec_byte_code): Add corresponding cases.  Improve error message when
    encountering an invalid byte-code.  Let Bunwind_protect accept
    a function (rather than a list of expressions) as argument.
    
    * src/eval.c (catchlist): Remove (merge with handlerlist).
    (handlerlist, lisp_eval_depth): Not static any more.
    (internal_catch, internal_condition_case, internal_condition_case_1)
    (internal_condition_case_2, internal_condition_case_n):
    Use PUSH_HANDLER.
    (unwind_to_catch, Fthrow, Fsignal): Adjust to merged
    handlerlist/catchlist.
    (internal_lisp_condition_case): Use PUSH_HANDLER.  Adjust to new
    handlerlist which can only handle a single condition-case handler at
    a time.
    (find_handler_clause): Simplify since we only a single branch here
    any more.
    
    * src/lisp.h (struct handler): Merge struct handler and struct catchtag.
    (PUSH_HANDLER): New macro.
    (catchlist): Remove.
    (handlerlist): Always declare.
    adf2aa61
bytecode.c 44.6 KB