From: Andrea Corallo Date: Sun, 16 Jun 2019 10:40:23 +0000 (+0200) Subject: BdiscardN support X-Git-Tag: emacs-28.0.90~2727^2~1472 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=0c7115c7b894c8e1655a0d5e482cc7ed8b231506;p=emacs.git BdiscardN support --- diff --git a/src/comp.c b/src/comp.c index fd7e7beda1e..f19fc84479b 100644 --- a/src/comp.c +++ b/src/comp.c @@ -1197,20 +1197,16 @@ compile_f (const char *f_name, ptrdiff_t bytestr_length, case Bstack_ref3: case Bstack_ref4: case Bstack_ref5: - { - PUSH_LVAL (stack_base[(stack - stack_base) - (op - Bstack_ref) - 1]); - break; - } + PUSH_LVAL (stack_base[(stack - stack_base) - (op - Bstack_ref) - 1]); + break; + case Bstack_ref6: - { - PUSH_LVAL (stack_base[(stack - stack_base) - FETCH - 1]); - break; - } + PUSH_LVAL (stack_base[(stack - stack_base) - FETCH - 1]); + break; + case Bstack_ref7: - { - PUSH_LVAL (stack_base[(stack - stack_base) - FETCH2 - 1]); - break; - } + PUSH_LVAL (stack_base[(stack - stack_base) - FETCH2 - 1]); + break; case Bvarref7: op = FETCH2; @@ -1966,8 +1962,20 @@ compile_f (const char *f_name, ptrdiff_t bytestr_length, case Bstack_set2: error ("Bstack_set2 not supported"); break; + case BdiscardN: - error ("BdiscardN not supported"); + op = FETCH; + if (op & 0x80) + { + op &= 0x7F; + POP1; + gcc_jit_block_add_assignment (comp.bblock->gcc_bb, + NULL, + *(stack - op - 1), + args[0]); + } + + stack -= op; break; case Bswitch: error ("Bswitch not supported"); @@ -1978,6 +1986,7 @@ compile_f (const char *f_name, ptrdiff_t bytestr_length, a constant on the stack. */ goto fail; break; + default: case Bconstant: { diff --git a/test/src/comp-tests.el b/test/src/comp-tests.el index 9d1ee65e4ee..f1acc42b8ca 100644 --- a/test/src/comp-tests.el +++ b/test/src/comp-tests.el @@ -307,6 +307,20 @@ (should (eq (comp-tests-numberp-f 'a) nil)) (should (eq (comp-tests-numberp-f 3.5) t))) +(ert-deftest comp-tests-stack () + "Test some stack operation." + (defun comp-tests-discardn-f (x) + ;; BdiscardN + (1+ (let ((a 1) + (_b) + (_c)) + a))) + + (byte-compile #'comp-tests-discardn-f) + (native-compile #'comp-tests-discardn-f) + + (should (= (comp-tests-discardn-f 10) 2))) + (ert-deftest comp-tests-gc () "Try to do some longer computation to let the gc kick in." (dotimes (_ 100000)