*** empty log message ***
[bpt/guile.git] / src / vm.c
CommitLineData
8f5cfc81 1/* Copyright (C) 2001 Free Software Foundation, Inc.
a98cef7e
KN
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
17e90c5e 42#include <string.h>
ac99cb0c
KN
43#include "envs.h"
44#include "frames.h"
17e90c5e 45#include "instructions.h"
8f5cfc81 46#include "objcodes.h"
ac99cb0c 47#include "programs.h"
a98cef7e
KN
48#include "vm.h"
49
a98cef7e
KN
50/* I sometimes use this for debugging. */
51#define vm_puts(OBJ) \
52{ \
53 scm_display (OBJ, scm_def_errp); \
54 scm_newline (scm_def_errp); \
55}
56
57\f
a98cef7e
KN
58/*
59 * VM Continuation
60 */
61
17e90c5e
KN
62scm_bits_t scm_tc16_vm_cont;
63
64
65#define SCM_VM_CONT_P(OBJ) SCM_SMOB_PREDICATE (scm_tc16_vm_cont, OBJ)
3d5ee0cd 66#define SCM_VM_CONT_VP(CONT) ((struct scm_vm *) SCM_CELL_WORD_1 (CONT))
a98cef7e
KN
67
68static SCM
3d5ee0cd 69capture_vm_cont (struct scm_vm *vp)
a98cef7e
KN
70{
71 struct scm_vm *p = scm_must_malloc (sizeof (*p), "capture_vm_cont");
3d5ee0cd 72 p->stack_size = vp->stack_limit - vp->sp;
a98cef7e
KN
73 p->stack_base = scm_must_malloc (p->stack_size * sizeof (SCM),
74 "capture_vm_cont");
17e90c5e 75 p->stack_limit = p->stack_base + p->stack_size - 2;
3d5ee0cd
KN
76 p->ip = vp->ip;
77 p->sp = (SCM *) (vp->stack_limit - vp->sp);
78 p->fp = (SCM *) (vp->stack_limit - vp->fp);
79 memcpy (p->stack_base, vp->sp + 1, vp->stack_size * sizeof (SCM));
17e90c5e 80 SCM_RETURN_NEWSMOB (scm_tc16_vm_cont, p);
a98cef7e
KN
81}
82
83static void
3d5ee0cd 84reinstate_vm_cont (struct scm_vm *vp, SCM cont)
a98cef7e 85{
3d5ee0cd
KN
86 struct scm_vm *p = SCM_VM_CONT_VP (cont);
87 if (vp->stack_size < p->stack_size)
a98cef7e 88 {
17e90c5e 89 /* puts ("FIXME: Need to expand"); */
a98cef7e
KN
90 abort ();
91 }
3d5ee0cd
KN
92 vp->ip = p->ip;
93 vp->sp = vp->stack_limit - (int) p->sp;
94 vp->fp = vp->stack_limit - (int) p->fp;
95 memcpy (vp->sp + 1, p->stack_base, p->stack_size * sizeof (SCM));
a98cef7e
KN
96}
97
98static SCM
17e90c5e 99vm_cont_mark (SCM obj)
a98cef7e
KN
100{
101 SCM *p;
3d5ee0cd
KN
102 struct scm_vm *vp = SCM_VM_CONT_VP (obj);
103 for (p = vp->stack_base; p <= vp->stack_limit; p++)
a98cef7e
KN
104 if (SCM_NIMP (*p))
105 scm_gc_mark (*p);
106 return SCM_BOOL_F;
107}
108
109static scm_sizet
17e90c5e 110vm_cont_free (SCM obj)
a98cef7e 111{
3d5ee0cd 112 struct scm_vm *p = SCM_VM_CONT_VP (obj);
a98cef7e
KN
113 int size = sizeof (struct scm_vm) + p->stack_size * sizeof (SCM);
114 scm_must_free (p->stack_base);
115 scm_must_free (p);
116 return size;
117}
118
17e90c5e
KN
119\f
120/*
121 * VM Internal functions
122 */
123
41f248a8 124SCM_SYMBOL (sym_vm_run, "vm-run");
17e90c5e
KN
125SCM_SYMBOL (sym_vm_error, "vm-error");
126
127static scm_byte_t *
128vm_fetch_length (scm_byte_t *ip, size_t *lenp)
a98cef7e 129{
4bfb26f5 130 /* NOTE: format defined in system/vm/conv.scm */
17e90c5e
KN
131 *lenp = *ip++;
132 if (*lenp < 254)
133 return ip;
134 else if (*lenp == 254)
46cd9a34
KN
135 {
136 int b1 = *ip++;
137 int b2 = *ip++;
138 *lenp = (b1 << 8) + b2;
139 }
17e90c5e 140 else
46cd9a34
KN
141 {
142 int b1 = *ip++;
143 int b2 = *ip++;
144 int b3 = *ip++;
145 int b4 = *ip++;
146 *lenp = (b1 << 24) + (b2 << 16) + (b3 << 8) + b4;
147 }
17e90c5e 148 return ip;
a98cef7e
KN
149}
150
af988bbf 151static SCM
a6df585a 152vm_heapify_frames_1 (struct scm_vm *vp, SCM *fp, SCM *sp, SCM **destp)
af988bbf 153{
a6df585a 154 SCM frame;
af988bbf 155 SCM *dl = SCM_FRAME_DYNAMIC_LINK (fp);
a6df585a
KN
156 SCM *src = SCM_FRAME_UPPER_ADDRESS (fp);
157 SCM *dest = SCM_FRAME_LOWER_ADDRESS (fp);
af988bbf
KN
158
159 if (!dl)
160 {
161 /* The top frame */
af988bbf
KN
162 frame = scm_c_make_heap_frame (fp);
163 fp = SCM_HEAP_FRAME_POINTER (frame);
164 SCM_FRAME_HEAP_LINK (fp) = SCM_BOOL_T;
165 }
166 else
167 {
a6df585a 168 /* Child frames */
af988bbf
KN
169 SCM link = SCM_FRAME_HEAP_LINK (dl);
170 if (!SCM_FALSEP (link))
a6df585a 171 link = SCM_FRAME_LOWER_ADDRESS (dl)[-1]; /* self link */
af988bbf 172 else
a6df585a 173 link = vm_heapify_frames_1 (vp, dl, dest - 1, &dest);
af988bbf
KN
174 frame = scm_c_make_heap_frame (fp);
175 fp = SCM_HEAP_FRAME_POINTER (frame);
176 SCM_FRAME_HEAP_LINK (fp) = link;
177 SCM_FRAME_DYNAMIC_LINK (fp) = SCM_HEAP_FRAME_POINTER (link);
178 }
179
180 /* Move stack data */
a6df585a
KN
181 for (; src <= sp; src++, dest++)
182 *dest = *src;
183 *destp = dest;
af988bbf
KN
184
185 return frame;
186}
187
188static SCM
189vm_heapify_frames (SCM vm)
190{
191 struct scm_vm *vp = SCM_VM_DATA (vm);
192 if (SCM_FALSEP (SCM_FRAME_HEAP_LINK (vp->fp)))
193 {
a6df585a
KN
194 SCM *dest;
195 vp->this_frame = vm_heapify_frames_1 (vp, vp->fp, vp->sp, &dest);
af988bbf 196 vp->fp = SCM_HEAP_FRAME_POINTER (vp->this_frame);
a6df585a 197 vp->sp = dest - 1;
af988bbf
KN
198 }
199 return vp->this_frame;
200}
201
a98cef7e
KN
202\f
203/*
204 * VM
205 */
206
c0a25ecc 207#define VM_DEFAULT_STACK_SIZE (16 * 1024)
17e90c5e
KN
208
209#define VM_REGULAR_ENGINE 0
210#define VM_DEBUG_ENGINE 1
211
212#if 0
213#define VM_NAME vm_regular_engine
214#define VM_ENGINE VM_REGULAR_ENGINE
215#include "vm_engine.c"
216#undef VM_NAME
217#undef VM_ENGINE
218#endif
219
220#define VM_NAME vm_debug_engine
221#define VM_ENGINE VM_DEBUG_ENGINE
222#include "vm_engine.c"
223#undef VM_NAME
224#undef VM_ENGINE
225
226scm_bits_t scm_tc16_vm;
a98cef7e 227
499a4c07
KN
228static SCM the_vm;
229
a98cef7e 230static SCM
17e90c5e
KN
231make_vm (void)
232#define FUNC_NAME "make_vm"
a98cef7e 233{
17e90c5e 234 int i;
3d5ee0cd
KN
235 struct scm_vm *vp = SCM_MUST_MALLOC (sizeof (struct scm_vm));
236 vp->stack_size = VM_DEFAULT_STACK_SIZE;
237 vp->stack_base = SCM_MUST_MALLOC (vp->stack_size * sizeof (SCM));
3616e9e9
KN
238 vp->stack_limit = vp->stack_base + vp->stack_size - 3;
239 vp->ip = NULL;
240 vp->sp = vp->stack_base - 1;
241 vp->fp = NULL;
3d5ee0cd
KN
242 vp->time = 0;
243 vp->clock = 0;
244 vp->options = SCM_EOL;
af988bbf 245 vp->this_frame = SCM_BOOL_F;
ac99cb0c 246 vp->last_frame = SCM_BOOL_F;
17e90c5e 247 for (i = 0; i < SCM_VM_NUM_HOOKS; i++)
3d5ee0cd
KN
248 vp->hooks[i] = SCM_BOOL_F;
249 SCM_RETURN_NEWSMOB (scm_tc16_vm, vp);
a98cef7e 250}
17e90c5e 251#undef FUNC_NAME
a98cef7e
KN
252
253static SCM
17e90c5e 254vm_mark (SCM obj)
a98cef7e 255{
17e90c5e 256 int i;
3d5ee0cd 257 struct scm_vm *vp = SCM_VM_DATA (obj);
17e90c5e 258
af988bbf
KN
259 /* mark the stack conservatively */
260 scm_mark_locations ((SCM_STACKITEM *) vp->stack_base,
261 sizeof (SCM) * (vp->sp - vp->stack_base + 1));
a98cef7e 262
af988bbf 263 /* mark other objects */
17e90c5e 264 for (i = 0; i < SCM_VM_NUM_HOOKS; i++)
3d5ee0cd 265 scm_gc_mark (vp->hooks[i]);
af988bbf 266 scm_gc_mark (vp->this_frame);
ac99cb0c 267 scm_gc_mark (vp->last_frame);
3d5ee0cd 268 return vp->options;
a98cef7e
KN
269}
270
17e90c5e
KN
271static scm_sizet
272vm_free (SCM obj)
273{
3d5ee0cd
KN
274 struct scm_vm *vp = SCM_VM_DATA (obj);
275 int size = (sizeof (struct scm_vm) + vp->stack_size * sizeof (SCM));
276 scm_must_free (vp->stack_base);
277 scm_must_free (vp);
17e90c5e
KN
278 return size;
279}
280
281SCM_SYMBOL (sym_debug, "debug");
282
283SCM
284scm_vm_apply (SCM vm, SCM program, SCM args)
285#define FUNC_NAME "scm_vm_apply"
a98cef7e 286{
17e90c5e 287 SCM_VALIDATE_PROGRAM (1, program);
41f248a8 288 return vm_run (vm, program, args);
a98cef7e 289}
17e90c5e 290#undef FUNC_NAME
a98cef7e
KN
291
292/* Scheme interface */
293
294SCM_DEFINE (scm_vm_version, "vm-version", 0, 0, 0,
17e90c5e
KN
295 (void),
296 "")
a98cef7e
KN
297#define FUNC_NAME s_scm_vm_version
298{
299 return scm_makfrom0str (VERSION);
300}
301#undef FUNC_NAME
302
499a4c07
KN
303SCM_DEFINE (scm_the_vm, "the-vm", 0, 0, 0,
304 (),
305 "")
306#define FUNC_NAME s_scm_the_vm
307{
308 return the_vm;
309}
310#undef FUNC_NAME
311
312
a98cef7e
KN
313SCM_DEFINE (scm_vm_p, "vm?", 1, 0, 0,
314 (SCM obj),
17e90c5e 315 "")
a98cef7e
KN
316#define FUNC_NAME s_scm_vm_p
317{
318 return SCM_BOOL (SCM_VM_P (obj));
319}
320#undef FUNC_NAME
321
322SCM_DEFINE (scm_make_vm, "make-vm", 0, 0, 0,
17e90c5e
KN
323 (void),
324 "")
325#define FUNC_NAME s_scm_make_vm,
a98cef7e 326{
17e90c5e 327 return make_vm ();
a98cef7e
KN
328}
329#undef FUNC_NAME
330
17e90c5e 331SCM_DEFINE (scm_vm_ip, "vm:ip", 1, 0, 0,
a98cef7e 332 (SCM vm),
17e90c5e
KN
333 "")
334#define FUNC_NAME s_scm_vm_ip
a98cef7e
KN
335{
336 SCM_VALIDATE_VM (1, vm);
17e90c5e 337 return scm_ulong2num ((unsigned long) SCM_VM_DATA (vm)->ip);
a98cef7e
KN
338}
339#undef FUNC_NAME
340
341SCM_DEFINE (scm_vm_sp, "vm:sp", 1, 0, 0,
342 (SCM vm),
17e90c5e 343 "")
a98cef7e
KN
344#define FUNC_NAME s_scm_vm_sp
345{
346 SCM_VALIDATE_VM (1, vm);
17e90c5e 347 return scm_ulong2num ((unsigned long) SCM_VM_DATA (vm)->sp);
a98cef7e
KN
348}
349#undef FUNC_NAME
350
351SCM_DEFINE (scm_vm_fp, "vm:fp", 1, 0, 0,
352 (SCM vm),
17e90c5e 353 "")
a98cef7e
KN
354#define FUNC_NAME s_scm_vm_fp
355{
356 SCM_VALIDATE_VM (1, vm);
17e90c5e 357 return scm_ulong2num ((unsigned long) SCM_VM_DATA (vm)->fp);
a98cef7e
KN
358}
359#undef FUNC_NAME
360
17e90c5e
KN
361#define VM_DEFINE_HOOK(n) \
362{ \
3d5ee0cd 363 struct scm_vm *vp; \
17e90c5e 364 SCM_VALIDATE_VM (1, vm); \
3d5ee0cd
KN
365 vp = SCM_VM_DATA (vm); \
366 if (SCM_FALSEP (vp->hooks[n])) \
367 vp->hooks[n] = scm_make_hook (SCM_MAKINUM (1)); \
368 return vp->hooks[n]; \
17e90c5e
KN
369}
370
371SCM_DEFINE (scm_vm_boot_hook, "vm-boot-hook", 1, 0, 0,
a98cef7e 372 (SCM vm),
17e90c5e
KN
373 "")
374#define FUNC_NAME s_scm_vm_boot_hook
a98cef7e 375{
17e90c5e 376 VM_DEFINE_HOOK (SCM_VM_BOOT_HOOK);
a98cef7e
KN
377}
378#undef FUNC_NAME
379
17e90c5e
KN
380SCM_DEFINE (scm_vm_halt_hook, "vm-halt-hook", 1, 0, 0,
381 (SCM vm),
382 "")
383#define FUNC_NAME s_scm_vm_halt_hook
a98cef7e 384{
17e90c5e 385 VM_DEFINE_HOOK (SCM_VM_HALT_HOOK);
a98cef7e
KN
386}
387#undef FUNC_NAME
388
17e90c5e 389SCM_DEFINE (scm_vm_next_hook, "vm-next-hook", 1, 0, 0,
a98cef7e 390 (SCM vm),
17e90c5e
KN
391 "")
392#define FUNC_NAME s_scm_vm_next_hook
a98cef7e 393{
17e90c5e 394 VM_DEFINE_HOOK (SCM_VM_NEXT_HOOK);
a98cef7e
KN
395}
396#undef FUNC_NAME
397
17e90c5e
KN
398SCM_DEFINE (scm_vm_enter_hook, "vm-enter-hook", 1, 0, 0,
399 (SCM vm),
400 "")
401#define FUNC_NAME s_scm_vm_enter_hook
a98cef7e 402{
17e90c5e 403 VM_DEFINE_HOOK (SCM_VM_ENTER_HOOK);
a98cef7e
KN
404}
405#undef FUNC_NAME
406
17e90c5e
KN
407SCM_DEFINE (scm_vm_apply_hook, "vm-apply-hook", 1, 0, 0,
408 (SCM vm),
409 "")
410#define FUNC_NAME s_scm_vm_apply_hook
a98cef7e 411{
17e90c5e 412 VM_DEFINE_HOOK (SCM_VM_APPLY_HOOK);
a98cef7e
KN
413}
414#undef FUNC_NAME
415
17e90c5e 416SCM_DEFINE (scm_vm_exit_hook, "vm-exit-hook", 1, 0, 0,
a98cef7e 417 (SCM vm),
17e90c5e
KN
418 "")
419#define FUNC_NAME s_scm_vm_exit_hook
a98cef7e 420{
17e90c5e 421 VM_DEFINE_HOOK (SCM_VM_EXIT_HOOK);
a98cef7e
KN
422}
423#undef FUNC_NAME
424
17e90c5e 425SCM_DEFINE (scm_vm_return_hook, "vm-return-hook", 1, 0, 0,
a98cef7e 426 (SCM vm),
17e90c5e
KN
427 "")
428#define FUNC_NAME s_scm_vm_return_hook
a98cef7e 429{
17e90c5e 430 VM_DEFINE_HOOK (SCM_VM_RETURN_HOOK);
a98cef7e
KN
431}
432#undef FUNC_NAME
433
17e90c5e
KN
434SCM_DEFINE (scm_vm_option, "vm-option", 2, 0, 0,
435 (SCM vm, SCM key),
436 "")
437#define FUNC_NAME s_scm_vm_option
a98cef7e
KN
438{
439 SCM_VALIDATE_VM (1, vm);
17e90c5e 440 return scm_assq_ref (SCM_VM_DATA (vm)->options, key);
a98cef7e
KN
441}
442#undef FUNC_NAME
443
17e90c5e
KN
444SCM_DEFINE (scm_set_vm_option_x, "set-vm-option!", 3, 0, 0,
445 (SCM vm, SCM key, SCM val),
446 "")
447#define FUNC_NAME s_scm_set_vm_option_x
a98cef7e
KN
448{
449 SCM_VALIDATE_VM (1, vm);
17e90c5e
KN
450 SCM_VM_DATA (vm)->options
451 = scm_assq_set_x (SCM_VM_DATA (vm)->options, key, val);
452 return SCM_UNSPECIFIED;
a98cef7e
KN
453}
454#undef FUNC_NAME
455
17e90c5e 456SCM_DEFINE (scm_vm_stats, "vm-stats", 1, 0, 0,
a98cef7e 457 (SCM vm),
17e90c5e
KN
458 "")
459#define FUNC_NAME s_scm_vm_stats
a98cef7e 460{
17e90c5e
KN
461 SCM stats;
462
a98cef7e 463 SCM_VALIDATE_VM (1, vm);
17e90c5e 464
499a4c07 465 stats = scm_c_make_vector (2, SCM_MAKINUM (0));
af988bbf
KN
466 SCM_VELTS (stats)[0] = scm_ulong2num (SCM_VM_DATA (vm)->time);
467 SCM_VELTS (stats)[1] = scm_ulong2num (SCM_VM_DATA (vm)->clock);
17e90c5e
KN
468
469 return stats;
a98cef7e
KN
470}
471#undef FUNC_NAME
472
17e90c5e
KN
473#define VM_CHECK_RUNNING(vm) \
474 if (!SCM_VM_DATA (vm)->ip) \
475 SCM_MISC_ERROR ("Not running", SCM_LIST1 (vm))
476
af988bbf 477SCM_DEFINE (scm_vm_this_frame, "vm-this-frame", 1, 0, 0,
a98cef7e 478 (SCM vm),
17e90c5e 479 "")
af988bbf 480#define FUNC_NAME s_scm_vm_this_frame
a98cef7e
KN
481{
482 SCM_VALIDATE_VM (1, vm);
af988bbf 483 return SCM_VM_DATA (vm)->this_frame;
ac99cb0c
KN
484}
485#undef FUNC_NAME
486
487SCM_DEFINE (scm_vm_last_frame, "vm-last-frame", 1, 0, 0,
488 (SCM vm),
489 "")
490#define FUNC_NAME s_scm_vm_last_frame
491{
492 SCM_VALIDATE_VM (1, vm);
493 return SCM_VM_DATA (vm)->last_frame;
a98cef7e
KN
494}
495#undef FUNC_NAME
496
17e90c5e
KN
497SCM_DEFINE (scm_vm_fetch_code, "vm-fetch-code", 1, 0, 0,
498 (SCM vm),
499 "")
500#define FUNC_NAME s_scm_vm_fetch_code
501{
502 int i;
503 SCM list;
504 scm_byte_t *ip;
505 struct scm_instruction *p;
a98cef7e 506
17e90c5e
KN
507 SCM_VALIDATE_VM (1, vm);
508 VM_CHECK_RUNNING (vm);
a98cef7e 509
17e90c5e
KN
510 ip = SCM_VM_DATA (vm)->ip;
511 p = SCM_INSTRUCTION (*ip);
a98cef7e 512
17e90c5e
KN
513 list = SCM_LIST1 (scm_str2symbol (p->name));
514 for (i = 1; i <= p->len; i++)
515 list = scm_cons (SCM_MAKINUM (ip[i]), list);
516 return scm_reverse_x (list, SCM_EOL);
517}
518#undef FUNC_NAME
519
520SCM_DEFINE (scm_vm_fetch_stack, "vm-fetch-stack", 1, 0, 0,
521 (SCM vm),
522 "")
523#define FUNC_NAME s_scm_vm_fetch_stack
a98cef7e 524{
3616e9e9
KN
525 SCM *sp;
526 SCM ls = SCM_EOL;
527 struct scm_vm *vp;
a98cef7e
KN
528
529 SCM_VALIDATE_VM (1, vm);
17e90c5e 530 VM_CHECK_RUNNING (vm);
a98cef7e 531
3616e9e9 532 vp = SCM_VM_DATA (vm);
af988bbf 533 for (sp = vp->stack_base; sp <= vp->sp; sp++)
3616e9e9
KN
534 ls = scm_cons (*sp, ls);
535 return ls;
a98cef7e
KN
536}
537#undef FUNC_NAME
538
539\f
540/*
17e90c5e 541 * Initialize
a98cef7e
KN
542 */
543
17e90c5e
KN
544void
545scm_init_vm (void)
546{
ac99cb0c 547 scm_init_frames ();
17e90c5e 548 scm_init_instructions ();
8f5cfc81 549 scm_init_objcodes ();
ac99cb0c 550 scm_init_programs ();
a98cef7e 551
17e90c5e
KN
552 scm_tc16_vm_cont = scm_make_smob_type ("vm-cont", 0);
553 scm_set_smob_mark (scm_tc16_vm_cont, vm_cont_mark);
554 scm_set_smob_free (scm_tc16_vm_cont, vm_cont_free);
a98cef7e 555
17e90c5e
KN
556 scm_tc16_vm = scm_make_smob_type ("vm", 0);
557 scm_set_smob_mark (scm_tc16_vm, vm_mark);
558 scm_set_smob_free (scm_tc16_vm, vm_free);
559 scm_set_smob_apply (scm_tc16_vm, scm_vm_apply, 1, 0, 1);
a98cef7e 560
499a4c07
KN
561 the_vm = scm_permanent_object (make_vm ());
562
17e90c5e 563#ifndef SCM_MAGIC_SNARFER
a98cef7e 564#include "vm.x"
17e90c5e 565#endif
a98cef7e 566}
17e90c5e
KN
567
568/*
569 Local Variables:
570 c-file-style: "gnu"
571 End:
572*/