msvcp120: Fix layout of classes with vtordisp field.
authorPiotr Caban <piotr@codeweavers.com>
Mon, 11 Jan 2016 09:36:47 +0000 (10:36 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 11 Jan 2016 12:02:46 +0000 (21:02 +0900)
Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
dlls/msvcp120/tests/msvcp120.c
dlls/msvcp90/ios.c

index f5c095432851d6c0adf714cc165bb048b6f185b7..27244703b9b17da8c2942c70f5c475c788ebe830 100644 (file)
@@ -1550,51 +1550,37 @@ static void test_cnd(void)
 }
 
 static struct {
-    struct {
-        int value;
-        int todo;
-    } arch[2];
+    int value[2];
     const char* export_name;
 } vbtable_size_exports_list[] = {
-    {{{0x20, FALSE}, {0x20, FALSE}}, "??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_istream@DU?$char_traits@D@std@@@1@@"},
-    {{{0x10, FALSE}, {0x10, FALSE}}, "??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@"},
-    {{{0x20, FALSE}, {0x20, FALSE}}, "??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@"},
-    {{{0x10, FALSE}, {0x10, FALSE}}, "??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@"},
-    {{{0x20, FALSE}, {0x20, FALSE}}, "??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_istream@_WU?$char_traits@_W@std@@@1@@"},
-    {{{0x10, FALSE}, {0x10, FALSE}}, "??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_ostream@_WU?$char_traits@_W@std@@@1@@"},
-    {{{0x18, FALSE}, {0x18, FALSE}}, "??_8?$basic_istream@DU?$char_traits@D@std@@@std@@7B@"},
-    {{{0x18, FALSE}, {0x18, FALSE}}, "??_8?$basic_istream@GU?$char_traits@G@std@@@std@@7B@"},
-    {{{0x18, FALSE}, {0x18, FALSE}}, "??_8?$basic_istream@_WU?$char_traits@_W@std@@@std@@7B@"},
-    {{{ 0x8, TRUE},  {0x10, FALSE}}, "??_8?$basic_ostream@DU?$char_traits@D@std@@@std@@7B@"},
-    {{{ 0x8, TRUE},  {0x10, FALSE}}, "??_8?$basic_ostream@GU?$char_traits@G@std@@@std@@7B@"},
-    {{{ 0x8, TRUE},  {0x10, FALSE}}, "??_8?$basic_ostream@_WU?$char_traits@_W@std@@@std@@7B@"},
-    {{{ 0x0, FALSE}, { 0x0, FALSE}}, 0}
+    {{0x20, 0x20}, "??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_istream@DU?$char_traits@D@std@@@1@@"},
+    {{0x10, 0x10}, "??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@"},
+    {{0x20, 0x20}, "??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@"},
+    {{0x10, 0x10}, "??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@"},
+    {{0x20, 0x20}, "??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_istream@_WU?$char_traits@_W@std@@@1@@"},
+    {{0x10, 0x10}, "??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_ostream@_WU?$char_traits@_W@std@@@1@@"},
+    {{0x18, 0x18}, "??_8?$basic_istream@DU?$char_traits@D@std@@@std@@7B@"},
+    {{0x18, 0x18}, "??_8?$basic_istream@GU?$char_traits@G@std@@@std@@7B@"},
+    {{0x18, 0x18}, "??_8?$basic_istream@_WU?$char_traits@_W@std@@@std@@7B@"},
+    {{ 0x8, 0x10}, "??_8?$basic_ostream@DU?$char_traits@D@std@@@std@@7B@"},
+    {{ 0x8, 0x10}, "??_8?$basic_ostream@GU?$char_traits@G@std@@@std@@7B@"},
+    {{ 0x8, 0x10}, "??_8?$basic_ostream@_WU?$char_traits@_W@std@@@std@@7B@"},
+    {{ 0x0,  0x0}, 0}
 };
 
 static void test_vbtable_size_exports(void)
 {
     int i;
     const int *p_vbtable;
-    int arch_idx;
-
-    if(sizeof(void*) == 8)
-        arch_idx = 1;
-    else
-        arch_idx = 0;
+    int arch_idx = (sizeof(void*) == 8);
 
     for (i = 0; vbtable_size_exports_list[i].export_name; i++)
     {
         SET(p_vbtable, vbtable_size_exports_list[i].export_name);
 
         ok(p_vbtable[0] == 0, "vbtable[0] wrong, got 0x%x\n", p_vbtable[0]);
-
-        if (vbtable_size_exports_list[i].arch[arch_idx].todo)
-            todo_wine
-            ok(p_vbtable[1] == vbtable_size_exports_list[i].arch[arch_idx].value,
-                    "%d: %s[1] wrong, got 0x%x\n", i, vbtable_size_exports_list[i].export_name, p_vbtable[1]);
-        else
-            ok(p_vbtable[1] == vbtable_size_exports_list[i].arch[arch_idx].value,
-                    "%d: %s[1] wrong, got 0x%x\n", i, vbtable_size_exports_list[i].export_name, p_vbtable[1]);
+        ok(p_vbtable[1] == vbtable_size_exports_list[i].value[arch_idx],
+                "%d: %s[1] wrong, got 0x%x\n", i, vbtable_size_exports_list[i].export_name, p_vbtable[1]);
     }
 }
 
index 738625c178557eb5e8fe474158e17eeff23713dd..c190ce4639b2718adc26d20f1d6ac02323ed09da 100644 (file)
@@ -141,16 +141,6 @@ typedef struct {
     wchar_t fillch;
 } basic_ios_wchar;
 
-#if _MSVCP_VER >= 110
-typedef struct {
-    int padding;
-    int vtordisp;
-} basic_ios_vtordisp;
-#define BASIC_IOS_VTORDISP_SIZE sizeof(basic_ios_vtordisp)
-#else
-#define BASIC_IOS_VTORDISP_SIZE 0
-#endif
-
 typedef struct _basic_ostream_char {
     const int *vbtable;
     /* virtual inheritance
@@ -346,12 +336,17 @@ enum file_type {
     type_unknown
 };
 
-#if _MSVCP_VER >= 100
-#define VBTABLE_ALIGN 8
+#if _MSVCP_VER >= 110
+#define BASIC_IOS_VTORDISP 1
+#define INIT_BASIC_IOS_VTORDISP(basic_ios) ((int*)basic_ios)[-1] = 0
 #else
-#define VBTABLE_ALIGN 4
+#define BASIC_IOS_VTORDISP 0
+#define INIT_BASIC_IOS_VTORDISP(basic_ios)
 #endif
 
+#define VBTABLE_ENTRY(class, offset, vbase, vtordisp) ALIGNED_SIZE(sizeof(class)+vtordisp*sizeof(int), TYPE_ALIGNMENT(vbase))-offset
+#define VBTABLE_BASIC_IOS_ENTRY(class, offset) VBTABLE_ENTRY(class, offset, basic_ios_char, BASIC_IOS_VTORDISP)
+
 extern const vtable_ptr MSVCP_iosb_vtable;
 
 /* ??_7ios_base@std@@6B@ */
@@ -395,57 +390,57 @@ extern const vtable_ptr MSVCP_basic_stringbuf_short_vtable;
 
 /* ??_8?$basic_ostream@DU?$char_traits@D@std@@@std@@7B@ */
 const int basic_ostream_char_vbtable[] = {0,
-    ALIGNED_SIZE(sizeof(basic_ostream_char), VBTABLE_ALIGN)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_ostream_char, 0)};
 /* ??_7?$basic_ostream@DU?$char_traits@D@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_ostream_char_vtable;
 
 /* ??_8?$basic_ostream@_WU?$char_traits@_W@std@@@std@@7B@ */
 const int basic_ostream_wchar_vbtable[] = {0,
-    ALIGNED_SIZE(sizeof(basic_ostream_wchar), VBTABLE_ALIGN)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_ostream_wchar, 0)};
 /* ??_7?$basic_ostream@_WU?$char_traits@_W@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_ostream_wchar_vtable;
 
 /* ??_8?$basic_ostream@GU?$char_traits@G@std@@@std@@7B@ */
 const int basic_ostream_short_vbtable[] = {0,
-    ALIGNED_SIZE(sizeof(basic_ostream_wchar), VBTABLE_ALIGN)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_ostream_wchar, 0)};
 /* ??_7?$basic_ostream@GU?$char_traits@G@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_ostream_short_vtable;
 
 /* ??_8?$basic_istream@DU?$char_traits@D@std@@@std@@7B@ */
 const int basic_istream_char_vbtable[] = {0,
-    ALIGNED_SIZE(sizeof(basic_istream_char), VBTABLE_ALIGN)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_istream_char, 0)};
 /* ??_7?$basic_istream@DU?$char_traits@D@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_istream_char_vtable;
 
 /* ??_8?$basic_istream@_WU?$char_traits@_W@std@@@std@@7B@ */
 const int basic_istream_wchar_vbtable[] = {0,
-    ALIGNED_SIZE(sizeof(basic_istream_wchar), VBTABLE_ALIGN)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_istream_wchar, 0)};
 /* ??_7?$basic_istream@_WU?$char_traits@_W@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_istream_wchar_vtable;
 
 /* ??_8?$basic_istream@GU?$char_traits@G@std@@@std@@7B@ */
 const int basic_istream_short_vbtable[] = {0,
-    ALIGNED_SIZE(sizeof(basic_istream_wchar), VBTABLE_ALIGN)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_istream_wchar, 0)};
 /* ??_7?$basic_istream@GU?$char_traits@G@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_istream_short_vtable;
 
 /* ??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_istream@DU?$char_traits@D@std@@@1@@ */
 const int basic_iostream_char_vbtable1[] = {0,
-    ALIGNED_SIZE(sizeof(basic_iostream_char), VBTABLE_ALIGN)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_iostream_char, 0)};
 /* ??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@ */
 const int basic_iostream_char_vbtable2[] = {0,
-    ALIGNED_SIZE(sizeof(basic_iostream_char), VBTABLE_ALIGN)-FIELD_OFFSET(basic_iostream_char, base2)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_iostream_char, FIELD_OFFSET(basic_iostream_char, base2))};
 /* ??_7?$basic_iostream@DU?$char_traits@D@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_iostream_char_vtable;
 
 /* ??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_istream@_WU?$char_traits@_W@std@@@1@@ */
 /* ??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@ */
 const int basic_iostream_wchar_vbtable1[] = {0,
-    ALIGNED_SIZE(sizeof(basic_iostream_wchar), VBTABLE_ALIGN)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_iostream_wchar, 0)};
 /* ??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_ostream@_WU?$char_traits@_W@std@@@1@@ */
 /* ??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@ */
 const int basic_iostream_wchar_vbtable2[] = {0,
-    ALIGNED_SIZE(sizeof(basic_iostream_wchar), VBTABLE_ALIGN)-FIELD_OFFSET(basic_iostream_wchar, base2)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_iostream_wchar, FIELD_OFFSET(basic_iostream_wchar, base2))};
 /* ??_7?$basic_iostream@_WU?$char_traits@_W@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_iostream_wchar_vtable;
 /* ??_7?$basic_iostream@GU?$char_traits@G@std@@@std@@6B@ */
@@ -453,57 +448,57 @@ extern const vtable_ptr MSVCP_basic_iostream_short_vtable;
 
 /* ??_8?$basic_ofstream@DU?$char_traits@D@std@@@std@@7B@ */
 const int basic_ofstream_char_vbtable[] = {0,
-    sizeof(basic_ofstream_char)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_ofstream_char, 0)};
 /* ??_7?$basic_ofstream@DU?$char_traits@D@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_ofstream_char_vtable;
 
 /* ??_8?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@7B@ */
 const int basic_ofstream_wchar_vbtable[] = {0,
-    sizeof(basic_ofstream_wchar)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_ofstream_wchar, 0)};
 /* ??_7?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_ofstream_wchar_vtable;
 
 /* ??_8?$basic_ofstream@GU?$char_traits@G@std@@@std@@7B@ */
 const int basic_ofstream_short_vbtable[] = {0,
-    sizeof(basic_ofstream_wchar)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_ofstream_wchar, 0)};
 /* ??_7?$basic_ofstream@GU?$char_traits@G@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_ofstream_short_vtable;
 
 /* ??_8?$basic_ifstream@DU?$char_traits@D@std@@@std@@7B@ */
 const int basic_ifstream_char_vbtable[] = {0,
-    sizeof(basic_ifstream_char)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_ifstream_char, 0)};
 /* ??_7?$basic_ifstream@DU?$char_traits@D@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_ifstream_char_vtable;
 
 /* ??_8?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@7B@ */
 const int basic_ifstream_wchar_vbtable[] = {0,
-    sizeof(basic_ifstream_wchar)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_ifstream_wchar, 0)};
 /* ??_7?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_ifstream_wchar_vtable;
 
 /* ??_8?$basic_ifstream@GU?$char_traits@G@std@@@std@@7B@ */
 const int basic_ifstream_short_vbtable[] = {0,
-    sizeof(basic_ifstream_wchar)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_ifstream_wchar, 0)};
 /* ??_7?$basic_ifstream@GU?$char_traits@G@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_ifstream_short_vtable;
 
 /* ??_8?$basic_fstream@DU?$char_traits@D@std@@@std@@7B?$basic_istream@DU?$char_traits@D@std@@@1@@ */
 const int basic_fstream_char_vbtable1[] = {0,
-    sizeof(basic_fstream_char)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_fstream_char, 0)};
 /* ??_8?$basic_fstream@DU?$char_traits@D@std@@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@ */
 const int basic_fstream_char_vbtable2[] = {0,
-    sizeof(basic_fstream_char)-FIELD_OFFSET(basic_fstream_char, base.base2)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_fstream_char, FIELD_OFFSET(basic_fstream_char, base.base2))};
 /* ??_7?$basic_fstream@DU?$char_traits@D@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_fstream_char_vtable;
 
 /* ??_8?$basic_fstream@_WU?$char_traits@_W@std@@@std@@7B?$basic_istream@_WU?$char_traits@_W@std@@@1@@ */
 /* ??_8?$basic_fstream@GU?$char_traits@G@std@@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@ */
 const int basic_fstream_wchar_vbtable1[] = {0,
-    sizeof(basic_fstream_wchar)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_fstream_wchar, 0)};
 /* ??_8?$basic_fstream@_WU?$char_traits@_W@std@@@std@@7B?$basic_ostream@_WU?$char_traits@_W@std@@@1@@ */
 /* ??_8?$basic_fstream@GU?$char_traits@G@std@@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@ */
 const int basic_fstream_wchar_vbtable2[] = {0,
-    sizeof(basic_fstream_wchar)-FIELD_OFFSET(basic_fstream_wchar, base.base2)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_fstream_wchar, FIELD_OFFSET(basic_fstream_wchar, base.base2))};
 /* ??_7?$basic_fstream@_WU?$char_traits@_W@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_fstream_wchar_vtable;
 /* ??_7?$basic_fstream@GU?$char_traits@G@std@@@std@@6B@ */
@@ -511,78 +506,78 @@ extern const vtable_ptr MSVCP_basic_fstream_short_vtable;
 
 /* ??_8?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B@ */
 const int basic_ostringstream_char_vbtable[] = {0,
-    sizeof(basic_ostringstream_char)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_ostringstream_char, 0)};
 /* ??_7?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_ostringstream_char_vtable;
 
 /* ??_8?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@7B@ */
 const int basic_ostringstream_wchar_vbtable[] = {0,
-    sizeof(basic_ostringstream_wchar)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_ostringstream_wchar, 0)};
 /* ??_7?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_ostringstream_wchar_vtable;
 
 /* ??_8?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@7B@ */
 const int basic_ostringstream_short_vbtable[] = {0,
-    sizeof(basic_ostringstream_wchar)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_ostringstream_wchar, 0)};
 /* ??_7?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_ostringstream_short_vtable;
 
 /* ??_8?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B@ */
 const int basic_istringstream_char_vbtable[] = {0,
-    sizeof(basic_istringstream_char)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_istringstream_char, 0)};
 /* ??_7?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_istringstream_char_vtable;
 
 /* ??_8?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@7B@ */
 const int basic_istringstream_wchar_vbtable[] = {0,
-    sizeof(basic_istringstream_wchar)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_istringstream_wchar, 0)};
 /* ??_7?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_istringstream_wchar_vtable;
 
 /* ??_8?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@7B@ */
 const int basic_istringstream_short_vbtable[] = {0,
-    sizeof(basic_istringstream_wchar)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_istringstream_wchar, 0)};
 /* ??_7?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_istringstream_short_vtable;
 
 /* ??_8?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B?$basic_istream@DU?$char_traits@D@std@@@1@@ */
 const int basic_stringstream_char_vbtable1[] = {0,
-    sizeof(basic_stringstream_char)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_stringstream_char, 0)};
 /* ??_8?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@ */
 const int basic_stringstream_char_vbtable2[] = {0,
-    sizeof(basic_stringstream_char)-FIELD_OFFSET(basic_stringstream_char, base.base2)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_stringstream_char, FIELD_OFFSET(basic_stringstream_char, base.base2))};
 /* ??_7?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_stringstream_char_vtable;
 
 /* ??_8?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@7B?$basic_istream@_WU?$char_traits@_W@std@@@1@@ */
 const int basic_stringstream_wchar_vbtable1[] = {0,
-    sizeof(basic_stringstream_wchar)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_stringstream_wchar, 0)};
 /* ??_8?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@7B?$basic_ostream@_WU?$char_traits@_W@std@@@1@@ */
 const int basic_stringstream_wchar_vbtable2[] = {0,
-    sizeof(basic_stringstream_wchar)-FIELD_OFFSET(basic_stringstream_wchar, base.base2)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_stringstream_wchar, FIELD_OFFSET(basic_stringstream_wchar, base.base2))};
 /* ??_7?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_stringstream_wchar_vtable;
 
 /* ??_8?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@ */
 const int basic_stringstream_short_vbtable1[] = {0,
-    sizeof(basic_stringstream_wchar)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_stringstream_wchar, 0)};
 /* ??_8?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@ */
 const int basic_stringstream_short_vbtable2[] = {0,
-    sizeof(basic_stringstream_wchar)-FIELD_OFFSET(basic_stringstream_wchar, base.base2)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(basic_stringstream_wchar, FIELD_OFFSET(basic_stringstream_wchar, base.base2))};
 /* ??_7?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_stringstream_short_vtable;
 
 /* ??_7strstreambuf@std@@6B */
 extern const vtable_ptr MSVCP_strstreambuf_vtable;
 
-static const int ostrstream_vbtable[] = {0, sizeof(ostrstream)+BASIC_IOS_VTORDISP_SIZE};
+static const int ostrstream_vbtable[] = {0, VBTABLE_BASIC_IOS_ENTRY(ostrstream, 0)};
 extern const vtable_ptr MSVCP_ostrstream_vtable;
 
-static const int istrstream_vbtable[] = {0, sizeof(istrstream)+BASIC_IOS_VTORDISP_SIZE};
+static const int istrstream_vbtable[] = {0, VBTABLE_BASIC_IOS_ENTRY(istrstream, 0)};
 
-static const int strstream_vbtable1[] = {0, sizeof(strstream)+BASIC_IOS_VTORDISP_SIZE};
+static const int strstream_vbtable1[] = {0, VBTABLE_BASIC_IOS_ENTRY(strstream, 0)};
 static const int strstream_vbtable2[] = {0,
-    sizeof(strstream)-FIELD_OFFSET(strstream, base.base2)+BASIC_IOS_VTORDISP_SIZE};
+    VBTABLE_BASIC_IOS_ENTRY(strstream, FIELD_OFFSET(strstream, base.base2))};
 extern const vtable_ptr MSVCP_strstream_vtable;
 
 DEFINE_RTTI_DATA0(iosb, 0, ".?AV?$_Iosb@H@std@@")
@@ -6228,9 +6223,7 @@ basic_ostream_char* __thiscall basic_ostream_char_ctor(basic_ostream_char *this,
     if(virt_init) {
         this->vbtable = basic_ostream_char_vbtable;
         base = basic_ostream_char_get_basic_ios(this);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)base)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(base);
         basic_ios_char_ctor(base);
     }else {
         base = basic_ostream_char_get_basic_ios(this);
@@ -6254,9 +6247,7 @@ basic_ostream_char* __thiscall basic_ostream_char_ctor_uninitialized(basic_ostre
     if(virt_init) {
         this->vbtable = basic_ostream_char_vbtable;
         base = basic_ostream_char_get_basic_ios(this);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)base)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(base);
         basic_ios_char_ctor(base);
     }else {
         base = basic_ostream_char_get_basic_ios(this);
@@ -7057,9 +7048,7 @@ basic_ostream_wchar* __thiscall basic_ostream_wchar_ctor(basic_ostream_wchar *th
     if(virt_init) {
         this->vbtable = basic_ostream_wchar_vbtable;
         base = basic_ostream_wchar_get_basic_ios(this);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)base)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(base);
         basic_ios_wchar_ctor(base);
     }else {
         base = basic_ostream_wchar_get_basic_ios(this);
@@ -7094,9 +7083,7 @@ basic_ostream_wchar* __thiscall basic_ostream_wchar_ctor_uninitialized(basic_ost
     if(virt_init) {
         this->vbtable = basic_ostream_wchar_vbtable;
         base = basic_ostream_wchar_get_basic_ios(this);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)base)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(base);
         basic_ios_wchar_ctor(base);
     }else {
         base = basic_ostream_wchar_get_basic_ios(this);
@@ -8109,9 +8096,7 @@ basic_istream_char* __thiscall basic_istream_char_ctor_init(basic_istream_char *
     if(virt_init) {
         this->vbtable = basic_istream_char_vbtable;
         base = basic_istream_char_get_basic_ios(this);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)base)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(base);
         basic_ios_char_ctor(base);
     }else {
         base = basic_istream_char_get_basic_ios(this);
@@ -8144,9 +8129,7 @@ basic_istream_char* __thiscall basic_istream_char_ctor_uninitialized(basic_istre
     if(virt_init) {
         this->vbtable = basic_istream_char_vbtable;
         base = basic_istream_char_get_basic_ios(this);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)base)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(base);
         basic_ios_char_ctor(base);
     }else {
         base = basic_istream_char_get_basic_ios(this);
@@ -9550,9 +9533,7 @@ basic_istream_wchar* __thiscall basic_istream_wchar_ctor_init(basic_istream_wcha
     if(virt_init) {
         this->vbtable = basic_istream_wchar_vbtable;
         base = basic_istream_wchar_get_basic_ios(this);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)base)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(base);
         basic_ios_wchar_ctor(base);
     }else {
         base = basic_istream_wchar_get_basic_ios(this);
@@ -9607,9 +9588,7 @@ basic_istream_wchar* __thiscall basic_istream_wchar_ctor_uninitialized(
     if(virt_init) {
         this->vbtable = basic_istream_wchar_vbtable;
         base = basic_istream_wchar_get_basic_ios(this);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)base)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(base);
         basic_ios_wchar_ctor(base);
     }else {
         base = basic_istream_wchar_get_basic_ios(this);
@@ -11099,9 +11078,7 @@ basic_iostream_char* __thiscall basic_iostream_char_ctor(basic_iostream_char *th
         this->base1.vbtable = basic_iostream_char_vbtable1;
         this->base2.vbtable = basic_iostream_char_vbtable2;
         basic_ios = basic_istream_char_get_basic_ios(&this->base1);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_char_get_basic_ios(&this->base1);
@@ -11197,9 +11174,7 @@ basic_iostream_wchar* __thiscall basic_iostream_wchar_ctor(basic_iostream_wchar
         this->base1.vbtable = basic_iostream_wchar_vbtable1;
         this->base2.vbtable = basic_iostream_wchar_vbtable2;
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base1);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_wchar_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base1);
@@ -11310,9 +11285,7 @@ basic_ofstream_char* __thiscall basic_ofstream_char_ctor(basic_ofstream_char *th
     if(virt_init) {
         this->base.vbtable = basic_ofstream_char_vbtable;
         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
@@ -11337,9 +11310,7 @@ basic_ofstream_char* __thiscall basic_ofstream_char_ctor_file(
     if(virt_init) {
         this->base.vbtable = basic_ofstream_char_vbtable;
         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
@@ -11537,9 +11508,7 @@ basic_ofstream_wchar* __thiscall basic_ofstream_wchar_ctor(basic_ofstream_wchar
     if(virt_init) {
         this->base.vbtable = basic_ofstream_wchar_vbtable;
         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_wchar_ctor(basic_ios);
     }else {
         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
@@ -11574,9 +11543,7 @@ basic_ofstream_wchar* __thiscall basic_ofstream_wchar_ctor_file(
     if(virt_init) {
         this->base.vbtable = basic_ofstream_wchar_vbtable;
         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_wchar_ctor(basic_ios);
     }else {
         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
@@ -11831,9 +11798,7 @@ basic_ifstream_char* __thiscall basic_ifstream_char_ctor(basic_ifstream_char *th
     if(virt_init) {
         this->base.vbtable = basic_ifstream_char_vbtable;
         basic_ios = basic_istream_char_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_char_get_basic_ios(&this->base);
@@ -11858,9 +11823,7 @@ basic_ifstream_char* __thiscall basic_ifstream_char_ctor_file(
     if(virt_init) {
         this->base.vbtable = basic_ifstream_char_vbtable;
         basic_ios = basic_istream_char_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_char_get_basic_ios(&this->base);
@@ -12067,9 +12030,7 @@ basic_ifstream_wchar* __thiscall basic_ifstream_wchar_ctor(basic_ifstream_wchar
     if(virt_init) {
         this->base.vbtable = basic_ifstream_wchar_vbtable;
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_wchar_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
@@ -12104,9 +12065,7 @@ basic_ifstream_wchar* __thiscall basic_ifstream_wchar_ctor_file(
     if(virt_init) {
         this->base.vbtable = basic_ifstream_wchar_vbtable;
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_wchar_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
@@ -12380,9 +12339,7 @@ basic_fstream_char* __thiscall basic_fstream_char_ctor(basic_fstream_char *this,
         this->base.base1.vbtable = basic_fstream_char_vbtable1;
         this->base.base2.vbtable = basic_fstream_char_vbtable2;
         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
@@ -12408,9 +12365,7 @@ basic_fstream_char* __thiscall basic_fstream_char_ctor_file(basic_fstream_char *
         this->base.base1.vbtable = basic_fstream_char_vbtable1;
         this->base.base2.vbtable = basic_fstream_char_vbtable2;
         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
@@ -12618,9 +12573,7 @@ basic_fstream_wchar* __thiscall basic_fstream_wchar_ctor(basic_fstream_wchar *th
         this->base.base1.vbtable = basic_fstream_wchar_vbtable1;
         this->base.base2.vbtable = basic_fstream_wchar_vbtable2;
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_wchar_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
@@ -12656,9 +12609,7 @@ basic_fstream_wchar* __thiscall basic_fstream_wchar_ctor_file(basic_fstream_wcha
         this->base.base1.vbtable = basic_fstream_wchar_vbtable1;
         this->base.base2.vbtable = basic_fstream_wchar_vbtable2;
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_wchar_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
@@ -12931,9 +12882,7 @@ basic_ostringstream_char* __thiscall basic_ostringstream_char_ctor_str(basic_ost
     if(virt_init) {
         this->base.vbtable = basic_ostringstream_char_vbtable;
         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
@@ -12958,9 +12907,7 @@ basic_ostringstream_char* __thiscall basic_ostringstream_char_ctor_mode(
     if(virt_init) {
         this->base.vbtable = basic_ostringstream_char_vbtable;
         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
@@ -13078,9 +13025,7 @@ basic_ostringstream_wchar* __thiscall basic_ostringstream_wchar_ctor_str(basic_o
     if(virt_init) {
         this->base.vbtable = basic_ostringstream_wchar_vbtable;
         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_wchar_ctor(basic_ios);
     }else {
         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
@@ -13116,9 +13061,7 @@ basic_ostringstream_wchar* __thiscall basic_ostringstream_wchar_ctor_mode(
     if(virt_init) {
         this->base.vbtable = basic_ostringstream_wchar_vbtable;
         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_wchar_ctor(basic_ios);
     }else {
         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
@@ -13266,9 +13209,7 @@ basic_istringstream_char* __thiscall basic_istringstream_char_ctor_str(basic_ist
     if(virt_init) {
         this->base.vbtable = basic_istringstream_char_vbtable;
         basic_ios = basic_istream_char_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_char_get_basic_ios(&this->base);
@@ -13293,9 +13234,7 @@ basic_istringstream_char* __thiscall basic_istringstream_char_ctor_mode(
     if(virt_init) {
         this->base.vbtable = basic_istringstream_char_vbtable;
         basic_ios = basic_istream_char_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_char_get_basic_ios(&this->base);
@@ -13413,9 +13352,7 @@ basic_istringstream_wchar* __thiscall basic_istringstream_wchar_ctor_str(basic_i
     if(virt_init) {
         this->base.vbtable = basic_istringstream_wchar_vbtable;
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_wchar_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
@@ -13451,9 +13388,7 @@ basic_istringstream_wchar* __thiscall basic_istringstream_wchar_ctor_mode(
     if(virt_init) {
         this->base.vbtable = basic_istringstream_wchar_vbtable;
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_wchar_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
@@ -13602,9 +13537,7 @@ basic_stringstream_char* __thiscall basic_stringstream_char_ctor_str(basic_strin
         this->base.base1.vbtable = basic_stringstream_char_vbtable1;
         this->base.base2.vbtable = basic_stringstream_char_vbtable2;
         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
@@ -13630,9 +13563,7 @@ basic_stringstream_char* __thiscall basic_stringstream_char_ctor_mode(
         this->base.base1.vbtable = basic_stringstream_char_vbtable1;
         this->base.base2.vbtable = basic_stringstream_char_vbtable2;
         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
@@ -13752,9 +13683,7 @@ basic_stringstream_wchar* __thiscall basic_stringstream_wchar_ctor_str(basic_str
         this->base.base1.vbtable = basic_stringstream_wchar_vbtable1;
         this->base.base2.vbtable = basic_stringstream_wchar_vbtable2;
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_wchar_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
@@ -13791,9 +13720,7 @@ basic_stringstream_wchar* __thiscall basic_stringstream_wchar_ctor_mode(
         this->base.base1.vbtable = basic_stringstream_wchar_vbtable1;
         this->base.base2.vbtable = basic_stringstream_wchar_vbtable2;
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_wchar_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
@@ -14339,9 +14266,7 @@ ostrstream* __thiscall ostrstream_ctor(ostrstream *this, char *buf, streamsize s
     if(virt_init) {
         this->base.vbtable = ostrstream_vbtable;
         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
@@ -14848,9 +14773,7 @@ strstream* __thiscall strstream_ctor(strstream *this, char *buf, streamsize size
         this->base.base1.vbtable = strstream_vbtable1;
         this->base.base2.vbtable = strstream_vbtable2;
         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-#if _MSVCP_VER >= 110
-        ((basic_ios_vtordisp*)basic_ios)[-1].vtordisp = 0;
-#endif
+        INIT_BASIC_IOS_VTORDISP(basic_ios);
         basic_ios_char_ctor(basic_ios);
     }else {
         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);