projects
/
cparser
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Simplify macro mumbo jumbo.
[cparser]
/
type.c
diff --git
a/type.c
b/type.c
index
a0463e3
..
5967262
100644
(file)
--- a/
type.c
+++ b/
type.c
@@
-36,8
+36,8
@@
struct obstack *type_obst = &_type_obst;
static int type_visited = 0;
static bool print_implicit_array_size = false;
static int type_visited = 0;
static bool print_implicit_array_size = false;
-static void intern_print_type_pre(const type_t *type
, bool top
);
-static void intern_print_type_post(const type_t *type
, bool top
);
+static void intern_print_type_pre(const type_t *type);
+static void intern_print_type_post(const type_t *type);
typedef struct atomic_type_properties_t atomic_type_properties_t;
struct atomic_type_properties_t {
typedef struct atomic_type_properties_t atomic_type_properties_t;
struct atomic_type_properties_t {
@@
-301,9
+301,8
@@
void print_imaginary_type(const imaginary_type_t *type)
* Print the first part (the prefix) of a type.
*
* @param type The type to print.
* Print the first part (the prefix) of a type.
*
* @param type The type to print.
- * @param top true, if this is the top type, false if it's an embedded type.
*/
*/
-static void print_function_type_pre(const function_type_t *type
, bool top
)
+static void print_function_type_pre(const function_type_t *type)
{
switch (type->linkage) {
case LINKAGE_INVALID:
{
switch (type->linkage) {
case LINKAGE_INVALID:
@@
-324,7
+323,7
@@
static void print_function_type_pre(const function_type_t *type, bool top)
if (type->base.qualifiers != 0)
fputc(' ', out);
if (type->base.qualifiers != 0)
fputc(' ', out);
- intern_print_type_pre(type->return_type
, false
);
+ intern_print_type_pre(type->return_type);
switch (type->calling_convention) {
case CC_CDECL: fputs("__cdecl ", out); break;
switch (type->calling_convention) {
case CC_CDECL: fputs("__cdecl ", out); break;
@@
-333,25
+332,16
@@
static void print_function_type_pre(const function_type_t *type, bool top)
case CC_THISCALL: fputs("__thiscall ", out); break;
case CC_DEFAULT: break;
}
case CC_THISCALL: fputs("__thiscall ", out); break;
case CC_DEFAULT: break;
}
-
- /* don't emit parenthesis if we're the toplevel type... */
- if (!top)
- fputc('(', out);
}
/**
* Print the second part (the postfix) of a type.
*
* @param type The type to print.
}
/**
* Print the second part (the postfix) of a type.
*
* @param type The type to print.
- * @param top true, if this is the top type, false if it's an embedded type.
*/
static void print_function_type_post(const function_type_t *type,
*/
static void print_function_type_post(const function_type_t *type,
- const scope_t *parameters
, bool top
)
+ const scope_t *parameters)
{
{
- /* don't emit parenthesis if we're the toplevel type... */
- if (!top)
- fputc(')', out);
-
fputc('(', out);
bool first = true;
if (parameters == NULL) {
fputc('(', out);
bool first = true;
if (parameters == NULL) {
@@
-367,12
+357,14
@@
static void print_function_type_post(const function_type_t *type,
} else {
entity_t *parameter = parameters->entities;
for (; parameter != NULL; parameter = parameter->base.next) {
} else {
entity_t *parameter = parameters->entities;
for (; parameter != NULL; parameter = parameter->base.next) {
+ if (parameter->kind != ENTITY_PARAMETER)
+ continue;
+
if (first) {
first = false;
} else {
fputs(", ", out);
}
if (first) {
first = false;
} else {
fputs(", ", out);
}
- assert(is_declaration(parameter));
const type_t *const type = parameter->declaration.type;
if (type == NULL) {
fputs(parameter->base.symbol->string, out);
const type_t *const type = parameter->declaration.type;
if (type == NULL) {
fputs(parameter->base.symbol->string, out);
@@
-394,7
+386,7
@@
static void print_function_type_post(const function_type_t *type,
}
fputc(')', out);
}
fputc(')', out);
- intern_print_type_post(type->return_type
, false
);
+ intern_print_type_post(type->return_type);
}
/**
}
/**
@@
-404,7
+396,10
@@
static void print_function_type_post(const function_type_t *type,
*/
static void print_pointer_type_pre(const pointer_type_t *type)
{
*/
static void print_pointer_type_pre(const pointer_type_t *type)
{
- intern_print_type_pre(type->points_to, false);
+ type_t const *const points_to = type->points_to;
+ intern_print_type_pre(points_to);
+ if (points_to->kind == TYPE_ARRAY || points_to->kind == TYPE_FUNCTION)
+ fputs(" (", out);
variable_t *const variable = type->base_variable;
if (variable != NULL) {
fputs(" __based(", out);
variable_t *const variable = type->base_variable;
if (variable != NULL) {
fputs(" __based(", out);
@@
-419,24
+414,30
@@
static void print_pointer_type_pre(const pointer_type_t *type)
}
/**
}
/**
- * Prints the p
refix part of a reference
type.
+ * Prints the p
ostfix part of a pointer
type.
*
*
- * @param type The
reference
type.
+ * @param type The
pointer
type.
*/
*/
-static void print_
reference_type_pre(const reference
_type_t *type)
+static void print_
pointer_type_post(const pointer
_type_t *type)
{
{
- intern_print_type_pre(type->refers_to, false);
- fputc('&', out);
+ type_t const *const points_to = type->points_to;
+ if (points_to->kind == TYPE_ARRAY || points_to->kind == TYPE_FUNCTION)
+ fputc(')', out);
+ intern_print_type_post(points_to);
}
/**
}
/**
- * Prints the p
ostfix part of a pointer
type.
+ * Prints the p
refix part of a reference
type.
*
*
- * @param type The
pointer
type.
+ * @param type The
reference
type.
*/
*/
-static void print_
pointer_type_post(const pointer
_type_t *type)
+static void print_
reference_type_pre(const reference
_type_t *type)
{
{
- intern_print_type_post(type->points_to, false);
+ type_t const *const refers_to = type->refers_to;
+ intern_print_type_pre(refers_to);
+ if (refers_to->kind == TYPE_ARRAY || refers_to->kind == TYPE_FUNCTION)
+ fputs(" (", out);
+ fputc('&', out);
}
/**
}
/**
@@
-446,7
+447,10
@@
static void print_pointer_type_post(const pointer_type_t *type)
*/
static void print_reference_type_post(const reference_type_t *type)
{
*/
static void print_reference_type_post(const reference_type_t *type)
{
- intern_print_type_post(type->refers_to, false);
+ type_t const *const refers_to = type->refers_to;
+ if (refers_to->kind == TYPE_ARRAY || refers_to->kind == TYPE_FUNCTION)
+ fputc(')', out);
+ intern_print_type_post(refers_to);
}
/**
}
/**
@@
-456,7
+460,7
@@
static void print_reference_type_post(const reference_type_t *type)
*/
static void print_array_type_pre(const array_type_t *type)
{
*/
static void print_array_type_pre(const array_type_t *type)
{
- intern_print_type_pre(type->element_type
, false
);
+ intern_print_type_pre(type->element_type);
}
/**
}
/**
@@
-478,7
+482,7
@@
static void print_array_type_post(const array_type_t *type)
print_expression(type->size_expression);
}
fputc(']', out);
print_expression(type->size_expression);
}
fputc(']', out);
- intern_print_type_post(type->element_type
, false
);
+ intern_print_type_post(type->element_type);
}
/**
}
/**
@@
-490,7
+494,7
@@
static void print_bitfield_type_post(const bitfield_type_t *type)
{
fputs(" : ", out);
print_expression(type->size_expression);
{
fputs(" : ", out);
print_expression(type->size_expression);
- intern_print_type_post(type->base_type
, false
);
+ intern_print_type_post(type->base_type);
}
/**
}
/**
@@
-633,9
+637,8
@@
static void print_typeof_type_pre(const typeof_type_t *const type)
* Prints the prefix part of a type.
*
* @param type The type.
* Prints the prefix part of a type.
*
* @param type The type.
- * @param top true if we print the toplevel type, false else.
*/
*/
-static void intern_print_type_pre(const type_t *const type
, const bool top
)
+static void intern_print_type_pre(const type_t *const type)
{
switch(type->kind) {
case TYPE_ERROR:
{
switch(type->kind) {
case TYPE_ERROR:
@@
-664,7
+667,7
@@
static void intern_print_type_pre(const type_t *const type, const bool top)
fputs(type->builtin.symbol->string, out);
return;
case TYPE_FUNCTION:
fputs(type->builtin.symbol->string, out);
return;
case TYPE_FUNCTION:
- print_function_type_pre(&type->function
, top
);
+ print_function_type_pre(&type->function);
return;
case TYPE_POINTER:
print_pointer_type_pre(&type->pointer);
return;
case TYPE_POINTER:
print_pointer_type_pre(&type->pointer);
@@
-673,7
+676,7
@@
static void intern_print_type_pre(const type_t *const type, const bool top)
print_reference_type_pre(&type->reference);
return;
case TYPE_BITFIELD:
print_reference_type_pre(&type->reference);
return;
case TYPE_BITFIELD:
- intern_print_type_pre(type->bitfield.base_type
, top
);
+ intern_print_type_pre(type->bitfield.base_type);
return;
case TYPE_ARRAY:
print_array_type_pre(&type->array);
return;
case TYPE_ARRAY:
print_array_type_pre(&type->array);
@@
-692,13
+695,12
@@
static void intern_print_type_pre(const type_t *const type, const bool top)
* Prints the postfix part of a type.
*
* @param type The type.
* Prints the postfix part of a type.
*
* @param type The type.
- * @param top true if we print the toplevel type, false else.
*/
*/
-static void intern_print_type_post(const type_t *const type
, const bool top
)
+static void intern_print_type_post(const type_t *const type)
{
switch(type->kind) {
case TYPE_FUNCTION:
{
switch(type->kind) {
case TYPE_FUNCTION:
- print_function_type_post(&type->function, NULL
, top
);
+ print_function_type_post(&type->function, NULL);
return;
case TYPE_POINTER:
print_pointer_type_post(&type->pointer);
return;
case TYPE_POINTER:
print_pointer_type_post(&type->pointer);
@@
-749,15
+751,15
@@
void print_type_ext(const type_t *const type, const symbol_t *symbol,
return;
}
return;
}
- intern_print_type_pre(type
, true
);
+ intern_print_type_pre(type);
if (symbol != NULL) {
fputc(' ', out);
fputs(symbol->string, out);
}
if (type->kind == TYPE_FUNCTION) {
if (symbol != NULL) {
fputc(' ', out);
fputs(symbol->string, out);
}
if (type->kind == TYPE_FUNCTION) {
- print_function_type_post(&type->function, parameters
, true
);
+ print_function_type_post(&type->function, parameters);
} else {
} else {
- intern_print_type_post(type
, true
);
+ intern_print_type_post(type);
}
}
}
}
@@
-1233,18
+1235,11
@@
type_t *skip_typeref(type_t *type)
type = typedef_type->typedefe->type;
continue;
}
type = typedef_type->typedefe->type;
continue;
}
- case TYPE_TYPEOF:
{
+ case TYPE_TYPEOF:
qualifiers |= type->base.qualifiers;
modifiers |= type->base.modifiers;
qualifiers |= type->base.qualifiers;
modifiers |= type->base.modifiers;
-
- const typeof_type_t *typeof_type = &type->typeoft;
- if (typeof_type->typeof_type != NULL) {
- type = typeof_type->typeof_type;
- } else {
- type = typeof_type->expression->base.type;
- }
+ type = type->typeoft.typeof_type;
continue;
continue;
- }
default:
break;
}
default:
break;
}
@@
-1277,7
+1272,8
@@
type_t *skip_typeref(type_t *type)
return type;
}
return type;
}
-type_qualifiers_t get_type_qualifier(const type_t *type, bool skip_array_type) {
+type_qualifiers_t get_type_qualifier(const type_t *type, bool skip_array_type)
+{
type_qualifiers_t qualifiers = TYPE_QUALIFIER_NONE;
while (true) {
type_qualifiers_t qualifiers = TYPE_QUALIFIER_NONE;
while (true) {
@@
-1292,15
+1288,9
@@
type_qualifiers_t get_type_qualifier(const type_t *type, bool skip_array_type) {
else
type = typedef_type->typedefe->type;
continue;
else
type = typedef_type->typedefe->type;
continue;
- case TYPE_TYPEOF: {
- const typeof_type_t *typeof_type = &type->typeoft;
- if (typeof_type->typeof_type != NULL) {
- type = typeof_type->typeof_type;
- } else {
- type = typeof_type->expression->base.type;
- }
+ case TYPE_TYPEOF:
+ type = type->typeoft.typeof_type;
continue;
continue;
- }
case TYPE_ARRAY:
if (skip_array_type) {
type = type->array.element_type;
case TYPE_ARRAY:
if (skip_array_type) {
type = type->array.element_type;
@@
-1356,7
+1346,8
@@
atomic_type_kind_t get_uintptr_kind(void)
/**
* Find the atomic type kind representing a given size (signed).
*/
/**
* Find the atomic type kind representing a given size (signed).
*/
-atomic_type_kind_t find_signed_int_atomic_type_kind_for_size(unsigned size) {
+atomic_type_kind_t find_signed_int_atomic_type_kind_for_size(unsigned size)
+{
static atomic_type_kind_t kinds[32];
assert(size < 32);
static atomic_type_kind_t kinds[32];
assert(size < 32);
@@
-1383,7
+1374,8
@@
atomic_type_kind_t find_signed_int_atomic_type_kind_for_size(unsigned size) {
/**
* Find the atomic type kind representing a given size (signed).
*/
/**
* Find the atomic type kind representing a given size (signed).
*/
-atomic_type_kind_t find_unsigned_int_atomic_type_kind_for_size(unsigned size) {
+atomic_type_kind_t find_unsigned_int_atomic_type_kind_for_size(unsigned size)
+{
static atomic_type_kind_t kinds[32];
assert(size < 32);
static atomic_type_kind_t kinds[32];
assert(size < 32);