Commit | Line | Data |
---|---|---|
a98cef7e KN |
1 | /* Copyright (C) 2000 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 | ||
17e90c5e KN |
42 | #ifndef _VM_H_ |
43 | #define _VM_H_ | |
a98cef7e KN |
44 | |
45 | #include <libguile.h> | |
77c04abe | 46 | #include "config.h" |
17e90c5e | 47 | #include "programs.h" |
a98cef7e | 48 | |
a98cef7e | 49 | /* |
17e90c5e | 50 | * VM Address |
a98cef7e KN |
51 | */ |
52 | ||
3616e9e9 KN |
53 | #define SCM_VM_MAKE_STACK_ADDRESS(ptr) SCM_PACK (ptr) |
54 | #define SCM_VM_STACK_ADDRESS(addr) ((SCM *) SCM_UNPACK (addr)) | |
a98cef7e | 55 | |
17e90c5e KN |
56 | #define SCM_VM_MAKE_BYTE_ADDRESS(ptr) SCM_PACK (ptr) |
57 | #define SCM_VM_BYTE_ADDRESS(addr) ((scm_byte_t *) SCM_UNPACK (addr)) | |
a98cef7e | 58 | |
a98cef7e | 59 | /* |
3616e9e9 | 60 | * VM Stack frame |
a98cef7e KN |
61 | */ |
62 | ||
a98cef7e | 63 | /* |
41f248a8 | 64 | | | <- fp + bp->nargs + bp->nlocs + 3 |
3d5ee0cd | 65 | +------------------+ = SCM_VM_FRAME_UPPER_ADDRESS (fp) |
41f248a8 | 66 | | Return address | |
17e90c5e | 67 | | Dynamic link | |
41f248a8 | 68 | | External link | <- fp + bp->nargs + bp->nlocs |
3616e9e9 KN |
69 | | Local varialbe 1 | = SCM_VM_FRAME_DATA_ADDRESS (fp) |
70 | | Local variable 0 | <- fp + bp->nargs | |
71 | | Argument 1 | | |
72 | | Argument 0 | <- fp | |
73 | | Program | <- fp - 1 | |
3d5ee0cd | 74 | +------------------+ = SCM_VM_FRAME_LOWER_ADDRESS (fp) |
17e90c5e KN |
75 | | | |
76 | */ | |
77 | ||
3616e9e9 | 78 | #define SCM_VM_FRAME_DATA_ADDRESS(fp) \ |
17e90c5e KN |
79 | (fp + SCM_PROGRAM_NARGS (SCM_VM_FRAME_PROGRAM (fp)) \ |
80 | + SCM_PROGRAM_NLOCS (SCM_VM_FRAME_PROGRAM (fp))) | |
3616e9e9 | 81 | #define SCM_VM_FRAME_UPPER_ADDRESS(fp) \ |
41f248a8 KN |
82 | (SCM_VM_FRAME_DATA_ADDRESS (fp) + 3) |
83 | #define SCM_VM_FRAME_LOWER_ADDRESS(fp) (fp - 1) | |
3616e9e9 | 84 | |
41f248a8 | 85 | #define SCM_VM_FRAME_RETURN_ADDRESS(fp) SCM_VM_FRAME_DATA_ADDRESS (fp)[2] |
3616e9e9 | 86 | #define SCM_VM_FRAME_DYNAMIC_LINK(fp) SCM_VM_FRAME_DATA_ADDRESS (fp)[1] |
41f248a8 | 87 | #define SCM_VM_FRAME_EXTERNAL_LINK(fp) SCM_VM_FRAME_DATA_ADDRESS (fp)[0] |
3616e9e9 KN |
88 | #define SCM_VM_FRAME_VARIABLE(fp,i) fp[i] |
89 | #define SCM_VM_FRAME_PROGRAM(fp) fp[-1] | |
a98cef7e | 90 | |
a98cef7e | 91 | /* |
3616e9e9 | 92 | * VM Heap frame |
a98cef7e KN |
93 | */ |
94 | ||
3616e9e9 KN |
95 | struct scm_vm_heap_frame { |
96 | SCM *fp; | |
17e90c5e KN |
97 | SCM program; |
98 | SCM variables; | |
99 | SCM dynamic_link; | |
41f248a8 | 100 | SCM external_link; |
17e90c5e | 101 | }; |
a98cef7e | 102 | |
3616e9e9 | 103 | extern scm_bits_t scm_tc16_vm_heap_frame; |
a98cef7e | 104 | |
3616e9e9 KN |
105 | #define SCM_VM_HEAP_FRAME_P(x) SCM_SMOB_PREDICATE (scm_tc16_vm_heap_frame, x) |
106 | #define SCM_VM_HEAP_FRAME_DATA(f) ((struct scm_vm_heap_frame *) SCM_SMOB_DATA (f)) | |
107 | #define SCM_VALIDATE_VM_HEAP_FRAME(p,x) SCM_MAKE_VALIDATE (p, x, VM_HEAP_FRAME_P) | |
a98cef7e | 108 | |
3616e9e9 KN |
109 | #define SCM_VM_HEAP_FRAME_PROGRAM(f) SCM_VM_HEAP_FRAME_DATA (f)->program |
110 | #define SCM_VM_HEAP_FRAME_VARIABLES(f) SCM_VM_HEAP_FRAME_DATA (f)->variables | |
111 | #define SCM_VM_HEAP_FRAME_DYNAMIC_LINK(f) SCM_VM_HEAP_FRAME_DATA (f)->dynamic_link | |
41f248a8 | 112 | #define SCM_VM_HEAP_FRAME_EXTERNAL_LINK(f) SCM_VM_HEAP_FRAME_DATA (f)->external_link |
a98cef7e | 113 | |
a98cef7e | 114 | /* |
17e90c5e | 115 | * VM |
a98cef7e KN |
116 | */ |
117 | ||
17e90c5e KN |
118 | #define SCM_VM_BOOT_HOOK 0 |
119 | #define SCM_VM_HALT_HOOK 1 | |
120 | #define SCM_VM_NEXT_HOOK 2 | |
121 | #define SCM_VM_ENTER_HOOK 3 | |
122 | #define SCM_VM_APPLY_HOOK 4 | |
123 | #define SCM_VM_EXIT_HOOK 5 | |
124 | #define SCM_VM_RETURN_HOOK 6 | |
125 | #define SCM_VM_NUM_HOOKS 7 | |
a98cef7e | 126 | |
17e90c5e KN |
127 | struct scm_vm { |
128 | scm_byte_t *ip; /* instruction pointer */ | |
129 | SCM *sp; /* stack pointer */ | |
130 | SCM *fp; /* frame pointer */ | |
131 | size_t stack_size; /* stack size */ | |
132 | SCM *stack_base; /* stack base address */ | |
133 | SCM *stack_limit; /* stack limit address */ | |
134 | SCM hooks[SCM_VM_NUM_HOOKS]; /* hooks */ | |
135 | SCM options; /* options */ | |
17e90c5e KN |
136 | unsigned long time; /* time spent */ |
137 | unsigned long clock; /* bogos clock */ | |
138 | }; | |
a98cef7e | 139 | |
17e90c5e KN |
140 | #define SCM_VM_P(x) SCM_SMOB_PREDICATE (scm_tc16_vm, x) |
141 | #define SCM_VM_DATA(vm) ((struct scm_vm *) SCM_SMOB_DATA (vm)) | |
142 | #define SCM_VALIDATE_VM(pos,x) SCM_MAKE_VALIDATE (pos, x, VM_P) | |
a98cef7e | 143 | |
499a4c07 | 144 | extern SCM scm_the_vm (); |
17e90c5e KN |
145 | extern SCM scm_make_vm (void); |
146 | extern SCM scm_vm_apply (SCM vm, SCM program, SCM args); | |
147 | extern SCM scm_vm_option_ref (SCM vm, SCM key); | |
148 | extern SCM scm_vm_option_set_x (SCM vm, SCM key, SCM val); | |
a98cef7e | 149 | |
17e90c5e | 150 | extern SCM scm_vm_current_frame (SCM vm); |
a98cef7e | 151 | |
17e90c5e | 152 | extern void scm_init_vm (void); |
a98cef7e | 153 | |
17e90c5e | 154 | #endif /* _VM_H_ */ |
a98cef7e | 155 | |
17e90c5e KN |
156 | /* |
157 | Local Variables: | |
158 | c-file-style: "gnu" | |
159 | End: | |
160 | */ |