Piotr Caban : msvcrt: Skip RTTI signature==1 tests on platforms that doesn' t support it.
Alexandre Julliard
julliard at winehq.org
Mon Sep 10 15:22:12 CDT 2012
Module: wine
Branch: master
Commit: 688aa1f529154d1fe9d50d6bebcfe229f8dba632
URL: http://source.winehq.org/git/wine.git/?a=commit;h=688aa1f529154d1fe9d50d6bebcfe229f8dba632
Author: Piotr Caban <piotr at codeweavers.com>
Date: Mon Sep 10 19:06:19 2012 +0200
msvcrt: Skip RTTI signature==1 tests on platforms that doesn't support it.
---
dlls/msvcrt/tests/cpp.c | 42 ++++++++++++++++++++++++++++++++++--------
1 files changed, 34 insertions(+), 8 deletions(-)
diff --git a/dlls/msvcrt/tests/cpp.c b/dlls/msvcrt/tests/cpp.c
index b3dafbb..140d8b2 100644
--- a/dlls/msvcrt/tests/cpp.c
+++ b/dlls/msvcrt/tests/cpp.c
@@ -828,6 +828,17 @@ static void test_type_info(void)
ok(res == 1, "expected 1, got %d\n", res);
}
+static inline vtable_ptr *get_vtable( void *obj )
+{
+ return *(vtable_ptr **)obj;
+}
+
+static inline void/*rtti_object_locator*/ *get_obj_locator( void *cppobj )
+{
+ const vtable_ptr *vtable = get_vtable( cppobj );
+ return (void *)vtable[-1];
+}
+
#ifndef __x86_64__
#define RTTI_SIGNATURE 0
#define DEFINE_RTTI_REF(type, name) type *name
@@ -840,6 +851,16 @@ static void test_type_info(void)
/* Test RTTI functions */
static void test_rtti(void)
{
+ struct _object_locator
+ {
+ unsigned int signature;
+ int base_class_offset;
+ unsigned int flags;
+ DEFINE_RTTI_REF(type_info, type_descriptor);
+ DEFINE_RTTI_REF(struct _rtti_object_hierarchy, type_hierarchy);
+ DEFINE_RTTI_REF(void, object_locator);
+ } *obj_locator;
+
struct rtti_data
{
type_info type_info[4];
@@ -867,14 +888,7 @@ static void test_rtti(void)
DEFINE_RTTI_REF(struct _rtti_base_array, base_classes);
} object_hierarchy;
- struct {
- unsigned int signature;
- int base_class_offset;
- unsigned int flags;
- DEFINE_RTTI_REF(type_info, type_descriptor);
- DEFINE_RTTI_REF(struct _rtti_object_hierarchy, type_hierarchy);
- DEFINE_RTTI_REF(void, object_locator);
- } object_locator;
+ struct _object_locator object_locator;
} simple_class_rtti = {
{ {NULL, NULL, "simple_class"} },
{ {RTTI_REF(simple_class_rtti, type_info[0]), 0, {0, 0, 0}, 0} },
@@ -897,6 +911,7 @@ static void test_rtti(void)
type_info *ti,*bti;
exception e,b;
void *casted;
+ BOOL old_signature;
if (bAncientVersion ||
!p__RTCastToVoid || !p__RTtypeid || !pexception_ctor || !pbad_typeid_ctor
@@ -906,6 +921,12 @@ static void test_rtti(void)
call_func2(pexception_ctor, &e, &e_name);
call_func2(pbad_typeid_ctor, &b, e_name);
+ obj_locator = get_obj_locator(&e);
+ if(obj_locator->signature!=RTTI_SIGNATURE && sizeof(void*)>sizeof(int))
+ old_signature = TRUE;
+ else
+ old_signature = FALSE;
+
/* dynamic_cast to void* */
casted = p__RTCastToVoid(&e);
ok (casted == (void*)&e, "failed cast to void\n");
@@ -928,6 +949,11 @@ static void test_rtti(void)
call_func1(pexception_dtor, &e);
call_func1(pbad_typeid_dtor, &b);
+ if(old_signature) {
+ skip("signature==1 is not supported\n");
+ return;
+ }
+
ti = p__RTtypeid(&simple_class);
ok (ti && ti->mangled && !strcmp(ti->mangled, "simple_class"),
"incorrect rtti data\n");
More information about the wine-cvs
mailing list