make pre-inst-guile use pre-inst-guile-env
[bpt/guile.git] / src / frames.c
CommitLineData
ac99cb0c
KN
1/* Copyright (C) 2001 Free Software Foundation, Inc.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2, or (at your option)
6 * any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; see the file COPYING. If not, write to
15 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
16 * Boston, MA 02111-1307 USA
17 *
18 * As a special exception, the Free Software Foundation gives permission
19 * for additional uses of the text contained in its release of GUILE.
20 *
21 * The exception is that, if you link the GUILE library with other files
22 * to produce an executable, this does not by itself cause the
23 * resulting executable to be covered by the GNU General Public License.
24 * Your use of that executable is in no way restricted on account of
25 * linking the GUILE library code into it.
26 *
27 * This exception does not however invalidate any other reasons why
28 * the executable file might be covered by the GNU General Public License.
29 *
30 * This exception applies only to the code released by the
31 * Free Software Foundation under the name GUILE. If you copy
32 * code from other Free Software Foundation releases into a copy of
33 * GUILE, as the General Public License permits, the exception does
34 * not apply to the code that you add in this way. To avoid misleading
35 * anyone as to the status of such modified files, you must delete
36 * this exception notice from them.
37 *
38 * If you write modifications of your own for GUILE, it is your choice
39 * whether to permit this exception to apply to your modifications.
40 * If you do not wish that, delete this exception notice. */
41
13c47753
AW
42#if HAVE_CONFIG_H
43# include <config.h>
44#endif
45
ac99cb0c 46#include <string.h>
07e56b27 47#include "bootstrap.h"
ac99cb0c
KN
48#include "frames.h"
49
50\f
f9e8c09d 51scm_t_bits scm_tc16_heap_frame;
ac99cb0c
KN
52
53SCM
54scm_c_make_heap_frame (SCM *fp)
55{
af988bbf
KN
56 SCM frame;
57 SCM *lower = SCM_FRAME_LOWER_ADDRESS (fp);
58 SCM *upper = SCM_FRAME_UPPER_ADDRESS (fp);
59 size_t size = sizeof (SCM) * (upper - lower + 1);
d8eeb67c
LC
60 SCM *p = scm_gc_malloc (size, "frame");
61
af988bbf
KN
62 SCM_NEWSMOB (frame, scm_tc16_heap_frame, p);
63 p[0] = frame; /* self link */
64 memcpy (p + 1, lower, size - sizeof (SCM));
d8eeb67c 65
af988bbf 66 return frame;
ac99cb0c
KN
67}
68
69static SCM
70heap_frame_mark (SCM obj)
71{
af988bbf
KN
72 SCM *sp;
73 SCM *fp = SCM_HEAP_FRAME_POINTER (obj);
74 SCM *limit = &SCM_FRAME_HEAP_LINK (fp);
75
76 for (sp = SCM_FRAME_LOWER_ADDRESS (fp); sp <= limit; sp++)
77 if (SCM_NIMP (*sp))
78 scm_gc_mark (*sp);
79
80 return SCM_BOOL_F;
81}
82
83static scm_sizet
84heap_frame_free (SCM obj)
85{
86 SCM *fp = SCM_HEAP_FRAME_POINTER (obj);
87 SCM *lower = SCM_FRAME_LOWER_ADDRESS (fp);
88 SCM *upper = SCM_FRAME_UPPER_ADDRESS (fp);
89 size_t size = sizeof (SCM) * (upper - lower + 1);
d8eeb67c
LC
90
91 scm_gc_free (SCM_HEAP_FRAME_DATA (obj), size, "frame");
92
93 return 0;
ac99cb0c
KN
94}
95
96/* Scheme interface */
97
98SCM_DEFINE (scm_frame_p, "frame?", 1, 0, 0,
99 (SCM obj),
100 "")
101#define FUNC_NAME s_scm_frame_p
102{
103 return SCM_BOOL (SCM_HEAP_FRAME_P (obj));
104}
105#undef FUNC_NAME
106
107SCM_DEFINE (scm_frame_program, "frame-program", 1, 0, 0,
108 (SCM frame),
109 "")
110#define FUNC_NAME s_scm_frame_program
111{
112 SCM_VALIDATE_HEAP_FRAME (1, frame);
af988bbf 113 return SCM_FRAME_PROGRAM (SCM_HEAP_FRAME_POINTER (frame));
ac99cb0c
KN
114}
115#undef FUNC_NAME
116
af988bbf
KN
117SCM_DEFINE (scm_frame_local_ref, "frame-local-ref", 2, 0, 0,
118 (SCM frame, SCM index),
ac99cb0c 119 "")
af988bbf 120#define FUNC_NAME s_scm_frame_local_ref
ac99cb0c 121{
af988bbf 122 SCM_VALIDATE_HEAP_FRAME (1, frame);
62082959 123 SCM_MAKE_VALIDATE (2, index, I_INUMP); /* FIXME: Check the range! */
af988bbf 124 return SCM_FRAME_VARIABLE (SCM_HEAP_FRAME_POINTER (frame),
2d80426a 125 SCM_I_INUM (index));
af988bbf
KN
126}
127#undef FUNC_NAME
ac99cb0c 128
af988bbf
KN
129SCM_DEFINE (scm_frame_local_set_x, "frame-local-set!", 3, 0, 0,
130 (SCM frame, SCM index, SCM val),
131 "")
132#define FUNC_NAME s_scm_frame_local_set_x
133{
ac99cb0c 134 SCM_VALIDATE_HEAP_FRAME (1, frame);
62082959 135 SCM_MAKE_VALIDATE (2, index, I_INUMP); /* FIXME: Check the range! */
d8eeb67c 136 SCM_FRAME_VARIABLE (SCM_HEAP_FRAME_POINTER (frame),
2d80426a 137 SCM_I_INUM (index)) = val;
af988bbf 138 return SCM_UNSPECIFIED;
ac99cb0c
KN
139}
140#undef FUNC_NAME
141
142SCM_DEFINE (scm_frame_return_address, "frame-return-address", 1, 0, 0,
143 (SCM frame),
144 "")
145#define FUNC_NAME s_scm_frame_return_address
146{
147 SCM_VALIDATE_HEAP_FRAME (1, frame);
b6368dbb
LC
148 return scm_from_ulong ((unsigned long)
149 (SCM_FRAME_RETURN_ADDRESS
150 (SCM_HEAP_FRAME_POINTER (frame))));
ac99cb0c
KN
151}
152#undef FUNC_NAME
153
154SCM_DEFINE (scm_frame_dynamic_link, "frame-dynamic-link", 1, 0, 0,
155 (SCM frame),
156 "")
157#define FUNC_NAME s_scm_frame_dynamic_link
158{
ac99cb0c 159 SCM_VALIDATE_HEAP_FRAME (1, frame);
af988bbf 160 return SCM_FRAME_HEAP_LINK (SCM_HEAP_FRAME_POINTER (frame));
ac99cb0c
KN
161}
162#undef FUNC_NAME
163
164SCM_DEFINE (scm_frame_external_link, "frame-external-link", 1, 0, 0,
165 (SCM frame),
166 "")
167#define FUNC_NAME s_scm_frame_external_link
168{
ac99cb0c 169 SCM_VALIDATE_HEAP_FRAME (1, frame);
af988bbf 170 return SCM_FRAME_EXTERNAL_LINK (SCM_HEAP_FRAME_POINTER (frame));
ac99cb0c
KN
171}
172#undef FUNC_NAME
173
174\f
175void
07e56b27 176scm_bootstrap_frames (void)
ac99cb0c 177{
af988bbf 178 scm_tc16_heap_frame = scm_make_smob_type ("frame", 0);
ac99cb0c 179 scm_set_smob_mark (scm_tc16_heap_frame, heap_frame_mark);
af988bbf 180 scm_set_smob_free (scm_tc16_heap_frame, heap_frame_free);
07e56b27
AW
181}
182
183void
184scm_init_frames (void)
185{
186 scm_bootstrap_vm ();
ac99cb0c
KN
187
188#ifndef SCM_MAGIC_SNARFER
189#include "frames.x"
190#endif
191}
192
193/*
194 Local Variables:
195 c-file-style: "gnu"
196 End:
197*/