Commit 4d17a06f by Mark Mitchell Committed by Mark Mitchell

cplus-dem.c (type_kind_t): New type.

	* cplus-dem.c (type_kind_t): New type.
	(demangle_template_value_parm): Add type_kind_t parameter.  Rely
	on this paramter, rather than demangling the type again.
	(demangle_integral_value): Pass tk_integral.
	(demangle_template_: Pass the value returned from do_type.
	(do_type): Return a type_kind_t.  Pass tk_integral to
	demangle_template_value_parm for array bounds.
	(demangle_fund_type): Likewise.

From-SVN: r21434
parent 36a117a5
Tue Jul 28 11:33:09 1998 Mark Mitchell <mark@markmitchell.com>
* cplus-dem.c (type_kind_t): New type.
(demangle_template_value_parm): Add type_kind_t parameter. Rely
on this paramter, rather than demangling the type again.
(demangle_integral_value): Pass tk_integral.
(demangle_template_: Pass the value returned from do_type.
(do_type): Return a type_kind_t. Pass tk_integral to
demangle_template_value_parm for array bounds.
(demangle_fund_type): Likewise.
Mon Jul 27 00:54:41 1998 Jason Merrill <jason@yorick.cygnus.com> Mon Jul 27 00:54:41 1998 Jason Merrill <jason@yorick.cygnus.com>
* tree.c (simple_cst_equal, case CONSTRUCTOR): OK if the elts are * tree.c (simple_cst_equal, case CONSTRUCTOR): OK if the elts are
......
...@@ -220,7 +220,19 @@ static const struct optable ...@@ -220,7 +220,19 @@ static const struct optable
{"sz", "sizeof ", DMGL_ANSI} /* pseudo-ansi */ {"sz", "sizeof ", DMGL_ANSI} /* pseudo-ansi */
}; };
/* These values are used to indicate the various type varieties.
They are all non-zero so that they can be used as `success'
values. */
typedef enum type_kind_t
{
tk_none,
tk_pointer,
tk_integral,
tk_bool,
tk_char,
tk_real
} type_kind_t;
#define STRING_EMPTY(str) ((str) -> b == (str) -> p) #define STRING_EMPTY(str) ((str) -> b == (str) -> p)
#define PREPEND_BLANK(str) {if (!STRING_EMPTY(str)) \ #define PREPEND_BLANK(str) {if (!STRING_EMPTY(str)) \
string_prepend(str, " ");} string_prepend(str, " ");}
...@@ -369,8 +381,8 @@ static void ...@@ -369,8 +381,8 @@ static void
string_prepends PARAMS ((string *, string *)); string_prepends PARAMS ((string *, string *));
static int static int
demangle_template_value_parm PARAMS ((struct work_stuff*, demangle_template_value_parm PARAMS ((struct work_stuff*, const char**,
const char**, string*)); string*, type_kind_t));
/* Translate count to integer, consuming tokens in the process. /* Translate count to integer, consuming tokens in the process.
Conversion terminates on the first non-digit character. Conversion terminates on the first non-digit character.
...@@ -1179,7 +1191,8 @@ demangle_integral_value (work, mangled, s) ...@@ -1179,7 +1191,8 @@ demangle_integral_value (work, mangled, s)
else else
need_operator = 1; need_operator = 1;
success = demangle_template_value_parm (work, mangled, s); success = demangle_template_value_parm (work, mangled, s,
tk_integral);
} }
if (**mangled != 'W') if (**mangled != 'W')
...@@ -1213,76 +1226,14 @@ demangle_integral_value (work, mangled, s) ...@@ -1213,76 +1226,14 @@ demangle_integral_value (work, mangled, s)
} }
static int static int
demangle_template_value_parm (work, mangled, s) demangle_template_value_parm (work, mangled, s, tk)
struct work_stuff *work; struct work_stuff *work;
const char **mangled; const char **mangled;
string* s; string* s;
type_kind_t tk;
{ {
const char *old_p = *mangled;
int is_pointer = 0;
int is_real = 0;
int is_integral = 0;
int is_char = 0;
int is_bool = 0;
int done = 0;
int success = 1; int success = 1;
while (*old_p && !done)
{
switch (*old_p)
{
case 'P':
case 'p':
case 'R':
done = is_pointer = 1;
break;
case 'C': /* const */
case 'S': /* explicitly signed [char] */
case 'U': /* unsigned */
case 'V': /* volatile */
case 'F': /* function */
case 'M': /* member function */
case 'O': /* ??? */
case 'J': /* complex */
old_p++;
continue;
case 'E': /* expression */
case 'Q': /* qualified name */
case 'K': /* qualified name */
done = is_integral = 1;
break;
case 'B': /* remembered type */
case 'T': /* remembered type */
abort ();
break;
case 'v': /* void */
abort ();
break;
case 'x': /* long long */
case 'l': /* long */
case 'i': /* int */
case 's': /* short */
case 'w': /* wchar_t */
done = is_integral = 1;
break;
case 'b': /* bool */
done = is_bool = 1;
break;
case 'c': /* char */
done = is_char = 1;
break;
case 'r': /* long double */
case 'd': /* double */
case 'f': /* float */
done = is_real = 1;
break;
default:
/* it's probably user defined type, let's assume
it's integral, it seems hard to figure out
what it really is */
done = is_integral = 1;
}
}
if (**mangled == 'Y') if (**mangled == 'Y')
{ {
/* The next argument is a template parameter. */ /* The next argument is a template parameter. */
...@@ -1303,9 +1254,9 @@ demangle_template_value_parm (work, mangled, s) ...@@ -1303,9 +1254,9 @@ demangle_template_value_parm (work, mangled, s)
string_append (s, buf); string_append (s, buf);
} }
} }
else if (is_integral) else if (tk == tk_integral)
success = demangle_integral_value (work, mangled, s); success = demangle_integral_value (work, mangled, s);
else if (is_char) else if (tk == tk_char)
{ {
char tmp[2]; char tmp[2];
int val; int val;
...@@ -1323,7 +1274,7 @@ demangle_template_value_parm (work, mangled, s) ...@@ -1323,7 +1274,7 @@ demangle_template_value_parm (work, mangled, s)
string_appendn (s, &tmp[0], 1); string_appendn (s, &tmp[0], 1);
string_appendn (s, "'", 1); string_appendn (s, "'", 1);
} }
else if (is_bool) else if (tk == tk_bool)
{ {
int val = consume_count (mangled); int val = consume_count (mangled);
if (val == 0) if (val == 0)
...@@ -1333,7 +1284,7 @@ demangle_template_value_parm (work, mangled, s) ...@@ -1333,7 +1284,7 @@ demangle_template_value_parm (work, mangled, s)
else else
success = 0; success = 0;
} }
else if (is_real) else if (tk == tk_real)
{ {
if (**mangled == 'm') if (**mangled == 'm')
{ {
...@@ -1366,7 +1317,7 @@ demangle_template_value_parm (work, mangled, s) ...@@ -1366,7 +1317,7 @@ demangle_template_value_parm (work, mangled, s)
} }
} }
} }
else if (is_pointer) else if (tk == tk_pointer)
{ {
int symbol_len = consume_count (mangled); int symbol_len = consume_count (mangled);
if (symbol_len == 0) if (symbol_len == 0)
...@@ -1542,25 +1493,15 @@ demangle_template (work, mangled, tname, trawname, is_type, remember) ...@@ -1542,25 +1493,15 @@ demangle_template (work, mangled, tname, trawname, is_type, remember)
{ {
string param; string param;
string* s; string* s;
const char* start_of_value_parm = *mangled;
/* otherwise, value parameter */ /* otherwise, value parameter */
/* temp is initialized in do_type */ /* temp is initialized in do_type */
success = do_type (work, mangled, &temp); success = do_type (work, mangled, &temp);
/*
if (success)
{
string_appends (s, &temp);
}
*/
string_delete(&temp); string_delete(&temp);
if (!success) if (!success)
{ break;
break;
}
/*
string_append (s, "=");
*/
if (!is_type) if (!is_type)
{ {
...@@ -1570,7 +1511,8 @@ demangle_template (work, mangled, tname, trawname, is_type, remember) ...@@ -1570,7 +1511,8 @@ demangle_template (work, mangled, tname, trawname, is_type, remember)
else else
s = tname; s = tname;
success = demangle_template_value_parm (work, mangled, s); success = demangle_template_value_parm (work, mangled, s,
(type_kind_t) success);
if (!success) if (!success)
{ {
...@@ -2490,7 +2432,8 @@ get_count (type, count) ...@@ -2490,7 +2432,8 @@ get_count (type, count)
return (1); return (1);
} }
/* result will be initialised here; it will be freed on failure */ /* RESULT will be initialised here; it will be freed on failure. The
value returned is really a type_kind_t. */
static int static int
do_type (work, mangled, result) do_type (work, mangled, result)
...@@ -2506,6 +2449,7 @@ do_type (work, mangled, result) ...@@ -2506,6 +2449,7 @@ do_type (work, mangled, result)
int constp; int constp;
int volatilep; int volatilep;
string btype; string btype;
type_kind_t tk = tk_none;
string_init (&btype); string_init (&btype);
string_init (&decl); string_init (&decl);
...@@ -2524,12 +2468,16 @@ do_type (work, mangled, result) ...@@ -2524,12 +2468,16 @@ do_type (work, mangled, result)
case 'p': case 'p':
(*mangled)++; (*mangled)++;
string_prepend (&decl, "*"); string_prepend (&decl, "*");
if (tk == tk_none)
tk = tk_pointer;
break; break;
/* A reference type */ /* A reference type */
case 'R': case 'R':
(*mangled)++; (*mangled)++;
string_prepend (&decl, "&"); string_prepend (&decl, "&");
if (tk == tk_none)
tk = tk_pointer;
break; break;
/* An array */ /* An array */
...@@ -2538,7 +2486,8 @@ do_type (work, mangled, result) ...@@ -2538,7 +2486,8 @@ do_type (work, mangled, result)
++(*mangled); ++(*mangled);
string_prepend (&decl, "("); string_prepend (&decl, "(");
string_append (&decl, ")["); string_append (&decl, ")[");
success = demangle_template_value_parm (work, mangled, &decl); success = demangle_template_value_parm (work, mangled, &decl,
tk_integral);
if (**mangled == '_') if (**mangled == '_')
++(*mangled); ++(*mangled);
string_append (&decl, "]"); string_append (&decl, "]");
...@@ -2711,9 +2660,7 @@ do_type (work, mangled, result) ...@@ -2711,9 +2660,7 @@ do_type (work, mangled, result)
if (!get_count (mangled, &n) || n >= work -> numb) if (!get_count (mangled, &n) || n >= work -> numb)
success = 0; success = 0;
else else
{ string_append (result, work->btypevec[n]);
string_append (result, work->btypevec[n]);
}
break; break;
case 'X': case 'X':
...@@ -2748,6 +2695,8 @@ do_type (work, mangled, result) ...@@ -2748,6 +2695,8 @@ do_type (work, mangled, result)
default: default:
success = demangle_fund_type (work, mangled, result); success = demangle_fund_type (work, mangled, result);
if (tk == tk_none)
tk = (type_kind_t) success;
break; break;
} }
...@@ -2760,11 +2709,14 @@ do_type (work, mangled, result) ...@@ -2760,11 +2709,14 @@ do_type (work, mangled, result)
} }
} }
else else
{ string_delete (result);
string_delete (result);
}
string_delete (&decl); string_delete (&decl);
return (success);
if (success)
/* Assume an integral type, if we're not sure. */
return (int) ((tk == tk_none) ? tk_integral : tk);
else
return 0;
} }
/* Given a pointer to a type string that represents a fundamental type /* Given a pointer to a type string that represents a fundamental type
...@@ -2778,7 +2730,7 @@ do_type (work, mangled, result) ...@@ -2778,7 +2730,7 @@ do_type (work, mangled, result)
"Sl" => "signed long" "Sl" => "signed long"
"CUs" => "const unsigned short" "CUs" => "const unsigned short"
*/ The value returned is really a type_kind_t. */
static int static int
demangle_fund_type (work, mangled, result) demangle_fund_type (work, mangled, result)
...@@ -2789,6 +2741,8 @@ demangle_fund_type (work, mangled, result) ...@@ -2789,6 +2741,8 @@ demangle_fund_type (work, mangled, result)
int done = 0; int done = 0;
int success = 1; int success = 1;
string btype; string btype;
type_kind_t tk = tk_integral;
string_init (&btype); string_init (&btype);
/* First pick off any type qualifiers. There can be more than one. */ /* First pick off any type qualifiers. There can be more than one. */
...@@ -2870,31 +2824,37 @@ demangle_fund_type (work, mangled, result) ...@@ -2870,31 +2824,37 @@ demangle_fund_type (work, mangled, result)
(*mangled)++; (*mangled)++;
APPEND_BLANK (result); APPEND_BLANK (result);
string_append (result, "bool"); string_append (result, "bool");
tk = tk_bool;
break; break;
case 'c': case 'c':
(*mangled)++; (*mangled)++;
APPEND_BLANK (result); APPEND_BLANK (result);
string_append (result, "char"); string_append (result, "char");
tk = tk_char;
break; break;
case 'w': case 'w':
(*mangled)++; (*mangled)++;
APPEND_BLANK (result); APPEND_BLANK (result);
string_append (result, "wchar_t"); string_append (result, "wchar_t");
tk = tk_char;
break; break;
case 'r': case 'r':
(*mangled)++; (*mangled)++;
APPEND_BLANK (result); APPEND_BLANK (result);
string_append (result, "long double"); string_append (result, "long double");
tk = tk_real;
break; break;
case 'd': case 'd':
(*mangled)++; (*mangled)++;
APPEND_BLANK (result); APPEND_BLANK (result);
string_append (result, "double"); string_append (result, "double");
tk = tk_real;
break; break;
case 'f': case 'f':
(*mangled)++; (*mangled)++;
APPEND_BLANK (result); APPEND_BLANK (result);
string_append (result, "float"); string_append (result, "float");
tk = tk_real;
break; break;
case 'G': case 'G':
(*mangled)++; (*mangled)++;
...@@ -2940,7 +2900,7 @@ demangle_fund_type (work, mangled, result) ...@@ -2940,7 +2900,7 @@ demangle_fund_type (work, mangled, result)
break; break;
} }
return (success); return success ? ((int) tk) : 0;
} }
/* Demangle the next argument, given by MANGLED into RESULT, which /* Demangle the next argument, given by MANGLED into RESULT, which
......
Tue Jul 28 11:33:09 1998 Mark Mitchell <mark@markmitchell.com>
* cplus-dem.c (type_kind_t): New type.
(demangle_template_value_parm): Add type_kind_t parameter. Rely
on this paramter, rather than demangling the type again.
(demangle_integral_value): Pass tk_integral.
(demangle_template_: Pass the value returned from do_type.
(do_type): Return a type_kind_t. Pass tk_integral to
demangle_template_value_parm for array bounds.
(demangle_fund_type): Likewise.
Also incorporate from GCC version:
Tue Jul 21 13:28:19 1998 Jason Merrill <jason@yorick.cygnus.com>
* cplus-dem.c (do_type): Use demangle_template_value_parm for arrays.
Sun Jul 19 08:23:17 1998 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> Sun Jul 19 08:23:17 1998 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* cplus-dem.c (demangle_nested_args): Make function definition * cplus-dem.c (demangle_nested_args): Make function definition
......
...@@ -220,7 +220,19 @@ static const struct optable ...@@ -220,7 +220,19 @@ static const struct optable
{"sz", "sizeof ", DMGL_ANSI} /* pseudo-ansi */ {"sz", "sizeof ", DMGL_ANSI} /* pseudo-ansi */
}; };
/* These values are used to indicate the various type varieties.
They are all non-zero so that they can be used as `success'
values. */
typedef enum type_kind_t
{
tk_none,
tk_pointer,
tk_integral,
tk_bool,
tk_char,
tk_real
} type_kind_t;
#define STRING_EMPTY(str) ((str) -> b == (str) -> p) #define STRING_EMPTY(str) ((str) -> b == (str) -> p)
#define PREPEND_BLANK(str) {if (!STRING_EMPTY(str)) \ #define PREPEND_BLANK(str) {if (!STRING_EMPTY(str)) \
string_prepend(str, " ");} string_prepend(str, " ");}
...@@ -369,8 +381,8 @@ static void ...@@ -369,8 +381,8 @@ static void
string_prepends PARAMS ((string *, string *)); string_prepends PARAMS ((string *, string *));
static int static int
demangle_template_value_parm PARAMS ((struct work_stuff*, demangle_template_value_parm PARAMS ((struct work_stuff*, const char**,
const char**, string*)); string*, type_kind_t));
/* Translate count to integer, consuming tokens in the process. /* Translate count to integer, consuming tokens in the process.
Conversion terminates on the first non-digit character. Conversion terminates on the first non-digit character.
...@@ -1179,7 +1191,8 @@ demangle_integral_value (work, mangled, s) ...@@ -1179,7 +1191,8 @@ demangle_integral_value (work, mangled, s)
else else
need_operator = 1; need_operator = 1;
success = demangle_template_value_parm (work, mangled, s); success = demangle_template_value_parm (work, mangled, s,
tk_integral);
} }
if (**mangled != 'W') if (**mangled != 'W')
...@@ -1213,76 +1226,14 @@ demangle_integral_value (work, mangled, s) ...@@ -1213,76 +1226,14 @@ demangle_integral_value (work, mangled, s)
} }
static int static int
demangle_template_value_parm (work, mangled, s) demangle_template_value_parm (work, mangled, s, tk)
struct work_stuff *work; struct work_stuff *work;
const char **mangled; const char **mangled;
string* s; string* s;
type_kind_t tk;
{ {
const char *old_p = *mangled;
int is_pointer = 0;
int is_real = 0;
int is_integral = 0;
int is_char = 0;
int is_bool = 0;
int done = 0;
int success = 1; int success = 1;
while (*old_p && !done)
{
switch (*old_p)
{
case 'P':
case 'p':
case 'R':
done = is_pointer = 1;
break;
case 'C': /* const */
case 'S': /* explicitly signed [char] */
case 'U': /* unsigned */
case 'V': /* volatile */
case 'F': /* function */
case 'M': /* member function */
case 'O': /* ??? */
case 'J': /* complex */
old_p++;
continue;
case 'E': /* expression */
case 'Q': /* qualified name */
case 'K': /* qualified name */
done = is_integral = 1;
break;
case 'B': /* remembered type */
case 'T': /* remembered type */
abort ();
break;
case 'v': /* void */
abort ();
break;
case 'x': /* long long */
case 'l': /* long */
case 'i': /* int */
case 's': /* short */
case 'w': /* wchar_t */
done = is_integral = 1;
break;
case 'b': /* bool */
done = is_bool = 1;
break;
case 'c': /* char */
done = is_char = 1;
break;
case 'r': /* long double */
case 'd': /* double */
case 'f': /* float */
done = is_real = 1;
break;
default:
/* it's probably user defined type, let's assume
it's integral, it seems hard to figure out
what it really is */
done = is_integral = 1;
}
}
if (**mangled == 'Y') if (**mangled == 'Y')
{ {
/* The next argument is a template parameter. */ /* The next argument is a template parameter. */
...@@ -1303,9 +1254,9 @@ demangle_template_value_parm (work, mangled, s) ...@@ -1303,9 +1254,9 @@ demangle_template_value_parm (work, mangled, s)
string_append (s, buf); string_append (s, buf);
} }
} }
else if (is_integral) else if (tk == tk_integral)
success = demangle_integral_value (work, mangled, s); success = demangle_integral_value (work, mangled, s);
else if (is_char) else if (tk == tk_char)
{ {
char tmp[2]; char tmp[2];
int val; int val;
...@@ -1323,7 +1274,7 @@ demangle_template_value_parm (work, mangled, s) ...@@ -1323,7 +1274,7 @@ demangle_template_value_parm (work, mangled, s)
string_appendn (s, &tmp[0], 1); string_appendn (s, &tmp[0], 1);
string_appendn (s, "'", 1); string_appendn (s, "'", 1);
} }
else if (is_bool) else if (tk == tk_bool)
{ {
int val = consume_count (mangled); int val = consume_count (mangled);
if (val == 0) if (val == 0)
...@@ -1333,7 +1284,7 @@ demangle_template_value_parm (work, mangled, s) ...@@ -1333,7 +1284,7 @@ demangle_template_value_parm (work, mangled, s)
else else
success = 0; success = 0;
} }
else if (is_real) else if (tk == tk_real)
{ {
if (**mangled == 'm') if (**mangled == 'm')
{ {
...@@ -1366,7 +1317,7 @@ demangle_template_value_parm (work, mangled, s) ...@@ -1366,7 +1317,7 @@ demangle_template_value_parm (work, mangled, s)
} }
} }
} }
else if (is_pointer) else if (tk == tk_pointer)
{ {
int symbol_len = consume_count (mangled); int symbol_len = consume_count (mangled);
if (symbol_len == 0) if (symbol_len == 0)
...@@ -1542,25 +1493,15 @@ demangle_template (work, mangled, tname, trawname, is_type, remember) ...@@ -1542,25 +1493,15 @@ demangle_template (work, mangled, tname, trawname, is_type, remember)
{ {
string param; string param;
string* s; string* s;
const char* start_of_value_parm = *mangled;
/* otherwise, value parameter */ /* otherwise, value parameter */
/* temp is initialized in do_type */ /* temp is initialized in do_type */
success = do_type (work, mangled, &temp); success = do_type (work, mangled, &temp);
/*
if (success)
{
string_appends (s, &temp);
}
*/
string_delete(&temp); string_delete(&temp);
if (!success) if (!success)
{ break;
break;
}
/*
string_append (s, "=");
*/
if (!is_type) if (!is_type)
{ {
...@@ -1570,7 +1511,8 @@ demangle_template (work, mangled, tname, trawname, is_type, remember) ...@@ -1570,7 +1511,8 @@ demangle_template (work, mangled, tname, trawname, is_type, remember)
else else
s = tname; s = tname;
success = demangle_template_value_parm (work, mangled, s); success = demangle_template_value_parm (work, mangled, s,
(type_kind_t) success);
if (!success) if (!success)
{ {
...@@ -2490,7 +2432,8 @@ get_count (type, count) ...@@ -2490,7 +2432,8 @@ get_count (type, count)
return (1); return (1);
} }
/* result will be initialised here; it will be freed on failure */ /* RESULT will be initialised here; it will be freed on failure. The
value returned is really a type_kind_t. */
static int static int
do_type (work, mangled, result) do_type (work, mangled, result)
...@@ -2506,6 +2449,7 @@ do_type (work, mangled, result) ...@@ -2506,6 +2449,7 @@ do_type (work, mangled, result)
int constp; int constp;
int volatilep; int volatilep;
string btype; string btype;
type_kind_t tk = tk_none;
string_init (&btype); string_init (&btype);
string_init (&decl); string_init (&decl);
...@@ -2524,33 +2468,29 @@ do_type (work, mangled, result) ...@@ -2524,33 +2468,29 @@ do_type (work, mangled, result)
case 'p': case 'p':
(*mangled)++; (*mangled)++;
string_prepend (&decl, "*"); string_prepend (&decl, "*");
if (tk == tk_none)
tk = tk_pointer;
break; break;
/* A reference type */ /* A reference type */
case 'R': case 'R':
(*mangled)++; (*mangled)++;
string_prepend (&decl, "&"); string_prepend (&decl, "&");
if (tk == tk_none)
tk = tk_pointer;
break; break;
/* An array */ /* An array */
case 'A': case 'A':
{ {
const char *p = ++(*mangled); ++(*mangled);
string_prepend (&decl, "("); string_prepend (&decl, "(");
string_append (&decl, ")["); string_append (&decl, ")[");
/* Copy anything up until the next underscore (the size of the success = demangle_template_value_parm (work, mangled, &decl,
array). */ tk_integral);
while (**mangled && **mangled != '_')
++(*mangled);
if (**mangled == '_') if (**mangled == '_')
{ ++(*mangled);
string_appendn (&decl, p, *mangled - p); string_append (&decl, "]");
string_append (&decl, "]");
*mangled += 1;
}
else
success = 0;
break; break;
} }
...@@ -2720,9 +2660,7 @@ do_type (work, mangled, result) ...@@ -2720,9 +2660,7 @@ do_type (work, mangled, result)
if (!get_count (mangled, &n) || n >= work -> numb) if (!get_count (mangled, &n) || n >= work -> numb)
success = 0; success = 0;
else else
{ string_append (result, work->btypevec[n]);
string_append (result, work->btypevec[n]);
}
break; break;
case 'X': case 'X':
...@@ -2757,6 +2695,8 @@ do_type (work, mangled, result) ...@@ -2757,6 +2695,8 @@ do_type (work, mangled, result)
default: default:
success = demangle_fund_type (work, mangled, result); success = demangle_fund_type (work, mangled, result);
if (tk == tk_none)
tk = (type_kind_t) success;
break; break;
} }
...@@ -2769,11 +2709,14 @@ do_type (work, mangled, result) ...@@ -2769,11 +2709,14 @@ do_type (work, mangled, result)
} }
} }
else else
{ string_delete (result);
string_delete (result);
}
string_delete (&decl); string_delete (&decl);
return (success);
if (success)
/* Assume an integral type, if we're not sure. */
return (int) ((tk == tk_none) ? tk_integral : tk);
else
return 0;
} }
/* Given a pointer to a type string that represents a fundamental type /* Given a pointer to a type string that represents a fundamental type
...@@ -2787,7 +2730,7 @@ do_type (work, mangled, result) ...@@ -2787,7 +2730,7 @@ do_type (work, mangled, result)
"Sl" => "signed long" "Sl" => "signed long"
"CUs" => "const unsigned short" "CUs" => "const unsigned short"
*/ The value returned is really a type_kind_t. */
static int static int
demangle_fund_type (work, mangled, result) demangle_fund_type (work, mangled, result)
...@@ -2798,6 +2741,8 @@ demangle_fund_type (work, mangled, result) ...@@ -2798,6 +2741,8 @@ demangle_fund_type (work, mangled, result)
int done = 0; int done = 0;
int success = 1; int success = 1;
string btype; string btype;
type_kind_t tk = tk_integral;
string_init (&btype); string_init (&btype);
/* First pick off any type qualifiers. There can be more than one. */ /* First pick off any type qualifiers. There can be more than one. */
...@@ -2879,31 +2824,37 @@ demangle_fund_type (work, mangled, result) ...@@ -2879,31 +2824,37 @@ demangle_fund_type (work, mangled, result)
(*mangled)++; (*mangled)++;
APPEND_BLANK (result); APPEND_BLANK (result);
string_append (result, "bool"); string_append (result, "bool");
tk = tk_bool;
break; break;
case 'c': case 'c':
(*mangled)++; (*mangled)++;
APPEND_BLANK (result); APPEND_BLANK (result);
string_append (result, "char"); string_append (result, "char");
tk = tk_char;
break; break;
case 'w': case 'w':
(*mangled)++; (*mangled)++;
APPEND_BLANK (result); APPEND_BLANK (result);
string_append (result, "wchar_t"); string_append (result, "wchar_t");
tk = tk_char;
break; break;
case 'r': case 'r':
(*mangled)++; (*mangled)++;
APPEND_BLANK (result); APPEND_BLANK (result);
string_append (result, "long double"); string_append (result, "long double");
tk = tk_real;
break; break;
case 'd': case 'd':
(*mangled)++; (*mangled)++;
APPEND_BLANK (result); APPEND_BLANK (result);
string_append (result, "double"); string_append (result, "double");
tk = tk_real;
break; break;
case 'f': case 'f':
(*mangled)++; (*mangled)++;
APPEND_BLANK (result); APPEND_BLANK (result);
string_append (result, "float"); string_append (result, "float");
tk = tk_real;
break; break;
case 'G': case 'G':
(*mangled)++; (*mangled)++;
...@@ -2949,7 +2900,7 @@ demangle_fund_type (work, mangled, result) ...@@ -2949,7 +2900,7 @@ demangle_fund_type (work, mangled, result)
break; break;
} }
return (success); return success ? ((int) tk) : 0;
} }
/* Demangle the next argument, given by MANGLED into RESULT, which /* Demangle the next argument, given by MANGLED into RESULT, which
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment