Piotr Caban : msvcp60: Fix basic_string::operator[size_t] implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Sep 14 09:44:34 CDT 2015


Module: wine
Branch: master
Commit: 874c3f96f7559893a48bdc8ff1e9684a2a4c359d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=874c3f96f7559893a48bdc8ff1e9684a2a4c359d

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Sat Sep 12 16:05:40 2015 +0200

msvcp60: Fix basic_string::operator[size_t] implementation.

---

 dlls/msvcp60/msvcp60.spec |  8 ++++----
 dlls/msvcp60/string.c     | 41 ++++++++++++++++++++++++++++++++++-------
 2 files changed, 38 insertions(+), 11 deletions(-)

diff --git a/dlls/msvcp60/msvcp60.spec b/dlls/msvcp60/msvcp60.spec
index 4ba1584..0aa3f1b 100644
--- a/dlls/msvcp60/msvcp60.spec
+++ b/dlls/msvcp60/msvcp60.spec
@@ -1535,12 +1535,12 @@
 @ cdecl -arch=win64 ??9std@@YA_NPEBGAEBV?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@0@@Z(ptr ptr) MSVCP_basic_string_wchar_not_equal_cstr_str
 @ thiscall -arch=win32 ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAEAADI at Z(ptr long) MSVCP_basic_string_char_operator_at
 @ cdecl -arch=win64 ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEAAAEAD_K at Z(ptr long) MSVCP_basic_string_char_operator_at
-@ thiscall -arch=win32 ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEABDI at Z(ptr long) MSVCP_basic_string_char_operator_at
-@ cdecl -arch=win64 ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBAAEBD_K at Z(ptr long) MSVCP_basic_string_char_operator_at
+@ thiscall -arch=win32 ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEABDI at Z(ptr long) MSVCP_basic_string_char_operator_at_const
+@ cdecl -arch=win64 ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBAAEBD_K at Z(ptr long) MSVCP_basic_string_char_operator_at_const
 @ thiscall -arch=win32 ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QAEAAGI at Z(ptr long) MSVCP_basic_string_wchar_operator_at
 @ cdecl -arch=win64 ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEAAAEAG_K at Z(ptr long) MSVCP_basic_string_wchar_operator_at
-@ thiscall -arch=win32 ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QBEABGI at Z(ptr long) MSVCP_basic_string_wchar_operator_at
-@ cdecl -arch=win64 ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEBAAEBG_K at Z(ptr long) MSVCP_basic_string_wchar_operator_at
+@ thiscall -arch=win32 ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QBEABGI at Z(ptr long) MSVCP_basic_string_wchar_operator_at_const
+@ cdecl -arch=win64 ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEBAAEBG_K at Z(ptr long) MSVCP_basic_string_wchar_operator_at_const
 @ thiscall -arch=win32 ??Bid at locale@std@@QAEIXZ(ptr) locale_id_operator_size_t
 @ cdecl -arch=win64 ??Bid at locale@std@@QEAA_KXZ(ptr) locale_id_operator_size_t
 @ thiscall -arch=win32 ??Bios_base at std@@QBEPAXXZ(ptr) ios_base_op_fail
diff --git a/dlls/msvcp60/string.c b/dlls/msvcp60/string.c
index 76a0e02..09f9854 100644
--- a/dlls/msvcp60/string.c
+++ b/dlls/msvcp60/string.c
@@ -22,7 +22,6 @@
 
 #include "msvcp.h"
 #include "stdio.h"
-#include "assert.h"
 
 #include "windef.h"
 #include "winbase.h"
@@ -1412,15 +1411,29 @@ basic_string_char* __cdecl MSVCP_basic_string_char_concatenate_cstr_bstr(basic_s
 
 /* ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAEAADI at Z */
 /* ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEAAAEAD_K at Z */
-/* ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEABDI at Z */
-/* ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBAAEBD_K at Z */
 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_operator_at, 8)
 char* __thiscall MSVCP_basic_string_char_operator_at(
         basic_string_char *this, MSVCP_size_t pos)
 {
     TRACE("%p %lu\n", this, pos);
 
-    assert(this->size >= pos);
+    if(!this->ptr || pos>this->size)
+        return (char*)basic_string_char__Nullstr();
+
+    basic_string_char__Freeze(this);
+    return this->ptr+pos;
+}
+
+/* ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEABDI at Z */
+/* ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBAAEBD_K at Z */
+DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_operator_at_const, 8)
+const char* __thiscall MSVCP_basic_string_char_operator_at_const(
+        const basic_string_char *this, MSVCP_size_t pos)
+{
+    TRACE("%p %lu\n", this, pos);
+
+    if(!this->ptr)
+        return basic_string_char__Nullstr();
     return this->ptr+pos;
 }
 
@@ -2935,15 +2948,29 @@ basic_string_wchar* __cdecl MSVCP_basic_string_wchar_concatenate_cstr_bstr(basic
 
 /* ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QAEAAGI at Z */
 /* ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEAAAEAG_K at Z */
-/* ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QBEABGI at Z */
-/* ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEBAAEBG_K at Z */
 DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_operator_at, 8)
 wchar_t* __thiscall MSVCP_basic_string_wchar_operator_at(
         basic_string_wchar *this, MSVCP_size_t pos)
 {
     TRACE("%p %lu\n", this, pos);
 
-    assert(this->size >= pos);
+    if(!this->ptr || pos>this->size)
+        return (wchar_t*)basic_string_wchar__Nullstr();
+
+    basic_string_wchar__Freeze(this);
+    return this->ptr+pos;
+}
+
+/* ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QBEABGI at Z */
+/* ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEBAAEBG_K at Z */
+DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_operator_at_const, 8)
+const wchar_t* __thiscall MSVCP_basic_string_wchar_operator_at_const(
+        const basic_string_wchar *this, MSVCP_size_t pos)
+{
+    TRACE("%p %lu\n", this, pos);
+
+    if(!this->ptr)
+        return basic_string_wchar__Nullstr();
     return this->ptr+pos;
 }
 




More information about the wine-cvs mailing list