degenerate let forms
[bpt/guile.git] / libguile / frames.h
index e48bb48..31f8634 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
  * * 
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -110,27 +110,6 @@ struct scm_vm_frame
 #define SCM_FRAME_NUM_LOCALS(fp, sp)            \
   ((sp) + 1 - &SCM_FRAME_LOCAL (fp, 0))
 
-/* Currently (November 2013) we keep the procedure and arguments in
-   their slots for the duration of the procedure call, regardless of
-   whether the values are live or not.  This allows for backtraces that
-   show the closure and arguments.  We may allow the compiler to relax
-   this restriction in the future, if the user so desires.  This would
-   conserve stack space and make GC more precise.  We would need better
-   debugging information to do that, however.
-
-   Even now there is an exception to the rule that slot 0 holds the
-   procedure, which is in the case of tail calls.  The compiler will
-   emit code that shuffles the new procedure and arguments into position
-   before performing the tail call, so there is a window in which
-   SCM_FRAME_PROGRAM does not correspond to the program being executed.
-
-   The moral of the story is to use the IP in a frame to determine what
-   procedure is being called.  It is only appropriate to use
-   SCM_FRAME_PROGRAM in the prologue of a procedure call, when you know
-   it must be there.  */
-
-#define SCM_FRAME_PROGRAM(fp) (SCM_FRAME_LOCAL (fp, 0))
-
 \f
 /*
  * Heap frames
@@ -167,14 +146,21 @@ enum scm_vm_frame_kind
 SCM_INTERNAL SCM* scm_i_frame_stack_base (SCM frame);
 SCM_INTERNAL scm_t_ptrdiff scm_i_frame_offset (SCM frame);
 
-SCM_INTERNAL SCM scm_c_make_frame (enum scm_vm_frame_kind vm_frame_kind,
-                                   void *stack_holder, scm_t_ptrdiff fp_offset,
-                                   scm_t_ptrdiff sp_offset, scm_t_uint32 *ip);
+/* See notes in frames.c before using this.  */
+SCM_INTERNAL SCM scm_c_frame_closure (enum scm_vm_frame_kind kind,
+                                      const struct scm_frame *frame);
+
+SCM_INTERNAL SCM scm_c_make_frame (enum scm_vm_frame_kind kind,
+                                   const struct scm_frame *frame);
+
+SCM_INTERNAL int scm_c_frame_previous (enum scm_vm_frame_kind kind,
+                                       struct scm_frame *frame);
 
 #endif
 
 SCM_API SCM scm_frame_p (SCM obj);
 SCM_API SCM scm_frame_procedure (SCM frame);
+SCM_API SCM scm_frame_call_representation (SCM frame);
 SCM_API SCM scm_frame_arguments (SCM frame);
 SCM_API SCM scm_frame_source (SCM frame);
 SCM_API SCM scm_frame_num_locals (SCM frame);