summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/intrinsics.h2
-rw-r--r--libguile/vm-engine.c3
-rw-r--r--libguile/vm.c1
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");