Michael Stefaniuc : msvcrt:
Move the code to demangle a name with its template argument list out of
get_class () and into a separate function.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Apr 6 06:07:48 CDT 2007
Module: wine
Branch: master
Commit: 4718261e9b78f1d16a94644003d0a01ae3b38f8d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4718261e9b78f1d16a94644003d0a01ae3b38f8d
Author: Michael Stefaniuc <mstefani at redhat.de>
Date: Fri Apr 6 00:49:18 2007 +0200
msvcrt: Move the code to demangle a name with its template argument list out of get_class() and into a separate function.
---
dlls/msvcrt/undname.c | 52 ++++++++++++++++++++++++++++--------------------
1 files changed, 30 insertions(+), 22 deletions(-)
diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c
index a775e72..da4aeb0 100644
--- a/dlls/msvcrt/undname.c
+++ b/dlls/msvcrt/undname.c
@@ -427,6 +427,35 @@ static char* get_literal_string(struct parsed_symbol* sym)
}
/******************************************************************
+ * get_template_name
+ * Parses a name with a template argument list and returns it as
+ * a string.
+ * In a template argument list the back reference to the names
+ * table is separately created. '0' points to the class component
+ * name with the template arguments. We use the same stack array
+ * to hold the names but save/restore the stack state before/after
+ * parsing the template argument list.
+ */
+static char* get_template_name(struct parsed_symbol* sym)
+{
+ char *name, *args;
+ unsigned num_mark = sym->names.num;
+ unsigned start_mark = sym->names.start;
+ unsigned stack_mark = sym->stack.num;
+
+ sym->names.start = sym->names.num;
+ if (!(name = get_literal_string(sym)))
+ return FALSE;
+ args = get_args(sym, NULL, FALSE, '<', '>');
+ if (args != NULL)
+ name = str_printf(sym, "%s%s", name, args);
+ sym->names.num = num_mark;
+ sym->names.start = start_mark;
+ sym->stack.num = stack_mark;
+ return name;
+}
+
+/******************************************************************
* get_class
* Parses class as a list of parent-classes, terminated by '@' and stores the
* result in 'a' array. Each parent-classes, as well as the inner element
@@ -457,29 +486,8 @@ static BOOL get_class(struct parsed_symbol* sym)
case '?':
if (*++sym->current == '$')
{
- /* In a template argument list the back reference to names
- table is separately created. '0' points to the class
- component name with the template arguments. We use the same
- stack array to hold the names but save/restore the stack
- state before/after parsing the template argument list. */
- char* args = NULL;
- unsigned num_mark = sym->names.num;
- unsigned start_mark = sym->names.start;
- unsigned stack_mark = sym->stack.num;
-
- sym->names.start = sym->names.num;
sym->current++;
- if (!(name = get_literal_string(sym)))
- return FALSE;
- args = get_args(sym, NULL, FALSE, '<', '>');
- if (args != NULL)
- name = str_printf(sym, "%s%s", name, args);
- sym->names.num = num_mark;
- sym->names.start = start_mark;
- sym->stack.num = stack_mark;
- /* Now that we are back to the standard name scope push
- the class component with all its template arguments
- to the names array for back reference. */
+ name = get_template_name(sym);
str_array_push(sym, name, -1, &sym->names);
}
break;
More information about the wine-cvs
mailing list