⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpp.c

📁 Wine-20031016
💻 C
📖 第 1 页 / 共 2 页
字号:
  /* Operator equals */  memset(&e2, 1, sizeof(e2));  pe = call_func2(pbad_typeid_opequals, &e2, &e);  ok(e2.vtable != NULL, "Null bad_typeid vtable for e2\n");  ok(e2.name && e2.name != e.name && !strcmp(e2.name, "A bad_typeid name"), "Bad bad_typeid name for e2\n");  ok(e2.do_free == 1, "do_free set to %d for e2\n", e2.do_free);  ok(pe == &e2, "opequals didn't return e2\n");  /* what() */  name = call_func1(pbad_typeid_what, &e2);  ok(e2.name == name, "Bad bad_typeid name from e2::what()\n");  /* vtable ptr */  ok(e2.vtable == pexception_vtable, "Bad vtable for e2\n");  call_func1(pbad_typeid_dtor, &e2);  /* new() */  pe = poperator_new(sizeof(exception));  ok(pe != NULL, "new() failed\n");  if (pe)  {    call_func2(pbad_typeid_ctor, pe, e_name);    /* scalar dtor */    call_func2(pbad_typeid_scalar_dtor, pe, 0); /* Shouldn't delete pe */    pe->name = NULL;    pe->do_free = 0;    call_func2(pbad_typeid_scalar_dtor, pe, 1); /* Should delete pe */  }  pe = poperator_new(sizeof(exception));  ok(pe != NULL, "new() failed\n");  if (pe)  {    /* vector dtor, single element */    call_func2(pbad_typeid_ctor, pe, e_name);    call_func2(pbad_typeid_vector_dtor, pe, 1); /* Should delete pe as single element*/  }  pe = poperator_new(sizeof(exception) * 4 + sizeof(int));  ok(pe != NULL, "new() failed\n");  if (pe)  {    /* vector dtor, multiple elements */    *((int*)pe) = 3;    pe = (exception*)((int*)pe + 1);    call_func2(pbad_typeid_ctor, &pe[0], e_name);    call_func2(pbad_typeid_ctor, &pe[1], e_name);    call_func2(pbad_typeid_ctor, &pe[2], e_name);    pe[3].name = 0;    pe[3].do_free = 1; /* Crash if we try to free this element */    call_func2(pbad_typeid_vector_dtor, pe, 3); /* Should delete all 3 and then pe block */  }  /* test our exported vtable is kosher */  pe = (void*)pbad_typeid_vtable; /* Use the exception struct to get vtable ptrs */  pbad_typeid_vector_dtor = (void*)pe->vtable;  pbad_typeid_what = (void*)pe->name;  name = call_func1(pbad_typeid_what, &e);  ok(e.name == name, "Bad bad_typeid name from vtable e::what()\n");  if (p__RTtypeid && !bAncientVersion)  {    /* Check the rtti */    type_info *ti = p__RTtypeid(&e);    ok (ti != NULL && !strcmp(ti->mangled, ".?AVbad_typeid@@"), "bad rtti for e (%s)\n",        !ti ? "null" : ti->mangled);  }  call_func2(pbad_typeid_vector_dtor, &e, 0); /* Should delete e.name, but not e */}/* Ditto for this test... */static void test_bad_cast(void){  static const char* e_name = "A bad_cast name";  char* name;  exception e, e2, e3, *pe;  if (!poperator_new || !poperator_delete ||      !pbad_cast_ctor || !pbad_cast_copy_ctor ||      !pbad_cast_dtor || !pbad_cast_opequals || !pbad_cast_what ||      !pbad_cast_vtable || !pbad_cast_vector_dtor || !pbad_cast_scalar_dtor)    return;  if (pbad_cast_ctor2)  {    /* 'const char*' ctor */    memset(&e, 0, sizeof(e));    call_func2(pbad_cast_ctor2, &e, e_name);    ok(e.vtable != NULL, "Null bad_cast vtable for e\n");    ok(e.name && e.name != e_name && !strcmp(e.name, "A bad_cast name"), "Bad name '%s' for e\n", e.name);    ok(e.do_free == 1, "do_free set to %d for e\n", e.do_free);    call_func1(pbad_cast_dtor, &e);  }  /* 'const char*&' ctor */  memset(&e, 0, sizeof(e));  call_func2(pbad_cast_ctor, &e, &e_name);  ok(e.vtable != NULL, "Null bad_cast vtable for e\n");  ok(e.name && e.name != e_name && !strcmp(e.name, "A bad_cast name"), "Bad name '%s' for e\n", e.name);  ok(e.do_free == 1, "do_free set to %d for e\n", e.do_free);  /* Copy ctor */  memset(&e2, 0, sizeof(e2));  call_func2(pbad_cast_copy_ctor, &e2, &e);  ok(e2.vtable != NULL, "Null bad_cast vtable for e2\n");  ok(e2.name && e2.name != e.name && !strcmp(e2.name, "A bad_cast name"), "Bad name '%s' for e2\n", e2.name);  ok(e2.do_free == 1, "do_free set to %d for e2\n", e2.do_free);  /* Ctor closure */  if (pbad_cast_ctor_closure)  {    memset(&e3, 1, sizeof(e3));    call_func1(pbad_cast_ctor_closure, &e3);    ok(e3.vtable != NULL, "Null bad_cast vtable for e3\n");    ok(e3.name && !strcmp(e3.name, "bad cast"), "Bad bad_cast name for e3\n");    ok(e3.do_free == 1, "do_free set to %d for e3\n", e3.do_free);    ok(e.vtable == e3.vtable, "bad_cast closure vtables differ!\n");    call_func1(pbad_cast_dtor, &e3);  }  ok(e.vtable == e2.vtable, "bad_cast vtables differ!\n");  /* Test calling the dtors */  call_func1(pbad_cast_dtor, &e2);  /* Operator equals */  memset(&e2, 1, sizeof(e2));  pe = call_func2(pbad_cast_opequals, &e2, &e);  ok(e2.vtable != NULL, "Null bad_cast vtable for e2\n");  ok(e2.name && e2.name != e.name && !strcmp(e2.name, "A bad_cast name"), "Bad bad_cast name for e2\n");  ok(e2.do_free == 1, "do_free set to %d for e2\n", e2.do_free);  ok(pe == &e2, "opequals didn't return e2\n");  /* what() */  name = call_func1(pbad_cast_what, &e2);  ok(e2.name == name, "Bad bad_cast name from e2::what()\n");  /* vtable ptr */  ok(e2.vtable == pexception_vtable, "Bad vtable for e2\n");  call_func1(pbad_cast_dtor, &e2);  /* new() */  pe = poperator_new(sizeof(exception));  ok(pe != NULL, "new() failed\n");  if (pe)  {    call_func2(pbad_cast_ctor, pe, &e_name);    /* scalar dtor */    call_func2(pbad_cast_scalar_dtor, pe, 0); /* Shouldn't delete pe */    pe->name = NULL;    pe->do_free = 0;    call_func2(pbad_cast_scalar_dtor, pe, 1); /* Should delete pe */  }  pe = poperator_new(sizeof(exception));  ok(pe != NULL, "new() failed\n");  if (pe)  {    /* vector dtor, single element */    call_func2(pbad_cast_ctor, pe, &e_name);    call_func2(pbad_cast_vector_dtor, pe, 1); /* Should delete pe as single element*/  }  pe = poperator_new(sizeof(exception) * 4 + sizeof(int));  ok(pe != NULL, "new() failed\n");  if (pe)  {    /* vector dtor, multiple elements */    *((int*)pe) = 3;    pe = (exception*)((int*)pe + 1);    call_func2(pbad_cast_ctor, &pe[0], &e_name);    call_func2(pbad_cast_ctor, &pe[1], &e_name);    call_func2(pbad_cast_ctor, &pe[2], &e_name);    pe[3].name = 0;    pe[3].do_free = 1; /* Crash if we try to free this element */    call_func2(pbad_cast_vector_dtor, pe, 3); /* Should delete all 3 and then pe block */  }  /* test our exported vtable is kosher */  pe = (void*)pbad_cast_vtable; /* Use the exception struct to get vtable ptrs */  pbad_cast_vector_dtor = (void*)pe->vtable;  pbad_cast_what = (void*)pe->name;  name = call_func1(pbad_cast_what, &e);  ok(e.name == name, "Bad bad_cast name from vtable e::what()\n");  if (p__RTtypeid && !bAncientVersion)  {    /* Check the rtti */    type_info *ti = p__RTtypeid(&e);    ok (ti != NULL && !strcmp(ti->mangled, ".?AVbad_cast@@"), "bad rtti for e\n");  }  call_func2(pbad_cast_vector_dtor, &e, 0); /* Should delete e.name, but not e */}/* ... and this one */static void test___non_rtti_object(void){  static const char* e_name = "A __non_rtti_object name";  char* name;  exception e, e2, *pe;  if (!poperator_new || !poperator_delete ||      !p__non_rtti_object_ctor || !p__non_rtti_object_copy_ctor ||      !p__non_rtti_object_dtor || !p__non_rtti_object_opequals || !p__non_rtti_object_what ||      !p__non_rtti_object_vtable || !p__non_rtti_object_vector_dtor || !p__non_rtti_object_scalar_dtor)    return;  /* 'const char*' ctor */  memset(&e, 0, sizeof(e));  call_func2(p__non_rtti_object_ctor, &e, e_name);  ok(e.vtable != NULL, "Null __non_rtti_object vtable for e\n");  ok(e.name && e.name != e_name && !strcmp(e.name, "A __non_rtti_object name"), "Bad name '%s' for e\n", e.name);  ok(e.do_free == 1, "do_free set to %d for e\n", e.do_free);  /* Copy ctor */  memset(&e2, 0, sizeof(e2));  call_func2(p__non_rtti_object_copy_ctor, &e2, &e);  ok(e2.vtable != NULL, "Null __non_rtti_object vtable for e2\n");  ok(e2.name && e2.name != e.name && !strcmp(e2.name, "A __non_rtti_object name"), "Bad name '%s' for e2\n", e2.name);  ok(e2.do_free == 1, "do_free set to %d for e2\n", e2.do_free);  ok(e.vtable == e2.vtable, "__non_rtti_object vtables differ!\n");  /* Test calling the dtors */  call_func1(p__non_rtti_object_dtor, &e2);  /* Operator equals */  memset(&e2, 1, sizeof(e2));  pe = call_func2(p__non_rtti_object_opequals, &e2, &e);  ok(e2.vtable != NULL, "Null __non_rtti_object vtable for e2\n");  ok(e2.name && e2.name != e.name && !strcmp(e2.name, "A __non_rtti_object name"), "Bad __non_rtti_object name for e2\n");  ok(e2.do_free == 1, "do_free set to %d for e2\n", e2.do_free);  ok(pe == &e2, "opequals didn't return e2\n");  /* what() */  name = call_func1(p__non_rtti_object_what, &e2);  ok(e2.name == name, "Bad __non_rtti_object name from e2::what()\n");  /* vtable ptr */  ok(e2.vtable == pexception_vtable, "Bad vtable for e2\n");  call_func1(p__non_rtti_object_dtor, &e2);  /* new() */  pe = poperator_new(sizeof(exception));  ok(pe != NULL, "new() failed\n");  if (pe)  {    call_func2(p__non_rtti_object_ctor, pe, e_name);    /* scalar dtor */    call_func2(p__non_rtti_object_scalar_dtor, pe, 0); /* Shouldn't delete pe */    pe->name = NULL;    pe->do_free = 0;    call_func2(p__non_rtti_object_scalar_dtor, pe, 1); /* Should delete pe */  }  pe = poperator_new(sizeof(exception));  ok(pe != NULL, "new() failed\n");  if (pe)  {    /* vector dtor, single element */    call_func2(p__non_rtti_object_ctor, pe, e_name);    call_func2(p__non_rtti_object_vector_dtor, pe, 1); /* Should delete pe as single element*/  }  pe = poperator_new(sizeof(exception) * 4 + sizeof(int));  ok(pe != NULL, "new() failed\n");  if (pe)  {    /* vector dtor, multiple elements */    *((int*)pe) = 3;    pe = (exception*)((int*)pe + 1);    call_func2(p__non_rtti_object_ctor, &pe[0], e_name);    call_func2(p__non_rtti_object_ctor, &pe[1], e_name);    call_func2(p__non_rtti_object_ctor, &pe[2], e_name);    pe[3].name = 0;    pe[3].do_free = 1; /* Crash if we try to free this element */    call_func2(p__non_rtti_object_vector_dtor, pe, 3); /* Should delete all 3 and then pe block */  }  /* test our exported vtable is kosher */  pe = (void*)p__non_rtti_object_vtable; /* Use the exception struct to get vtable ptrs */  p__non_rtti_object_vector_dtor = (void*)pe->vtable;  p__non_rtti_object_what = (void*)pe->name;  name = call_func1(p__non_rtti_object_what, &e);  ok(e.name == name, "Bad __non_rtti_object name from vtable e::what()\n");  if (p__RTtypeid && !bAncientVersion)  {    /* Check the rtti */    type_info *ti = p__RTtypeid(&e);    ok (ti != NULL && !strcmp(ti->mangled, ".?AV__non_rtti_object@@"), "bad rtti for e\n");  }  call_func2(p__non_rtti_object_vector_dtor, &e, 0); /* Should delete e.name, but not e */}static void test_type_info(void){  static type_info t1 = { NULL, NULL,{'.','?','A','V','t','e','s','t','1','@','@',0,0,0,0,0 } };  static type_info t1_1 = { NULL, NULL,{'?','?','A','V','t','e','s','t','1','@','@',0,0,0,0,0 } };  static type_info t2 = { NULL, NULL, {'.','?','A','V','t','e','s','t','2','@','@',0,0,0,0,0 } };  char* name;  int res;  if (!pmalloc || !pfree || !ptype_info_dtor || !ptype_info_raw_name ||      !ptype_info_name || !ptype_info_before ||      !ptype_info_opequals_equals || !ptype_info_opnot_equals)    return;  /* Test calling the dtors */  call_func1(ptype_info_dtor, &t1); /* No effect, since name is NULL */  t1.name = pmalloc(64);  strcpy(t1.name, "foo");  call_func1(ptype_info_dtor, &t1); /* Frees t1.name using 'free' */  /* raw_name */  t1.name = NULL;  name = call_func1(ptype_info_raw_name, &t1);  /* FIXME: This fails on native; it shouldn't though - native bug?   * ok(name && !strcmp(name, t1.mangled), "bad raw_name '%s' for t1 (expected '%s')\n", name, t1.mangled);   */  ok(t1.name == NULL, "raw_name() set name for t1\n");  /* name */  t1.name = NULL;  name = call_func1(ptype_info_name, &t1);  ok(name && t1.name && !strcmp(name, t1.name), "bad name '%s' for t1\n", name);  todo_wine  {    /* Demangling doesn't work yet, since __unDName() is a stub */    ok(t1.name && !strcmp(t1.name, "class test1"), "demangled to '%s' for t1\n", t1.name);  }  call_func1(ptype_info_dtor, &t1);  /* before */  t1.name = NULL;  res = (int)call_func2(ptype_info_before, &t1, &t1);  ok(res == 0, "expected 0, got %d\n", res);  res = (int)call_func2(ptype_info_before, &t2, &t1);  ok(res == 0, "expected 0, got %d\n", res);  res = (int)call_func2(ptype_info_before, &t1, &t2);  ok(res == 1, "expected 1, got %d\n", res);  /* Doesn't check first char */  res = (int)call_func2(ptype_info_before, &t1, &t1_1);  ok(res == 0, "expected 0, got %d\n", res);  /* opequals_equals */  t1.name = NULL;  res = (int)call_func2(ptype_info_opequals_equals, &t1, &t1);  ok(res == 1, "expected 1, got %d\n", res);  res = (int)call_func2(ptype_info_opequals_equals, &t1, &t2);  ok(res == 0, "expected 0, got %d\n", res);  res = (int)call_func2(ptype_info_opequals_equals, &t2, &t1);  ok(res == 0, "expected 0, got %d\n", res);  /* opnot_equals */  t1.name = NULL;  res = (int)call_func2(ptype_info_opnot_equals, &t1, &t1);  ok(res == 0, "expected 0, got %d\n", res);  res = (int)call_func2(ptype_info_opnot_equals, &t1, &t2);  ok(res == 1, "expected 1, got %d\n", res);  res = (int)call_func2(ptype_info_opnot_equals, &t2, &t1);  ok(res == 1, "expected 1, got %d\n", res);}/* Test RTTI functions */static void test_rtti(void){  static const char* e_name = "name";  type_info *ti,*bti;  exception e,b;  void *casted;  if (bAncientVersion ||      !p__RTCastToVoid || !p__RTtypeid || !pexception_ctor || !pbad_typeid_ctor || !p__RTDynamicCast)    return;  call_func2(pexception_ctor, &e, &e_name);  call_func2(pbad_typeid_ctor, &b, e_name);  /* dynamic_cast to void* */  casted = p__RTCastToVoid(&e);  ok (casted == (void*)&e, "failed cast to void\n");  /* dynamic_cast up */  ti = p__RTtypeid(&e);  bti = p__RTtypeid(&b);  casted = p__RTDynamicCast(&b, 0, NULL, ti, 0);  ok (casted == (void*)&b, "failed cast from bad_cast to exception\n");  /* dynamic_cast down */  casted = p__RTDynamicCast(&e, 0, NULL, bti, 0);  ok (casted == NULL, "Cast succeeded\n");}START_TEST(cpp){  InitFunctionPtrs();  test_exception();  test_bad_typeid();  test_bad_cast();  test___non_rtti_object();  test_type_info();  test_rtti();  if (hMsvcrt)    FreeLibrary(hMsvcrt);}#endif /* __i386__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -