Author: tfaber
Date: Sat Nov  5 10:08:06 2011
New Revision: 54297

URL: http://svn.reactos.org/svn/reactos?rev=54297&view=rev
Log:
[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

Modified:
    trunk/reactos/lib/sdk/crt/wine/heap.c
    trunk/reactos/lib/sdk/crt/wine/undname.c

Modified: trunk/reactos/lib/sdk/crt/wine/heap.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/wine/heap.c?rev=54297&r1=54296&r2=54297&view=diff
==============================================================================
--- trunk/reactos/lib/sdk/crt/wine/heap.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/wine/heap.c [iso-8859-1] Sat Nov  5 10:08:06 2011
@@ -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 @@
  */
 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 @@
  */
 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 @@
       !HeapValidate( GetProcessHeap(), 0, phe.lpData ))
   {
     UNLOCK_HEAP;
-   __set_errno(GetLastError());
+    __set_errno(GetLastError());
     return _HEAPBADNODE;
   }
 
@@ -273,7 +288,7 @@
 /*********************************************************************
  *             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 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;
 }

Modified: trunk/reactos/lib/sdk/crt/wine/undname.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/wine/undname.c?rev=54297&r1=54296&r2=54297&view=diff
==============================================================================
--- trunk/reactos/lib/sdk/crt/wine/undname.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/wine/undname.c [iso-8859-1] Sat Nov  5 10:08:06 
2011
@@ -103,6 +103,8 @@
     const char*         right;
 };
 
+static BOOL symbol_demangle(struct parsed_symbol* sym);
+
 /******************************************************************
  *             und_alloc
  *
@@ -208,7 +210,7 @@
     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 @@
 
 /******************************************************************
  *             get_modifier
- * Parses the type modifier. Always returns a static string
- */
-static BOOL get_modifier(char ch, const char** ret)
-{
-    switch (ch)
+ * Parses the type modifier. Always returns static strings.
+ */
+static BOOL get_modifier(struct parsed_symbol *sym, const char **ret, const 
char **ptr_modif)
+{
+    *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 @@
 {
     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 @@
             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 @@
         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 @@
     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 @@
             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 @@
     {
         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 @@
     /* 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 @@
     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,14 +1252,18 @@
 
     /* 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 @@
             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 @@
         sym->flags &= ~UNDNAME_NO_FUNCTION_RETURNS;
         break;
     case 5:
-        sym->names.start = 1;
+        sym->names.start++;
         break;
     }
 
@@ -1461,6 +1514,8 @@
     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)


Reply via email to