1 /*******************************************************************************
2 *
3 * MODULE: object.c
4 *
5 ********************************************************************************
6 *
7 * DESCRIPTION: C::B::C object
8 *
9 ********************************************************************************
10 *
11 * Copyright (c) 2002-2020 Marcus Holland-Moritz. All rights reserved.
12 * This program is free software; you can redistribute it and/or modify
13 * it under the same terms as Perl itself.
14 *
15 *******************************************************************************/
16
17 /*===== GLOBAL INCLUDES ======================================================*/
18
19 #define PERL_NO_GET_CONTEXT
20 #include <EXTERN.h>
21 #include <perl.h>
22 #include <XSUB.h>
23
24 #include "ppport.h"
25
26
27 /*===== LOCAL INCLUDES =======================================================*/
28
29 #include "util/hash.h"
30 #include "util/list.h"
31 #include "ctlib/ctparse.h"
32 #include "cbc/basic.h"
33 #include "cbc/cbc.h"
34 #include "cbc/object.h"
35 #include "cbc/hook.h"
36 #include "cbc/util.h"
37
38
39 /*===== DEFINES ==============================================================*/
40
41 /*===== TYPEDEFS =============================================================*/
42
43 /*===== STATIC FUNCTION PROTOTYPES ===========================================*/
44
45 /*===== EXTERNAL VARIABLES ===================================================*/
46
47 /*===== GLOBAL VARIABLES =====================================================*/
48
49 /*===== STATIC VARIABLES =====================================================*/
50
51 /*===== STATIC FUNCTIONS =====================================================*/
52
53 /*===== FUNCTIONS ============================================================*/
54
55 /*******************************************************************************
56 *
57 * ROUTINE: cbc_new
58 *
59 * WRITTEN BY: Marcus Holland-Moritz ON: Dec 2004
60 * CHANGED BY: ON:
61 *
62 ********************************************************************************
63 *
64 * DESCRIPTION:
65 *
66 * ARGUMENTS:
67 *
68 * RETURNS:
69 *
70 *******************************************************************************/
71
cbc_new(pTHX)72 CBC *cbc_new(pTHX)
73 {
74 SV *sv;
75 CBC *THIS;
76
77 Newz(0, THIS, 1, CBC);
78
79 sv = newSViv(PTR2IV(THIS));
80 SvREADONLY_on(sv);
81
82 THIS->hv = newHV();
83
84 if (hv_store(THIS->hv, "", 0, sv, 0) == NULL)
85 fatal("Couldn't store THIS into object.");
86
87 THIS->enumType = CBC_DEFAULT_ENUMTYPE;
88 THIS->ixhash = NULL;
89
90 THIS->basic = basic_types_new();
91
92 THIS->cfg.layout.ptr_size = CBC_DEFAULT_PTR_SIZE;
93 THIS->cfg.layout.enum_size = CBC_DEFAULT_ENUM_SIZE;
94 THIS->cfg.layout.int_size = CBC_DEFAULT_INT_SIZE;
95 THIS->cfg.layout.char_size = CBC_DEFAULT_CHAR_SIZE;
96 THIS->cfg.layout.short_size = CBC_DEFAULT_SHORT_SIZE;
97 THIS->cfg.layout.long_size = CBC_DEFAULT_LONG_SIZE;
98 THIS->cfg.layout.long_long_size = CBC_DEFAULT_LONG_LONG_SIZE;
99 THIS->cfg.layout.float_size = CBC_DEFAULT_FLOAT_SIZE;
100 THIS->cfg.layout.double_size = CBC_DEFAULT_DOUBLE_SIZE;
101 THIS->cfg.layout.long_double_size = CBC_DEFAULT_LONG_DOUBLE_SIZE;
102 THIS->cfg.layout.alignment = CBC_DEFAULT_ALIGNMENT;
103 THIS->cfg.layout.compound_alignment = CBC_DEFAULT_COMPOUND_ALIGNMENT;
104 THIS->cfg.layout.byte_order = CBC_DEFAULT_BYTEORDER;
105 THIS->cfg.layout.bflayouter = bl_create("Generic");
106
107 THIS->cfg.get_type_info = get_type_info_generic;
108 THIS->cfg.layout_compound = layout_compound_generic;
109 THIS->cfg.includes = LL_new();
110 THIS->cfg.defines = LL_new();
111 THIS->cfg.assertions = LL_new();
112 THIS->cfg.disabled_keywords = LL_new();
113 THIS->cfg.keyword_map = HT_new(1);
114 THIS->cfg.keywords = HAS_ALL_KEYWORDS;
115 THIS->cfg.has_cpp_comments = 1;
116 THIS->cfg.has_macro_vaargs = 1;
117 THIS->cfg.has_std_c = 1;
118 THIS->cfg.has_std_c_hosted = 1;
119 THIS->cfg.is_std_c_hosted = 1;
120 THIS->cfg.std_c_version = 199901L;
121
122 init_parse_info(&THIS->cpi);
123
124 return THIS;
125 }
126
127 /*******************************************************************************
128 *
129 * ROUTINE: cbc_delete
130 *
131 * WRITTEN BY: Marcus Holland-Moritz ON: Dec 2004
132 * CHANGED BY: ON:
133 *
134 ********************************************************************************
135 *
136 * DESCRIPTION:
137 *
138 * ARGUMENTS:
139 *
140 * RETURNS:
141 *
142 *******************************************************************************/
143
cbc_delete(pTHX_ CBC * THIS)144 void cbc_delete(pTHX_ CBC *THIS)
145 {
146 free_parse_info(&THIS->cpi);
147
148 LL_destroy(THIS->cfg.includes, (LLDestroyFunc) string_delete);
149 LL_destroy(THIS->cfg.defines, (LLDestroyFunc) string_delete);
150 LL_destroy(THIS->cfg.assertions, (LLDestroyFunc) string_delete);
151 LL_destroy(THIS->cfg.disabled_keywords, (LLDestroyFunc) string_delete);
152
153 basic_types_delete(THIS->basic);
154
155 HT_destroy(THIS->cfg.keyword_map, NULL);
156
157 THIS->cfg.layout.bflayouter->m->destroy(THIS->cfg.layout.bflayouter);
158
159 Safefree(THIS);
160 }
161
162 /*******************************************************************************
163 *
164 * ROUTINE: cbc_clone
165 *
166 * WRITTEN BY: Marcus Holland-Moritz ON: Dec 2004
167 * CHANGED BY: ON:
168 *
169 ********************************************************************************
170 *
171 * DESCRIPTION:
172 *
173 * ARGUMENTS:
174 *
175 * RETURNS:
176 *
177 *******************************************************************************/
178
cbc_clone(pTHX_ const CBC * THIS)179 CBC *cbc_clone(pTHX_ const CBC *THIS)
180 {
181 SV *sv;
182 CBC *clone;
183
184 Newz(0, clone, 1, CBC);
185 Copy(THIS, clone, 1, CBC);
186
187 clone->cfg.includes = clone_string_list(THIS->cfg.includes);
188 clone->cfg.defines = clone_string_list(THIS->cfg.defines);
189 clone->cfg.assertions = clone_string_list(THIS->cfg.assertions);
190 clone->cfg.disabled_keywords = clone_string_list(THIS->cfg.disabled_keywords);
191
192 clone->basic = basic_types_clone(THIS->basic);
193
194 clone->cfg.keyword_map = HT_clone(THIS->cfg.keyword_map, NULL);
195
196 clone->cfg.layout.bflayouter =
197 THIS->cfg.layout.bflayouter->m->clone(THIS->cfg.layout.bflayouter);
198
199 init_parse_info(&clone->cpi);
200 clone_parse_info(&clone->cpi, &THIS->cpi);
201
202 sv = newSViv(PTR2IV(clone));
203 SvREADONLY_on(sv);
204
205 clone->hv = newHV();
206
207 if (hv_store(clone->hv, "", 0, sv, 0) == NULL)
208 fatal("Couldn't store THIS into object.");
209
210 return clone;
211 }
212
213 /*******************************************************************************
214 *
215 * ROUTINE: cbc_bless
216 *
217 * WRITTEN BY: Marcus Holland-Moritz ON: Dec 2004
218 * CHANGED BY: ON:
219 *
220 ********************************************************************************
221 *
222 * DESCRIPTION:
223 *
224 * ARGUMENTS:
225 *
226 * RETURNS:
227 *
228 *******************************************************************************/
229
cbc_bless(pTHX_ CBC * THIS,const char * CLASS)230 SV *cbc_bless(pTHX_ CBC *THIS, const char *CLASS)
231 {
232 SV *sv;
233
234 sv = newRV_noinc((SV *) THIS->hv);
235 sv_bless(sv, gv_stashpv(CONST_CHAR(CLASS), 0));
236
237 return sv;
238 }
239
240