Merge remote-tracking branch 'origin/stable-2.0'
[bpt/guile.git] / libguile / frames.h
CommitLineData
510ca126 1/* Copyright (C) 2001, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
560b9c25
AW
2 * *
3 * This library is free software; you can redistribute it and/or
53befeb7
NJ
4 * modify it under the terms of the GNU Lesser General Public License
5 * as published by the Free Software Foundation; either version 3 of
6 * the License, or (at your option) any later version.
ac99cb0c 7 *
53befeb7
NJ
8 * This library is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
560b9c25
AW
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
ac99cb0c 12 *
560b9c25
AW
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the Free Software
53befeb7
NJ
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 * 02110-1301 USA
560b9c25 17 */
ac99cb0c
KN
18
19#ifndef _SCM_FRAMES_H_
20#define _SCM_FRAMES_H_
21
22#include <libguile.h>
ac99cb0c
KN
23#include "programs.h"
24
ac99cb0c
KN
25\f
26/*
af988bbf 27 * VM frames
ac99cb0c
KN
28 */
29
aa3f6951
AW
30/*
31 * It's a little confusing, but there are two representations of frames in this
32 * file: frame pointers and Scheme objects wrapping those frame pointers. The
33 * former uses the SCM_FRAME_... macro prefix, the latter SCM_VM_FRAME_..
34 * prefix.
35 *
36 * The confusing thing is that only Scheme frame objects have functions that use
37 * them, and they use the scm_frame_.. prefix. Hysterical raisins.
38 */
39
b6368dbb
LC
40/* VM Frame Layout
41 ---------------
42
03e6c165 43 | ... |
6c6a4439
AW
44 | Intermed. val. 0 | <- fp + nargs + nlocs
45 +------------------+
03e6c165 46 | Local variable 1 |
6c6a4439 47 | Local variable 0 | <- fp + nargs
ac99cb0c 48 | Argument 1 |
6c6a4439 49 | Argument 0 | <- fp = SCM_FRAME_STACK_ADDRESS (fp)
ac99cb0c 50 | Program | <- fp - 1
6c6a4439
AW
51 +==================+
52 | Return address | <- SCM_FRAME_UPPER_ADDRESS (fp)
03e6c165
AW
53 | MV return address|
54 | Dynamic link | <- fp - 4 = SCM_FRAME_DATA_ADDRESS (fp) = SCM_FRAME_LOWER_ADDRESS (fp)
55 +==================+
ac99cb0c 56 | |
b6368dbb
LC
57
58 As can be inferred from this drawing, it is assumed that
59 `sizeof (SCM *) == sizeof (SCM)', since pointers (the `link' parts) are
60 assumed to be as long as SCM objects. */
ac99cb0c 61
3e54fdfc
AW
62/* This structure maps to the contents of a VM stack frame. It can
63 alias a frame directly. */
64struct scm_vm_frame
65{
66 SCM *dynamic_link;
67 scm_t_uint8 *mv_return_address;
68 scm_t_uint8 *return_address;
69 SCM program;
70 SCM stack[1]; /* Variable-length */
71};
72
0fc9040f
LC
73#define SCM_FRAME_STRUCT(fp) \
74 ((struct scm_vm_frame *) SCM_FRAME_DATA_ADDRESS (fp))
3e54fdfc 75
0fc9040f 76#define SCM_FRAME_DATA_ADDRESS(fp) (((SCM *) (fp)) - 4)
3e54fdfc
AW
77#define SCM_FRAME_STACK_ADDRESS(fp) (SCM_FRAME_STRUCT (fp)->stack)
78#define SCM_FRAME_UPPER_ADDRESS(fp) ((SCM*)&SCM_FRAME_STRUCT (fp)->return_address)
79#define SCM_FRAME_LOWER_ADDRESS(fp) ((SCM*)SCM_FRAME_STRUCT (fp))
af988bbf 80
2fb924f6 81#define SCM_FRAME_BYTE_CAST(x) ((scm_t_uint8 *) SCM_UNPACK (x))
af988bbf 82#define SCM_FRAME_STACK_CAST(x) ((SCM *) SCM_UNPACK (x))
ac99cb0c 83
3e54fdfc
AW
84#define SCM_FRAME_RETURN_ADDRESS(fp) \
85 (SCM_FRAME_STRUCT (fp)->return_address)
86#define SCM_FRAME_SET_RETURN_ADDRESS(fp, ra) \
87 SCM_FRAME_STRUCT (fp)->return_address = (ra)
88#define SCM_FRAME_MV_RETURN_ADDRESS(fp) \
89 (SCM_FRAME_STRUCT (fp)->mv_return_address)
90#define SCM_FRAME_SET_MV_RETURN_ADDRESS(fp, mvra) \
91 SCM_FRAME_STRUCT (fp)->mv_return_address = (mvra)
92#define SCM_FRAME_DYNAMIC_LINK(fp) \
93 (SCM_FRAME_STRUCT (fp)->dynamic_link)
94#define SCM_FRAME_SET_DYNAMIC_LINK(fp, dl) \
0fc9040f 95 SCM_FRAME_DYNAMIC_LINK (fp) = (dl)
3e54fdfc
AW
96#define SCM_FRAME_VARIABLE(fp,i) \
97 (SCM_FRAME_STRUCT (fp)->stack[i])
98#define SCM_FRAME_PROGRAM(fp) \
99 (SCM_FRAME_STRUCT (fp)->program)
ac99cb0c
KN
100
101\f
510ca126
AW
102/*
103 * RTL frames
104 */
105
106/* The frame format for the new RTL programs is almost like that for the
107 stack-vm programs. They differ in their handling of MV returns,
108 however. For RTL, every call is an MV call: every call has an MVRA.
109 Unlike the stack-vm programs, the MVRA for RTL programs is computable
110 from the RA -- it's always one word (4 bytes) before the RA.
111
112 Until we completely migrate to the RTL VM, we will also write the
113 MVRA to the stack.
114
115 When an RTL program returns multiple values, it will shuffle them
116 down to start contiguously from slot 0, as for a tail call. This
117 means that when the caller goes to access them, there are 2 or 3
118 empty words between the top of the caller stack and the bottom of the
119 values, corresponding to the frame that was just popped.
120*/
121
122#define SCM_FRAME_RTL_RETURN_ADDRESS(fp) \
123 ((scm_t_uint32 *) SCM_FRAME_RETURN_ADDRESS (fp))
124#define SCM_FRAME_SET_RTL_RETURN_ADDRESS(fp, ip) \
125 SCM_FRAME_SET_RETURN_ADDRESS (fp, (scm_t_uint8 *) (ip))
126
127#define SCM_FRAME_RTL_MV_RETURN_ADDRESS(fp) \
128 ((scm_t_uint32 *) SCM_FRAME_MV_RETURN_ADDRESS (fp))
129#define SCM_FRAME_SET_RTL_MV_RETURN_ADDRESS(fp, ip) \
130 SCM_FRAME_SET_MV_RETURN_ADDRESS (fp, (scm_t_uint8 *) (ip))
131
132\f
ac99cb0c 133/*
af988bbf 134 * Heap frames
ac99cb0c
KN
135 */
136
aa3f6951 137struct scm_frame
b1b942b7
AW
138{
139 SCM stack_holder;
140 SCM *fp;
141 SCM *sp;
2fb924f6 142 scm_t_uint8 *ip;
b1b942b7
AW
143 scm_t_ptrdiff offset;
144};
145
dc7da0be 146#define SCM_VM_FRAME_P(x) (SCM_HAS_TYP7 (x, scm_tc7_frame))
6f3b0cc2 147#define SCM_VM_FRAME_DATA(x) ((struct scm_frame*)SCM_CELL_WORD_1 (x))
b1b942b7
AW
148#define SCM_VM_FRAME_STACK_HOLDER(f) SCM_VM_FRAME_DATA(f)->stack_holder
149#define SCM_VM_FRAME_FP(f) SCM_VM_FRAME_DATA(f)->fp
150#define SCM_VM_FRAME_SP(f) SCM_VM_FRAME_DATA(f)->sp
151#define SCM_VM_FRAME_IP(f) SCM_VM_FRAME_DATA(f)->ip
152#define SCM_VM_FRAME_OFFSET(f) SCM_VM_FRAME_DATA(f)->offset
153#define SCM_VALIDATE_VM_FRAME(p,x) SCM_MAKE_VALIDATE (p, x, VM_FRAME_P)
154
aa3f6951
AW
155SCM_API SCM scm_c_make_frame (SCM stack_holder, SCM *fp, SCM *sp,
156 scm_t_uint8 *ip, scm_t_ptrdiff offset);
157SCM_API SCM scm_frame_p (SCM obj);
158SCM_API SCM scm_frame_procedure (SCM frame);
159SCM_API SCM scm_frame_arguments (SCM frame);
160SCM_API SCM scm_frame_source (SCM frame);
161SCM_API SCM scm_frame_num_locals (SCM frame);
162SCM_API SCM scm_frame_local_ref (SCM frame, SCM index);
163SCM_API SCM scm_frame_local_set_x (SCM frame, SCM index, SCM val);
2e30f398 164SCM_API SCM scm_frame_address (SCM frame);
542f975e 165SCM_API SCM scm_frame_stack_pointer (SCM frame);
aa3f6951
AW
166SCM_API SCM scm_frame_instruction_pointer (SCM frame);
167SCM_API SCM scm_frame_return_address (SCM frame);
168SCM_API SCM scm_frame_mv_return_address (SCM frame);
169SCM_API SCM scm_frame_dynamic_link (SCM frame);
93dbc31b 170SCM_API SCM scm_frame_previous (SCM frame);
560b9c25 171
6f3b0cc2
AW
172SCM_INTERNAL void scm_i_frame_print (SCM frame, SCM port,
173 scm_print_state *pstate);
560b9c25 174SCM_INTERNAL void scm_init_frames (void);
ac99cb0c
KN
175
176#endif /* _SCM_FRAMES_H_ */
177
178/*
179 Local Variables:
180 c-file-style: "gnu"
181 End:
182*/