Commit | Line | Data |
---|---|---|
510ca126 | 1 | /* Copyright (C) 2001, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. |
17e90c5e | 2 | * |
560b9c25 | 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. | |
17e90c5e | 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. | |
17e90c5e | 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 | */ |
17e90c5e | 18 | |
8f5cfc81 KN |
19 | #ifndef _SCM_PROGRAMS_H_ |
20 | #define _SCM_PROGRAMS_H_ | |
17e90c5e KN |
21 | |
22 | #include <libguile.h> | |
53e28ed9 | 23 | #include <libguile/objcodes.h> |
17e90c5e | 24 | |
510ca126 AW |
25 | /* |
26 | * The new RTL programs. | |
27 | */ | |
28 | ||
29 | #define SCM_RTL_PROGRAM_P(x) (SCM_HAS_TYP7 (x, scm_tc7_rtl_program)) | |
30 | #define SCM_RTL_PROGRAM_CODE(x) ((scm_t_uint32 *) SCM_CELL_WORD_1 (x)) | |
31 | #define SCM_RTL_PROGRAM_FREE_VARIABLES(x) (SCM_CELL_OBJECT_LOC (x, 2)) | |
32 | #define SCM_RTL_PROGRAM_FREE_VARIABLE_REF(x,i) (SCM_RTL_PROGRAM_FREE_VARIABLES (x)[i]) | |
33 | #define SCM_RTL_PROGRAM_FREE_VARIABLE_SET(x,i,v) (SCM_RTL_PROGRAM_FREE_VARIABLES (x)[i]=(v)) | |
34 | #define SCM_RTL_PROGRAM_NUM_FREE_VARIABLES(x) (SCM_CELL_WORD_0 (x) >> 16) | |
35 | #define SCM_VALIDATE_RTL_PROGRAM(p,x) SCM_MAKE_VALIDATE (p, x, RTL_PROGRAM_P) | |
36 | ||
37 | static inline SCM | |
38 | scm_i_make_rtl_program (const scm_t_uint32 *code) | |
39 | { | |
40 | return scm_cell (scm_tc7_rtl_program, (scm_t_bits)code); | |
41 | } | |
42 | ||
43 | SCM_INTERNAL SCM scm_make_rtl_program (SCM bytevector, SCM byte_offset, SCM free_variables); | |
44 | SCM_INTERNAL SCM scm_rtl_program_p (SCM obj); | |
45 | SCM_INTERNAL SCM scm_rtl_program_code (SCM program); | |
46 | ||
27337b63 AW |
47 | SCM_INTERNAL SCM scm_primitive_p (SCM obj); |
48 | SCM_INTERNAL SCM scm_primitive_call_ip (SCM prim); | |
49 | ||
e65f80af | 50 | SCM_INTERNAL SCM scm_i_rtl_program_name (SCM program); |
bf8328ec | 51 | SCM_INTERNAL SCM scm_i_rtl_program_documentation (SCM program); |
c4c098e3 | 52 | SCM_INTERNAL SCM scm_i_rtl_program_properties (SCM program); |
510ca126 | 53 | |
17e90c5e KN |
54 | /* |
55 | * Programs | |
56 | */ | |
57 | ||
ba20f78a | 58 | #define SCM_F_PROGRAM_IS_BOOT 0x100 |
1d1cae0e AW |
59 | #define SCM_F_PROGRAM_IS_PRIMITIVE 0x200 |
60 | #define SCM_F_PROGRAM_IS_PRIMITIVE_GENERIC 0x400 | |
61 | #define SCM_F_PROGRAM_IS_CONTINUATION 0x800 | |
2150e9a8 | 62 | #define SCM_F_PROGRAM_IS_PARTIAL_CONTINUATION 0x1000 |
17e90c5e | 63 | |
dc7da0be | 64 | #define SCM_PROGRAM_P(x) (SCM_HAS_TYP7 (x, scm_tc7_program)) |
2fb924f6 AW |
65 | #define SCM_PROGRAM_OBJCODE(x) (SCM_CELL_OBJECT_1 (x)) |
66 | #define SCM_PROGRAM_OBJTABLE(x) (SCM_CELL_OBJECT_2 (x)) | |
6f16379e AW |
67 | #define SCM_PROGRAM_FREE_VARIABLES(x) (SCM_CELL_OBJECT_LOC (x, 3)) |
68 | #define SCM_PROGRAM_FREE_VARIABLE_REF(x,i) (SCM_PROGRAM_FREE_VARIABLES (x)[i]) | |
69 | #define SCM_PROGRAM_FREE_VARIABLE_SET(x,i,v) (SCM_PROGRAM_FREE_VARIABLES (x)[i]=(v)) | |
70 | #define SCM_PROGRAM_NUM_FREE_VARIABLES(x) (SCM_CELL_WORD_0 (x) >> 16) | |
53e28ed9 | 71 | #define SCM_PROGRAM_DATA(x) (SCM_OBJCODE_DATA (SCM_PROGRAM_OBJCODE (x))) |
17e90c5e | 72 | #define SCM_VALIDATE_PROGRAM(p,x) SCM_MAKE_VALIDATE (p, x, PROGRAM_P) |
2fb924f6 | 73 | #define SCM_PROGRAM_IS_BOOT(x) (SCM_CELL_WORD_0 (x) & SCM_F_PROGRAM_IS_BOOT) |
cc7005bc | 74 | #define SCM_PROGRAM_IS_PRIMITIVE(x) (SCM_CELL_WORD_0 (x) & SCM_F_PROGRAM_IS_PRIMITIVE) |
f318aa1e | 75 | #define SCM_PROGRAM_IS_PRIMITIVE_GENERIC(x) (SCM_CELL_WORD_0 (x) & SCM_F_PROGRAM_IS_PRIMITIVE_GENERIC) |
1d1cae0e | 76 | #define SCM_PROGRAM_IS_CONTINUATION(x) (SCM_CELL_WORD_0 (x) & SCM_F_PROGRAM_IS_CONTINUATION) |
2150e9a8 | 77 | #define SCM_PROGRAM_IS_PARTIAL_CONTINUATION(x) (SCM_CELL_WORD_0 (x) & SCM_F_PROGRAM_IS_PARTIAL_CONTINUATION) |
17e90c5e | 78 | |
57ab0671 | 79 | SCM_API SCM scm_make_program (SCM objcode, SCM objtable, SCM free_variables); |
17e90c5e | 80 | |
560b9c25 AW |
81 | SCM_API SCM scm_program_p (SCM obj); |
82 | SCM_API SCM scm_program_base (SCM program); | |
560b9c25 AW |
83 | SCM_API SCM scm_program_meta (SCM program); |
84 | SCM_API SCM scm_program_bindings (SCM program); | |
85 | SCM_API SCM scm_program_sources (SCM program); | |
b262b74b | 86 | SCM_API SCM scm_program_source (SCM program, SCM ip, SCM sources); |
6c6a4439 | 87 | SCM_API SCM scm_program_arities (SCM program); |
560b9c25 AW |
88 | SCM_API SCM scm_program_objects (SCM program); |
89 | SCM_API SCM scm_program_module (SCM program); | |
6f16379e AW |
90 | SCM_API SCM scm_program_num_free_variables (SCM program); |
91 | SCM_API SCM scm_program_free_variable_ref (SCM program, SCM i); | |
92 | SCM_API SCM scm_program_free_variable_set_x (SCM program, SCM i, SCM x); | |
560b9c25 | 93 | SCM_API SCM scm_program_objcode (SCM program); |
fcd4901b | 94 | |
07e424b7 | 95 | SCM_INTERNAL SCM scm_i_program_properties (SCM program); |
56164a5a | 96 | SCM_INTERNAL int scm_i_program_arity (SCM program, int *req, int *opt, int *rest); |
2fb924f6 AW |
97 | SCM_INTERNAL void scm_i_program_print (SCM program, SCM port, |
98 | scm_print_state *pstate); | |
560b9c25 AW |
99 | SCM_INTERNAL void scm_bootstrap_programs (void); |
100 | SCM_INTERNAL void scm_init_programs (void); | |
17e90c5e | 101 | |
8f5cfc81 | 102 | #endif /* _SCM_PROGRAMS_H_ */ |
17e90c5e KN |
103 | |
104 | /* | |
105 | Local Variables: | |
106 | c-file-style: "gnu" | |
107 | End: | |
108 | */ |