mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 19:26:32 +00:00
[CRT]
- Sync heap.c and undname.c with Wine 1.3.32 - Remove incorrect casts. Undo an incorrect warning fix. Fixes hang in msvcrt:cpp test svn path=/trunk/; revision=54297
This commit is contained in:
@@ -35,7 +35,8 @@
|
||||
((((DWORD_PTR)((char *)ptr + alignment + sizeof(void *) + offset)) & \
|
||||
~(alignment - 1)) - offset))
|
||||
|
||||
typedef void (*MSVCRT_new_handler_func)(size_t size);
|
||||
|
||||
typedef int (CDECL *MSVCRT_new_handler_func)(size_t size);
|
||||
|
||||
static MSVCRT_new_handler_func MSVCRT_new_handler;
|
||||
static int MSVCRT_new_mode;
|
||||
@@ -50,14 +51,28 @@ static size_t MSVCRT_sbh_threshold = 0;
|
||||
*/
|
||||
void* CDECL MSVCRT_operator_new(size_t size)
|
||||
{
|
||||
void *retval = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
TRACE("(%ld) returning %p\n", size, retval);
|
||||
if(retval) return retval;
|
||||
LOCK_HEAP;
|
||||
if(MSVCRT_new_handler)
|
||||
(*MSVCRT_new_handler)(size);
|
||||
UNLOCK_HEAP;
|
||||
return retval;
|
||||
void *retval;
|
||||
int freed;
|
||||
|
||||
do
|
||||
{
|
||||
retval = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
if(retval)
|
||||
{
|
||||
TRACE("(%ld) returning %p\n", size, retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
LOCK_HEAP;
|
||||
if(MSVCRT_new_handler)
|
||||
freed = (*MSVCRT_new_handler)(size);
|
||||
else
|
||||
freed = 0;
|
||||
UNLOCK_HEAP;
|
||||
} while(freed);
|
||||
|
||||
TRACE("(%ld) out of memory\n", size);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -148,7 +163,7 @@ int CDECL _callnewh(size_t size)
|
||||
*/
|
||||
void* CDECL _expand(void* mem, size_t size)
|
||||
{
|
||||
return HeapReAlloc(GetProcessHeap(), HEAP_REALLOC_IN_PLACE_ONLY, mem, (DWORD)size);
|
||||
return HeapReAlloc(GetProcessHeap(), HEAP_REALLOC_IN_PLACE_ONLY, mem, size);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
@@ -194,7 +209,7 @@ int CDECL _heapwalk(_HEAPINFO* next)
|
||||
!HeapValidate( GetProcessHeap(), 0, phe.lpData ))
|
||||
{
|
||||
UNLOCK_HEAP;
|
||||
__set_errno(GetLastError());
|
||||
__set_errno(GetLastError());
|
||||
return _HEAPBADNODE;
|
||||
}
|
||||
|
||||
@@ -273,7 +288,7 @@ size_t CDECL _msize(void* mem)
|
||||
/*********************************************************************
|
||||
* calloc (MSVCRT.@)
|
||||
*/
|
||||
void* CDECL calloc(size_t size,size_t count)
|
||||
void* CDECL calloc(size_t size, size_t count)
|
||||
{
|
||||
return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size * count );
|
||||
}
|
||||
@@ -303,7 +318,7 @@ void* CDECL malloc(size_t size)
|
||||
void* CDECL realloc(void* ptr, size_t size)
|
||||
{
|
||||
if (!ptr) return malloc(size);
|
||||
if (size) return HeapReAlloc(GetProcessHeap(), 0, ptr, (DWORD)size);
|
||||
if (size) return HeapReAlloc(GetProcessHeap(), 0, ptr, size);
|
||||
free(ptr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -103,6 +103,8 @@ struct datatype_t
|
||||
const char* right;
|
||||
};
|
||||
|
||||
static BOOL symbol_demangle(struct parsed_symbol* sym);
|
||||
|
||||
/******************************************************************
|
||||
* und_alloc
|
||||
*
|
||||
@@ -208,7 +210,7 @@ static BOOL str_array_push(struct parsed_symbol* sym, const char* ptr, int len,
|
||||
a->elts[a->num][len] = '\0';
|
||||
if (++a->num >= a->max) a->max = a->num;
|
||||
{
|
||||
unsigned int i;
|
||||
int i;
|
||||
char c;
|
||||
|
||||
for (i = a->max - 1; i >= 0; i--)
|
||||
@@ -414,11 +416,17 @@ static char* get_args(struct parsed_symbol* sym, struct array* pmt_ref, BOOL z_t
|
||||
|
||||
/******************************************************************
|
||||
* get_modifier
|
||||
* Parses the type modifier. Always returns a static string
|
||||
* Parses the type modifier. Always returns static strings.
|
||||
*/
|
||||
static BOOL get_modifier(char ch, const char** ret)
|
||||
static BOOL get_modifier(struct parsed_symbol *sym, const char **ret, const char **ptr_modif)
|
||||
{
|
||||
switch (ch)
|
||||
*ptr_modif = NULL;
|
||||
if (*sym->current == 'E')
|
||||
{
|
||||
*ptr_modif = "__ptr64";
|
||||
sym->current++;
|
||||
}
|
||||
switch (*sym->current++)
|
||||
{
|
||||
case 'A': *ret = NULL; break;
|
||||
case 'B': *ret = "const"; break;
|
||||
@@ -434,20 +442,27 @@ static BOOL get_modified_type(struct datatype_t *ct, struct parsed_symbol* sym,
|
||||
{
|
||||
const char* modifier;
|
||||
const char* str_modif;
|
||||
const char *ptr_modif = "";
|
||||
|
||||
if (*sym->current == 'E')
|
||||
{
|
||||
ptr_modif = " __ptr64";
|
||||
sym->current++;
|
||||
}
|
||||
|
||||
switch (modif)
|
||||
{
|
||||
case 'A': str_modif = " &"; break;
|
||||
case 'B': str_modif = " & volatile"; break;
|
||||
case 'P': str_modif = " *"; break;
|
||||
case 'Q': str_modif = " * const"; break;
|
||||
case 'R': str_modif = " * volatile"; break;
|
||||
case 'S': str_modif = " * const volatile"; break;
|
||||
case 'A': str_modif = str_printf(sym, " &%s", ptr_modif); break;
|
||||
case 'B': str_modif = str_printf(sym, " &%s volatile", ptr_modif); break;
|
||||
case 'P': str_modif = str_printf(sym, " *%s", ptr_modif); break;
|
||||
case 'Q': str_modif = str_printf(sym, " *%s const", ptr_modif); break;
|
||||
case 'R': str_modif = str_printf(sym, " *%s volatile", ptr_modif); break;
|
||||
case 'S': str_modif = str_printf(sym, " *%s const volatile", ptr_modif); break;
|
||||
case '?': str_modif = ""; break;
|
||||
default: return FALSE;
|
||||
}
|
||||
|
||||
if (get_modifier(*sym->current++, &modifier))
|
||||
if (get_modifier(sym, &modifier, &ptr_modif))
|
||||
{
|
||||
unsigned mark = sym->stack.num;
|
||||
struct datatype_t sub_ct;
|
||||
@@ -582,12 +597,31 @@ static BOOL get_class(struct parsed_symbol* sym)
|
||||
name = str_array_get_ref(&sym->names, *sym->current++ - '0');
|
||||
break;
|
||||
case '?':
|
||||
if (*++sym->current == '$')
|
||||
switch (*++sym->current)
|
||||
{
|
||||
case '$':
|
||||
sym->current++;
|
||||
if ((name = get_template_name(sym)) &&
|
||||
!str_array_push(sym, name, -1, &sym->names))
|
||||
return FALSE;
|
||||
break;
|
||||
case '?':
|
||||
{
|
||||
struct array stack = sym->stack;
|
||||
unsigned int start = sym->names.start;
|
||||
unsigned int num = sym->names.num;
|
||||
|
||||
str_array_init( &sym->stack );
|
||||
if (symbol_demangle( sym )) name = str_printf( sym, "`%s'", sym->result );
|
||||
sym->names.start = start;
|
||||
sym->names.num = num;
|
||||
sym->stack = stack;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (!(name = get_number( sym ))) return FALSE;
|
||||
name = str_printf( sym, "`%s'", name );
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -922,10 +956,10 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct,
|
||||
case '$':
|
||||
if (*sym->current == 'C')
|
||||
{
|
||||
const char* ptr;
|
||||
const char *ptr, *ptr_modif;
|
||||
|
||||
sym->current++;
|
||||
if (!get_modifier(*sym->current++, &ptr)) goto done;
|
||||
if (!get_modifier(sym, &ptr, &ptr_modif)) goto done;
|
||||
if (!demangle_datatype(sym, ct, pmt_ref, in_args)) goto done;
|
||||
ct->left = str_printf(sym, "%s %s", ct->left, ptr);
|
||||
}
|
||||
@@ -958,6 +992,7 @@ static BOOL handle_data(struct parsed_symbol* sym)
|
||||
const char* access = NULL;
|
||||
const char* member_type = NULL;
|
||||
const char* modifier = NULL;
|
||||
const char* ptr_modif;
|
||||
struct datatype_t ct;
|
||||
char* name = NULL;
|
||||
BOOL ret = FALSE;
|
||||
@@ -1002,14 +1037,16 @@ static BOOL handle_data(struct parsed_symbol* sym)
|
||||
str_array_init(&pmt);
|
||||
|
||||
if (!demangle_datatype(sym, &ct, &pmt, FALSE)) goto done;
|
||||
if (!get_modifier(*sym->current++, &modifier)) goto done;
|
||||
if (!get_modifier(sym, &modifier, &ptr_modif)) goto done;
|
||||
if (modifier && ptr_modif) modifier = str_printf(sym, "%s %s", modifier, ptr_modif);
|
||||
else if (!modifier) modifier = ptr_modif;
|
||||
sym->stack.num = mark;
|
||||
}
|
||||
break;
|
||||
case '6' : /* compiler generated static */
|
||||
case '7' : /* compiler generated static */
|
||||
ct.left = ct.right = NULL;
|
||||
if (!get_modifier(*sym->current++, &modifier)) goto done;
|
||||
if (!get_modifier(sym, &modifier, &ptr_modif)) goto done;
|
||||
if (*sym->current != '@')
|
||||
{
|
||||
char* cls = NULL;
|
||||
@@ -1121,10 +1158,11 @@ static BOOL handle_method(struct parsed_symbol* sym, BOOL cast_op)
|
||||
{
|
||||
if (((accmem - 'A') % 8) != 2 && ((accmem - 'A') % 8) != 3)
|
||||
{
|
||||
const char *ptr_modif;
|
||||
/* Implicit 'this' pointer */
|
||||
/* If there is an implicit this pointer, const modifier follows */
|
||||
if (!get_modifier(*sym->current, &modifier)) goto done;
|
||||
sym->current++;
|
||||
if (!get_modifier(sym, &modifier, &ptr_modif)) goto done;
|
||||
if (modifier || ptr_modif) modifier = str_printf(sym, "%s %s", modifier, ptr_modif);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1162,12 +1200,11 @@ static BOOL handle_method(struct parsed_symbol* sym, BOOL cast_op)
|
||||
/* Note: '()' after 'Z' means 'throws', but we don't care here
|
||||
* Yet!!! FIXME
|
||||
*/
|
||||
sym->result = str_printf(sym, "%s%s%s%s%s%s%s%s%s%s%s%s",
|
||||
sym->result = str_printf(sym, "%s%s%s%s%s%s%s%s%s%s%s",
|
||||
access, member_type, ct_ret.left,
|
||||
(ct_ret.left && !ct_ret.right) ? " " : NULL,
|
||||
call_conv, call_conv ? " " : NULL, exported,
|
||||
name, args_str, modifier,
|
||||
modifier ? " " : NULL, ct_ret.right);
|
||||
name, args_str, modifier, ct_ret.right);
|
||||
ret = TRUE;
|
||||
done:
|
||||
return ret;
|
||||
@@ -1182,7 +1219,8 @@ static BOOL handle_template(struct parsed_symbol* sym)
|
||||
const char* name;
|
||||
const char* args;
|
||||
|
||||
assert(*sym->current++ == '$');
|
||||
assert(*sym->current == '$');
|
||||
sym->current++;
|
||||
if (!(name = get_literal_string(sym))) return FALSE;
|
||||
if (!(args = get_args(sym, NULL, FALSE, '<', '>'))) return FALSE;
|
||||
sym->result = str_printf(sym, "%s%s", name, args);
|
||||
@@ -1214,15 +1252,19 @@ static BOOL symbol_demangle(struct parsed_symbol* sym)
|
||||
|
||||
/* MS mangled names always begin with '?' */
|
||||
if (*sym->current != '?') return FALSE;
|
||||
str_array_init(&sym->names);
|
||||
str_array_init(&sym->stack);
|
||||
sym->current++;
|
||||
|
||||
/* Then function name or operator code */
|
||||
if (*sym->current == '?' && sym->current[1] != '$')
|
||||
if (*sym->current == '?' && (sym->current[1] != '$' || sym->current[2] == '?'))
|
||||
{
|
||||
const char* function_name = NULL;
|
||||
|
||||
if (sym->current[1] == '$')
|
||||
{
|
||||
do_after = 6;
|
||||
sym->current += 2;
|
||||
}
|
||||
|
||||
/* C++ operator code (one character, or two if the first is '_') */
|
||||
switch (*++sym->current)
|
||||
{
|
||||
@@ -1355,6 +1397,17 @@ static BOOL symbol_demangle(struct parsed_symbol* sym)
|
||||
sym->result = (char*)function_name;
|
||||
ret = TRUE;
|
||||
goto done;
|
||||
case 6:
|
||||
{
|
||||
char *args;
|
||||
struct array array_pmt;
|
||||
|
||||
str_array_init(&array_pmt);
|
||||
args = get_args(sym, &array_pmt, FALSE, '<', '>');
|
||||
if (args != NULL) function_name = str_printf(sym, "%s%s", function_name, args);
|
||||
sym->names.num = 0;
|
||||
}
|
||||
/* fall through */
|
||||
default:
|
||||
if (!str_array_push(sym, function_name, -1, &sym->stack))
|
||||
return FALSE;
|
||||
@@ -1400,7 +1453,7 @@ static BOOL symbol_demangle(struct parsed_symbol* sym)
|
||||
sym->flags &= ~UNDNAME_NO_FUNCTION_RETURNS;
|
||||
break;
|
||||
case 5:
|
||||
sym->names.start = 1;
|
||||
sym->names.start++;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1461,6 +1514,8 @@ char* CDECL __unDNameEx(char* buffer, const char* mangled, int buflen,
|
||||
sym.mem_alloc_ptr = memget;
|
||||
sym.mem_free_ptr = memfree;
|
||||
sym.current = mangled;
|
||||
str_array_init( &sym.names );
|
||||
str_array_init( &sym.stack );
|
||||
|
||||
result = symbol_demangle(&sym) ? sym.result : mangled;
|
||||
if (buffer && buflen)
|
||||
|
||||
Reference in New Issue
Block a user