diff options
author | Andy Wingo <wingo@pobox.com> | 2018-08-17 08:15:04 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2018-08-17 08:50:33 +0200 |
commit | 3827769aff190a5e155b29d37fe157dd6115ad04 (patch) | |
tree | cca82537cba9073fce356cd75575be82e98e466c /libguile/gsubr.c | |
parent | e6304fb2425475ddf441439ee3c510060f9464d4 (diff) | |
download | guile-3827769aff190a5e155b29d37fe157dd6115ad04.tar.gz |
Add instrumentation to VM builtins
* libguile/intrinsics.h: Add "intrinsic" for handle-interrupts code.
Unlike the other intrinsics, this one isn't a function.
* libguile/programs.c (try_parse_arity): Add cases for instructions used
in VM builtins.
(scm_primitive_call_ip): Return #f if call-ip not found.
* libguile/vm-engine.c (handle-interrupts): Get code from intrinsics.
* libguile/vm.c
* libguile/vm.c (instrumented_code, define_vm_builtins): Add
instrumentation to the builtins, so that they can be JIT-compiled.
(INIT_BUILTIN): Remove min-arity setting; the fallback min-arity
interpreter should figure it out.
(scm_bootstrap_vm): Call the new define_vm_builtins function.
* libguile/gsubr.c (primitive_call_ip): Return 0 if call IP not found.
(primitive_subr_idx): Interpret call ip == 0 as not-a-subr.
* module/system/vm/program.scm (program-arguments-alist): Allow a #f
call-ip.
Diffstat (limited to 'libguile/gsubr.c')
-rw-r--r-- | libguile/gsubr.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/libguile/gsubr.c b/libguile/gsubr.c index 227796e33..2384776e0 100644 --- a/libguile/gsubr.c +++ b/libguile/gsubr.c @@ -400,7 +400,7 @@ primitive_call_ip (const uint32_t *code) code -= 1; break; default: - abort (); + return 0; } } } @@ -410,8 +410,11 @@ static const uint32_t NOT_A_SUBR_CALL = 0xffffffff; static uint32_t primitive_subr_idx (const uint32_t *code) { + uint32_t word; uintptr_t call_ip = primitive_call_ip (code); - uint32_t word = ((uint32_t *) call_ip)[0]; + if (call_ip == 0) + return NOT_A_SUBR_CALL; + word = ((uint32_t *) call_ip)[0]; if ((word & 0xff) == scm_op_subr_call) { uint32_t idx = word >> 8; |