mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-24 12:20:20 +02:00
Add new "throw" VM ops
* libguile/throw.h (scm_ithrow, scm_throw): Mark as SCM_NORETURN. * libguile/throw.c (scm_throw, scm_ithrow): Adapt to not return. * libguile/vm-engine.c (throw, throw/value, throw/value+data): New instructions. * libguile/vm.c (vm_throw, vm_throw_with_value) (vm_throw_with_value_and_data): New helpers. * module/language/cps/compile-bytecode.scm (compile-function): Add cases for new instructions. * module/language/cps/prune-bailouts.scm (prune-bailouts): More simple, now that there are no $kreceives in play. * module/language/cps/reify-primitives.scm (reify-clause): Update reification of no-clause functions to use new throw op. * module/language/tree-il/compile-cps.scm (convert): Convert invocations of the variable-arity 'throw primitive from Tree-IL to the new fixed-arity CPS instructions. * module/system/vm/assembler.scm (emit-throw/value*) (emit-throw/value+data*, emit-throw): Export new instructions. * module/system/vm/disassembler.scm (code-annotation): Add annotation.
This commit is contained in:
parent
cf486700b7
commit
f96a670332
10 changed files with 199 additions and 48 deletions
|
@ -260,6 +260,8 @@ address of that offset."
|
|||
(when (program? val)
|
||||
(push-addr! (program-code val) val))
|
||||
(list "~@Y" val)))
|
||||
(((or 'throw/value 'throw/value+data) dst target)
|
||||
(list "~@Y" (reference-scm target)))
|
||||
(('builtin-ref dst idx)
|
||||
(list "~A" (builtin-index->name idx)))
|
||||
(((or 'static-ref 'static-set!) _ target)
|
||||
|
@ -511,6 +513,7 @@ address of that offset."
|
|||
(define (instruction-has-fallthrough? code pos)
|
||||
(define non-fallthrough-set
|
||||
(static-opcode-set halt
|
||||
throw throw/value throw/value+data
|
||||
tail-call tail-call-label tail-call/shuffle
|
||||
return-values
|
||||
subr-call foreign-call continuation-call
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue