guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 03/11: Call out to expand_stack through new VM intrinsic


From: Andy Wingo
Subject: [Guile-commits] 03/11: Call out to expand_stack through new VM intrinsic
Date: Sun, 17 Jun 2018 07:46:22 -0400 (EDT)

wingo pushed a commit to branch master
in repository guile.

commit ceaf782770b597f4eb31a4fca65a75ab220aa47c
Author: Andy Wingo <address@hidden>
Date:   Mon Jun 11 21:27:37 2018 +0200

    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.
---
 libguile/intrinsics.h | 2 ++
 libguile/vm-engine.c  | 3 ++-
 libguile/vm.c         | 1 +
 3 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/libguile/intrinsics.h b/libguile/intrinsics.h
index 7b67f80..04cacea 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 c431563..abfa1fb 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 b4bcbe3..0e82438 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");



reply via email to

[Prev in Thread] Current Thread [Next in Thread]