diff options
author | Andy Wingo <wingo@pobox.com> | 2018-06-11 21:27:37 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2018-06-11 21:27:37 +0200 |
commit | ceaf782770b597f4eb31a4fca65a75ab220aa47c (patch) | |
tree | 7097a68f9d116453a4ba4c2413490f400819d216 | |
parent | 3b463516ef2d4428ae51ff81e72e87a210289673 (diff) | |
download | guile-ceaf782770b597f4eb31a4fca65a75ab220aa47c.tar.gz |
Call out to expand_stack through new VM intrinsic
* libguile/intrinsics.h (scm_t_vp_sp_intrinsic): New type.
(SCM_FOR_ALL_VM_INTRINSICS): Add expand-stack.
* libguile/vm-engine.c (ALLOC_FRAME): Call through the intrinsics.
* libguile/vm.c (scm_bootstrap_vm): Initialize the expand-stack
intrinsic.
-rw-r--r-- | libguile/intrinsics.h | 2 | ||||
-rw-r--r-- | libguile/vm-engine.c | 3 | ||||
-rw-r--r-- | libguile/vm.c | 1 |
3 files changed, 5 insertions, 1 deletions
diff --git a/libguile/intrinsics.h b/libguile/intrinsics.h index 7b67f8050..04caceaec 100644 --- a/libguile/intrinsics.h +++ b/libguile/intrinsics.h @@ -41,6 +41,7 @@ typedef SCM (*scm_t_scm_from_thread_scm_intrinsic) (scm_i_thread*, SCM); typedef SCM (*scm_t_scm_from_scm_u64_intrinsic) (SCM, scm_t_uint64); typedef int (*scm_t_bool_from_scm_scm_intrinsic) (SCM, SCM); typedef enum scm_compare (*scm_t_compare_from_scm_scm_intrinsic) (SCM, SCM); +typedef void (*scm_t_vp_sp_intrinsic) (struct scm_vm*, union scm_vm_stack_element*); #define SCM_FOR_ALL_VM_INTRINSICS(M) \ M(scm_from_scm_scm, add, "add", ADD) \ @@ -85,6 +86,7 @@ typedef enum scm_compare (*scm_t_compare_from_scm_scm_intrinsic) (SCM, SCM); M(scm_from_scm_uimm, resolve_module, "resolve-module", RESOLVE_MODULE) \ M(scm_from_scm_scm, lookup, "lookup", LOOKUP) \ M(scm_from_scm_scm, define_x, "define!", DEFINE_X) \ + M(vp_sp, expand_stack, "expand-stack", EXPAND_STACK) \ /* Add new intrinsics here; also update scm_bootstrap_intrinsics. */ enum scm_vm_intrinsic diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index c43156382..abfa1fb53 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -178,8 +178,9 @@ { \ if (SCM_UNLIKELY (sp < vp->stack_limit)) \ { \ + struct scm_vm_intrinsics *i = (void*)intrinsics; \ SYNC_IP (); \ - vm_expand_stack (vp, sp); \ + i->expand_stack (vp, sp); \ CACHE_SP (); \ } \ else \ diff --git a/libguile/vm.c b/libguile/vm.c index b4bcbe36e..0e824380b 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -1481,6 +1481,7 @@ scm_bootstrap_vm (void) /* page_size should be a power of two. */ if (page_size & (page_size - 1)) abort (); + scm_vm_intrinsics.expand_stack = vm_expand_stack; sym_vm_run = scm_from_latin1_symbol ("vm-run"); sym_vm_error = scm_from_latin1_symbol ("vm-error"); |