inline FREE_FRAME in return, sync stack_base in CACHE_REGISTER
authorAndy Wingo <wingo@pobox.com>
Sat, 13 Sep 2008 12:30:57 +0000 (14:30 +0200)
committerAndy Wingo <wingo@pobox.com>
Sat, 13 Sep 2008 12:30:57 +0000 (14:30 +0200)
* libguile/vm-engine.h (CACHE_REGISTER): Sync stack_base too.

* libguile/vm-i-system.c (return): Inline FREE_FRAME here,
  micro-optimizing a wee bit. Sounds silly, but it's to enable some
  refactoring.

libguile/vm-engine.h
libguile/vm-i-system.c

index 370a42b..c86307c 100644 (file)
   ip = vp->ip;                                 \
   sp = vp->sp;                                 \
   fp = vp->fp;                                 \
+  stack_base = fp ? SCM_FRAME_UPPER_ADDRESS (fp) - 1 : vp->stack_base; \
 }
 
 #define SYNC_REGISTER()                                \
index 5468911..aff8331 100644 (file)
@@ -670,7 +670,27 @@ VM_DEFINE_INSTRUCTION (return, "return", 0, 0, 1)
  vm_return:
   EXIT_HOOK ();
   RETURN_HOOK ();
-  FREE_FRAME ();
+  {
+    SCM ret, *data;
+    data = SCM_FRAME_DATA_ADDRESS (fp);
+
+    POP (ret);
+#ifdef THE_GOVERNMENT_IS_AFTER_ME
+    if (sp != stack_base)
+      abort ();
+    if (stack_base != data + 3)
+      abort ();
+#endif
+
+    /* Restore registers */
+    sp = SCM_FRAME_LOWER_ADDRESS (fp);
+    ip = SCM_FRAME_BYTE_CAST (data[3]);
+    fp = SCM_FRAME_STACK_CAST (data[2]);
+    stack_base = SCM_FRAME_UPPER_ADDRESS (fp) - 1;
+
+    /* Set return value (sp is already pushed) */
+    *sp = ret;
+  }
 
   /* Restore the last program */
   program = SCM_FRAME_PROGRAM (fp);