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