1 /* This file is part of GCC.
3 GCC is free software; you can redistribute it and/or modify it under
4 the terms of the GNU General Public License as published by the Free
5 Software Foundation; either version 3, or (at your option) any later
8 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
9 WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 You should have received a copy of the GNU General Public License
14 along with GCC; see the file COPYING3. If not see
15 <http://www.gnu.org/licenses/>. */
27 #include <gpython/gpython.h>
28 #include <gpython/vectors.h>
29 #include <gpython/objects.h>
30 #include <gpython/runtime.h>
32 #define GPY_ARG_LIT_CHECK(A,I,X) \
33 gpy_assert (A[I].T == TYPE_OBJECT_LIT); \
34 gpy_assert (A[I].o.literal.type == X); \
37 bool gpy_args_check_fmt (gpy_object_t
* args
, const char * fmt
)
43 for (i
= fmt
; *i
!= '\0'; ++i
)
56 GPY_ARG_LIT_CHECK (args
, idx
, TYPE_INTEGER
);
62 GPY_ARG_LIT_CHECK (args
, idx
, TYPE_STRING
);
68 GPY_ARG_LIT_CHECK (args
, idx
, TYPE_ADDR
);
74 GPY_ARG_LIT_CHECK (args
, idx
, TYPE_ATTRIB_L
);
80 GPY_ARG_LIT_CHECK (args
, idx
, TYPE_VEC
);
86 GPY_ARG_LIT_CHECK (args
, idx
, TYPE_STR_ARRY
);
92 error ("unhandled literal argument type <%c>!\n", *i
);
102 char ** gpy_args_lit_parse_sarray (gpy_object_t
* arg
)
104 char ** retval
= NULL
;
105 gpy_assert (arg
->T
== TYPE_OBJECT_LIT
);
106 gpy_assert (arg
->o
.literal
.type
== TYPE_STR_ARRY
);
108 retval
= arg
->o
.literal
.literal
.sarray
;
112 int gpy_args_lit_parse_int (gpy_object_t
* arg
)
115 gpy_assert (arg
->T
== TYPE_OBJECT_LIT
);
116 gpy_assert (arg
->o
.literal
.type
== TYPE_INTEGER
);
118 retval
= arg
->o
.literal
.literal
.integer
;
123 char * gpy_args_lit_parse_string (gpy_object_t
* arg
)
125 char * retval
= NULL
;
126 gpy_assert (arg
->T
== TYPE_OBJECT_LIT
);
127 gpy_assert (arg
->o
.literal
.type
== TYPE_STRING
);
129 retval
= strdup (arg
->o
.literal
.literal
.string
);
134 unsigned char * gpy_args_lit_parse_pointer (gpy_object_t
* arg
)
136 unsigned char * retval
= NULL
;
137 gpy_assert (arg
->T
== TYPE_OBJECT_LIT
);
138 gpy_assert (arg
->o
.literal
.type
== TYPE_ADDR
);
140 retval
= arg
->o
.literal
.literal
.addr
;
145 gpy_object_attrib_t
** gpy_args_lit_parse_attrib_table (gpy_object_t
* arg
)
147 gpy_object_attrib_t
** retval
= NULL
;
148 gpy_assert (arg
->T
== TYPE_OBJECT_LIT
);
149 gpy_assert (arg
->o
.literal
.type
== TYPE_ATTRIB_L
);
151 retval
= arg
->o
.literal
.literal
.attribs
;
156 gpy_object_t
** gpy_args_lit_parse_vec (gpy_object_t
* arg
)
158 gpy_object_t
** retval
= NULL
;
159 gpy_assert (arg
->T
== TYPE_OBJECT_LIT
);
160 gpy_assert (arg
->o
.literal
.type
== TYPE_VEC
);
162 retval
= arg
->o
.literal
.literal
.vec
;
167 gpy_object_t
* gpy_create_object_decl (gpy_typedef_t
* type
,
170 gpy_object_t
* retval
= (gpy_object_t
*)
171 gpy_malloc (sizeof(gpy_object_t
));
173 retval
->T
= TYPE_OBJECT_DECL
;
174 OBJECT_STATE (retval
).identifier
= strdup (type
->identifier
);
175 OBJECT_STATE (retval
).ref_count
= 0;
176 OBJECT_STATE (retval
).state
= self
;
177 OBJECT_STATE (retval
).definition
= type
;
182 gpy_object_t
* gpy_create_object_state (gpy_typedef_t
* type
,
185 gpy_object_t
* retval
= (gpy_object_t
*)
186 gpy_malloc (sizeof (gpy_object_t
));
188 retval
->T
= TYPE_OBJECT_STATE
;
189 OBJECT_STATE (retval
).identifier
= strdup (type
->identifier
);
190 OBJECT_STATE (retval
).ref_count
= 0;
191 OBJECT_STATE (retval
).state
= self
;
192 OBJECT_STATE (retval
).definition
= type
;
197 void gpy_wrap_builtins (gpy_typedef_t
* const type
, size_t len
)
199 struct gpy_builtinAttribs_t
* builtins
= type
->builtins
;
200 struct gpy_builtinAttribs_t atm
;
204 gpy_object_t
** folded
= (gpy_object_t
**)
205 gpy_calloc (len
-1, sizeof (gpy_object_t
*));
208 for (idx
= 0; builtins
[idx
].identifier
!= NULL
; ++idx
)
210 atm
= builtins
[idx
];
211 gpy_object_t
* builtin
= NULL_OBJECT
;
212 gpy_object_t args
[4];
215 i
.type
= TYPE_STRING
;
216 i
.literal
.string
= (char *)atm
.identifier
;
220 p
.literal
.addr
= (unsigned char *) atm
.addr
;
223 n
.type
= TYPE_INTEGER
;
224 n
.literal
.integer
= atm
.nargs
;
226 gpy_object_t a1
= { .T
= TYPE_OBJECT_LIT
, .o
.literal
= i
};
227 gpy_object_t a2
= { .T
= TYPE_OBJECT_LIT
, .o
.literal
= p
};
228 gpy_object_t a3
= { .T
= TYPE_OBJECT_LIT
, .o
.literal
= n
};
233 args
[3] = NULL_OBJECT_REF
;
235 gpy_typedef_t
* def
= __gpy_func_type_node
;
236 builtin
= def
->tp_new (def
, args
);
237 gpy_assert (builtin
->T
== TYPE_OBJECT_DECL
);
239 folded
[idx
] = builtin
;
241 /* Now to append/create the attribute access table .. */
242 struct gpy_object_attrib_t
** members
= (struct gpy_object_attrib_t
**)
243 gpy_calloc (len
, sizeof (struct gpy_object_attrib_t
*));
245 for (idx
= 0; idx
< len
- 1; ++idx
)
247 atm
= builtins
[idx
];
248 struct gpy_object_attrib_t
* fattr
= (struct gpy_object_attrib_t
*)
249 gpy_malloc (sizeof (struct gpy_object_attrib_t
));
251 fattr
->identifier
= strdup (atm
.identifier
);
252 fattr
->T
= GPY_CATTR
;
254 fattr
->addr
= folded
[idx
];
256 members
[idx
] = fattr
;
260 type
->members_defintion
= members
;