Hi Uwe / Alexander,
I've been trying to get the 'thiscall' issue sorted out, but its proving slightly interesting :-)
The issue is as follows: Post-change I have a routine like:
void MSVCRT___non_rtti_object_copy_ctor(const __non_rtti_object * rhs, CONTEXT86* context) { __non_rtti_object *_this = (__non_rtti_object *)context->Ecx; TRACE("(%p %p)\n",_this,rhs); MSVCRT_bad_typeid_copy_ctor(&_this->base,&rhs->base); <<--- Type errors during compile }
This will not compile, because I have ALSO changed MSVCRT_bad_typeid_copy_ctor as it too suffers from the _thiscall issue. (Even if I switch the parms around to account for moving the this to the last parm).
void MSVCRT_bad_typeid_copy_ctor(const bad_typeid * rhs, CONTEXT86* context) { bad_typeid *_this = (bad_typeid *)context->Ecx; TRACE("(%p %p)\n",_this,rhs); MSVCRT_exception_copy_ctor(&_this->base,&rhs->base); }
Ie it now expects a context86 structure with ecx pointing to 'this' (this I guess is &_this->base). (And note it suffers from the same problem in the call to MSVCRT_exception_copy_ctor!)
Now I can change the routines to say for example: context->Ecx = (DWORD)&_this->base; MSVCRT_bad_typeid_copy_ctor(&rhs->base, context);
But I feel this is making a hack even worse, as the context isnt really anymore as other registers would have changed. Is this acceptable?
If so, how does this patch look (I havent tried it against the original culprit just yet, but will do assuming the idea is right).
Jason
Index: dlls/msvcrt/cpp.c =================================================================== RCS file: /home/wine/wine/dlls/msvcrt/cpp.c,v retrieving revision 1.12 diff -u -r1.12 cpp.c --- dlls/msvcrt/cpp.c 19 Jul 2002 03:24:50 -0000 1.12 +++ dlls/msvcrt/cpp.c 24 May 2003 19:40:48 -0000 @@ -97,8 +97,9 @@ /****************************************************************** * ??0exception@@QAE@ABQBD@Z (MSVCRT.@) */ -void MSVCRT_exception_ctor(exception * _this, const char ** name) +void MSVCRT_exception_ctor(const char ** name, CONTEXT86* context) { + exception *_this = (exception *)context->Ecx; TRACE("(%p %s)\n",_this,*name); _this->vtable = exception_vtable; _this->name = *name; @@ -109,8 +110,9 @@ /****************************************************************** * ??0exception@@QAE@ABV0@@Z (MSVCRT.@) */ -void MSVCRT_exception_copy_ctor(exception * _this, const exception * rhs) +void MSVCRT_exception_copy_ctor(const exception * rhs, CONTEXT86* context) { + exception *_this = (exception *)context->Ecx; TRACE("(%p %p)\n",_this,rhs); if (_this != rhs) memcpy (_this, rhs, sizeof (*_this)); @@ -120,8 +122,9 @@ /****************************************************************** * ??0exception@@QAE@XZ (MSVCRT.@) */ -void MSVCRT_exception_default_ctor(exception * _this) +void MSVCRT_exception_default_ctor(CONTEXT86* context) { + exception *_this = (exception *)context->Ecx; TRACE("(%p)\n",_this); _this->vtable = exception_vtable; _this->name = ""; @@ -131,16 +134,18 @@ /****************************************************************** * ??1exception@@UAE@XZ (MSVCRT.@) */ -void MSVCRT_exception_dtor(exception * _this) +void MSVCRT_exception_dtor(CONTEXT86* context) { + exception *_this = (exception *)context->Ecx; TRACE("(%p)\n",_this); }
/****************************************************************** * ??4exception@@QAEAAV0@ABV0@@Z (MSVCRT.@) */ -exception * MSVCRT_exception_opequals(exception * _this, const exception * rhs) +exception * MSVCRT_exception_opequals(const exception * rhs, CONTEXT86* context) { + exception *_this = (exception *)context->Ecx; TRACE("(%p %p)\n",_this,rhs); memcpy (_this, rhs, sizeof (*_this)); TRACE("name = %s\n",_this->name); @@ -150,8 +155,9 @@ /****************************************************************** * ??_Eexception@@UAEPAXI@Z (MSVCRT.@) */ -void * MSVCRT_exception__unknown_E(exception * _this, unsigned int arg1) +void * MSVCRT_exception__unknown_E(unsigned int arg1, CONTEXT86* context) { + exception *_this = (exception *)context->Ecx; TRACE("(%p %d)\n",_this,arg1); _purecall(); return NULL; @@ -160,8 +166,9 @@ /****************************************************************** * ??_Gexception@@UAEPAXI@Z (MSVCRT.@) */ -void * MSVCRT_exception__unknown_G(exception * _this, unsigned int arg1) +void * MSVCRT_exception__unknown_G(unsigned int arg1, CONTEXT86* context) { + exception *_this = (exception *)context->Ecx; TRACE("(%p %d)\n",_this,arg1); _purecall(); return NULL; @@ -170,8 +177,9 @@ /****************************************************************** * ?what@exception@@UBEPBDXZ (MSVCRT.@) */ -const char * MSVCRT_what_exception(exception * _this) +const char * MSVCRT_what_exception(CONTEXT86* context) { + exception *_this = (exception *)context->Ecx; TRACE("(%p) returning %s\n",_this,_this->name); return _this->name; } @@ -237,77 +245,89 @@ /****************************************************************** * ??0bad_typeid@@QAE@ABV0@@Z (MSVCRT.@) */ -void MSVCRT_bad_typeid_copy_ctor(bad_typeid * _this, const bad_typeid * rhs) +void MSVCRT_bad_typeid_copy_ctor(const bad_typeid * rhs, CONTEXT86* context) { + bad_typeid *_this = (bad_typeid *)context->Ecx; TRACE("(%p %p)\n",_this,rhs); - MSVCRT_exception_copy_ctor(&_this->base,&rhs->base); + context->Ecx = (DWORD)&_this->base; + MSVCRT_exception_copy_ctor(&rhs->base, context); }
/****************************************************************** * ??0bad_typeid@@QAE@PBD@Z (MSVCRT.@) */ -void MSVCRT_bad_typeid_ctor(bad_typeid * _this, const char * name) +void MSVCRT_bad_typeid_ctor(const char * name, CONTEXT86* context) { + bad_typeid *_this = (bad_typeid *)context->Ecx; TRACE("(%p %s)\n",_this,name); - MSVCRT_exception_ctor(&_this->base, &name); + context->Ecx = (DWORD)&_this->base; + MSVCRT_exception_ctor(&name, context); _this->base.vtable = bad_typeid_vtable; }
/****************************************************************** * ??1bad_typeid@@UAE@XZ (MSVCRT.@) */ -void MSVCRT_bad_typeid_dtor(bad_typeid * _this) +void MSVCRT_bad_typeid_dtor(CONTEXT86* context) { + bad_typeid *_this = (bad_typeid *)context->Ecx; TRACE("(%p)\n",_this); - MSVCRT_exception_dtor(&_this->base); + context->Ecx = (DWORD)&_this->base; + MSVCRT_exception_dtor(context); }
/****************************************************************** * ??4bad_typeid@@QAEAAV0@ABV0@@Z (MSVCRT.@) */ -bad_typeid * MSVCRT_bad_typeid_opequals(bad_typeid * _this, const bad_typeid * rhs) +bad_typeid * MSVCRT_bad_typeid_opequals(const bad_typeid * rhs, CONTEXT86* context) { + bad_typeid *_this = (bad_typeid *)context->Ecx; TRACE("(%p %p)\n",_this,rhs); - MSVCRT_exception_copy_ctor(&_this->base,&rhs->base); + context->Ecx = (DWORD)&_this->base; + MSVCRT_exception_copy_ctor(&rhs->base, context); return _this; }
/****************************************************************** * ??0__non_rtti_object@@QAE@ABV0@@Z (MSVCRT.@) */ -void MSVCRT___non_rtti_object_copy_ctor(__non_rtti_object * _this, - const __non_rtti_object * rhs) +void MSVCRT___non_rtti_object_copy_ctor(const __non_rtti_object * rhs, CONTEXT86* context) { + __non_rtti_object *_this = (__non_rtti_object *)context->Ecx; TRACE("(%p %p)\n",_this,rhs); - MSVCRT_bad_typeid_copy_ctor(&_this->base,&rhs->base); + context->Ecx = (DWORD)&_this->base; + MSVCRT_bad_typeid_copy_ctor(&rhs->base, context); }
/****************************************************************** * ??0__non_rtti_object@@QAE@PBD@Z (MSVCRT.@) */ -void MSVCRT___non_rtti_object_ctor(__non_rtti_object * _this, - const char * name) +void MSVCRT___non_rtti_object_ctor(const char * name, CONTEXT86* context) { + __non_rtti_object *_this = (__non_rtti_object *)context->Ecx; TRACE("(%p %s)\n",_this,name); - MSVCRT_bad_typeid_ctor(&_this->base,name); + context->Ecx = (DWORD)&_this->base; + MSVCRT_bad_typeid_ctor(name, context); _this->base.base.vtable = __non_rtti_object_vtable; }
/****************************************************************** * ??1__non_rtti_object@@UAE@XZ (MSVCRT.@) */ -void MSVCRT___non_rtti_object_dtor(__non_rtti_object * _this) +void MSVCRT___non_rtti_object_dtor(CONTEXT86* context) { + __non_rtti_object *_this = (__non_rtti_object *)context->Ecx; TRACE("(%p)\n",_this); - MSVCRT_bad_typeid_dtor(&_this->base); + context->Ecx = (DWORD)&_this->base; + MSVCRT_bad_typeid_dtor(context); }
/****************************************************************** * ??4__non_rtti_object@@QAEAAV0@ABV0@@Z (MSVCRT.@) */ -__non_rtti_object * MSVCRT___non_rtti_object_opequals(__non_rtti_object * _this, - const __non_rtti_object *rhs) +__non_rtti_object * MSVCRT___non_rtti_object_opequals(const __non_rtti_object *rhs, CONTEXT86* context) { + __non_rtti_object *_this = (__non_rtti_object *)context->Ecx; TRACE("(%p %p)\n",_this,rhs); memcpy (_this, rhs, sizeof (*_this)); TRACE("name = %s\n",_this->base.base.name); @@ -317,8 +337,9 @@ /****************************************************************** * ??_E__non_rtti_object@@UAEPAXI@Z (MSVCRT.@) */ -void * MSVCRT___non_rtti_object__unknown_E(__non_rtti_object * _this, unsigned int arg1) +void * MSVCRT___non_rtti_object__unknown_E(unsigned int arg1, CONTEXT86* context) { + __non_rtti_object *_this = (__non_rtti_object *)context->Ecx; TRACE("(%p %d)\n",_this,arg1); _purecall(); return NULL; @@ -327,8 +348,9 @@ /****************************************************************** * ??_G__non_rtti_object@@UAEPAXI@Z (MSVCRT.@) */ -void * MSVCRT___non_rtti_object__unknown_G(__non_rtti_object * _this, unsigned int arg1) +void * MSVCRT___non_rtti_object__unknown_G(unsigned int arg1, CONTEXT86* context) { + __non_rtti_object *_this = (__non_rtti_object *)context->Ecx; TRACE("(%p %d)\n",_this,arg1); _purecall(); return NULL; @@ -337,46 +359,55 @@ /****************************************************************** * ??0bad_cast@@QAE@ABQBD@Z (MSVCRT.@) */ -void MSVCRT_bad_cast_ctor(bad_cast * _this, const char ** name) +void MSVCRT_bad_cast_ctor(const char ** name, CONTEXT86* context) { + bad_cast *_this = (bad_cast *)context->Ecx; TRACE("(%p %s)\n",_this,*name); - MSVCRT_exception_ctor(&_this->base, name); + context->Ecx = (DWORD)&_this->base; + MSVCRT_exception_ctor(name, context); _this->base.vtable = bad_cast_vtable; }
/****************************************************************** * ??0bad_cast@@QAE@ABV0@@Z (MSVCRT.@) */ -void MSVCRT_bad_cast_copy_ctor(bad_cast * _this, const bad_cast * rhs) +void MSVCRT_bad_cast_copy_ctor(const bad_cast * rhs, CONTEXT86* context) { + bad_cast *_this = (bad_cast *)context->Ecx; TRACE("(%p %p)\n",_this,rhs); - MSVCRT_exception_copy_ctor(&_this->base,&rhs->base); + context->Ecx = (DWORD)&_this->base; + MSVCRT_exception_copy_ctor(&rhs->base, context); }
/****************************************************************** * ??1bad_cast@@UAE@XZ (MSVCRT.@) */ -void MSVCRT_bad_cast_dtor(bad_cast * _this) +void MSVCRT_bad_cast_dtor(CONTEXT86* context) { + bad_cast *_this = (bad_cast *)context->Ecx; TRACE("(%p)\n",_this); - MSVCRT_exception_dtor(&_this->base); + context->Ecx = (DWORD)&_this->base; + MSVCRT_exception_dtor(context); }
/****************************************************************** * ??4bad_cast@@QAEAAV0@ABV0@@Z (MSVCRT.@) */ -bad_cast * MSVCRT_bad_cast_opequals(bad_cast * _this, const bad_cast * rhs) +bad_cast * MSVCRT_bad_cast_opequals(const bad_cast * rhs, CONTEXT86* context) { + bad_cast *_this = (bad_cast *)context->Ecx; TRACE("(%p %p)\n",_this,rhs); - MSVCRT_exception_copy_ctor(&_this->base,&rhs->base); + context->Ecx = (DWORD)&_this->base; + MSVCRT_exception_copy_ctor(&rhs->base, context); return _this; }
/****************************************************************** * ??8type_info@@QBEHABV0@@Z (MSVCRT.@) */ -int __stdcall MSVCRT_type_info_opequals_equals(type_info * _this, const type_info * rhs) +int __stdcall MSVCRT_type_info_opequals_equals(const type_info * rhs, CONTEXT86* context) { + type_info *_this = (type_info *)context->Ecx; TRACE("(%p %p) returning %d\n",_this,rhs,_this->name == rhs->name); return _this->name == rhs->name; } @@ -384,8 +415,9 @@ /****************************************************************** * ??9type_info@@QBEHABV0@@Z (MSVCRT.@) */ -int __stdcall MSVCRT_type_info_opnot_equals(type_info * _this, const type_info * rhs) +int __stdcall MSVCRT_type_info_opnot_equals(const type_info * rhs, CONTEXT86* context) { + type_info *_this = (type_info *)context->Ecx; TRACE("(%p %p) returning %d\n",_this,rhs,_this->name == rhs->name); return _this->name != rhs->name; } @@ -393,8 +425,9 @@ /****************************************************************** * ??1type_info@@UAE@XZ (MSVCRT.@) */ -void MSVCRT_type_info_dtor(type_info * _this) +void MSVCRT_type_info_dtor(CONTEXT86* context) { + type_info *_this = (type_info *)context->Ecx; TRACE("(%p)\n",_this); if (_this->data) MSVCRT_free(_this->data); @@ -403,8 +436,9 @@ /****************************************************************** * ?name@type_info@@QBEPBDXZ (MSVCRT.@) */ -const char * __stdcall MSVCRT_type_info_name(type_info * _this) +const char * __stdcall MSVCRT_type_info_name(CONTEXT86* context) { + type_info *_this = (type_info *)context->Ecx; TRACE("(%p) returning %s\n",_this,_this->name); return _this->name; } @@ -412,8 +446,9 @@ /****************************************************************** * ?raw_name@type_info@@QBEPBDXZ (MSVCRT.@) */ -const char * __stdcall MSVCRT_type_info_raw_name(type_info * _this) +const char * __stdcall MSVCRT_type_info_raw_name(CONTEXT86* context) { + type_info *_this = (type_info *)context->Ecx; TRACE("(%p) returning %s\n",_this,_this->name); return _this->name; } Index: dlls/msvcrt/msvcrt.spec =================================================================== RCS file: /home/wine/wine/dlls/msvcrt/msvcrt.spec,v retrieving revision 1.72 diff -u -r1.72 msvcrt.spec --- dlls/msvcrt/msvcrt.spec 12 May 2003 03:31:16 -0000 1.72 +++ dlls/msvcrt/msvcrt.spec 24 May 2003 19:40:49 -0000 @@ -1,56 +1,56 @@ # msvcrt.dll - MS VC++ Run Time Library
@ cdecl $I10_OUTPUT() MSVCRT_I10_OUTPUT -@ cdecl ??0__non_rtti_object@@QAE@ABV0@@Z(ptr ptr) MSVCRT___non_rtti_object_copy_ctor -@ cdecl ??0__non_rtti_object@@QAE@PBD@Z(ptr ptr) MSVCRT___non_rtti_object_ctor -@ cdecl ??0bad_cast@@QAE@ABQBD@Z(ptr ptr) MSVCRT_bad_cast_ctor -@ cdecl ??0bad_cast@@QAE@ABV0@@Z(ptr ptr) MSVCRT_bad_cast_copy_ctor -@ cdecl ??0bad_typeid@@QAE@ABV0@@Z(ptr ptr) MSVCRT_bad_typeid_copy_ctor -@ cdecl ??0bad_typeid@@QAE@PBD@Z(ptr ptr) MSVCRT_bad_typeid_ctor -@ cdecl ??0exception@@QAE@ABQBD@Z(ptr ptr) MSVCRT_exception_ctor -@ cdecl ??0exception@@QAE@ABV0@@Z(ptr ptr) MSVCRT_exception_copy_ctor -@ cdecl ??0exception@@QAE@XZ(ptr) MSVCRT_exception_default_ctor -@ cdecl ??1__non_rtti_object@@UAE@XZ(ptr) MSVCRT___non_rtti_object_dtor -@ cdecl ??1bad_cast@@UAE@XZ(ptr) MSVCRT_bad_cast_dtor -@ cdecl ??1bad_typeid@@UAE@XZ(ptr) MSVCRT_bad_typeid_dtor -@ cdecl ??1exception@@UAE@XZ(ptr) MSVCRT_exception_dtor -@ cdecl ??1type_info@@UAE@XZ(ptr) MSVCRT_type_info_dtor +@ cdecl -register ??0__non_rtti_object@@QAE@ABV0@@Z(ptr) MSVCRT___non_rtti_object_copy_ctor +@ cdecl -register ??0__non_rtti_object@@QAE@PBD@Z(ptr) MSVCRT___non_rtti_object_ctor +@ cdecl -register ??0bad_cast@@QAE@ABQBD@Z(ptr) MSVCRT_bad_cast_ctor +@ cdecl -register ??0bad_cast@@QAE@ABV0@@Z(ptr) MSVCRT_bad_cast_copy_ctor +@ cdecl -register ??0bad_typeid@@QAE@ABV0@@Z(ptr) MSVCRT_bad_typeid_copy_ctor +@ cdecl -register ??0bad_typeid@@QAE@PBD@Z(ptr) MSVCRT_bad_typeid_ctor +@ cdecl -register ??0exception@@QAE@ABQBD@Z(ptr) MSVCRT_exception_ctor +@ cdecl -register ??0exception@@QAE@ABV0@@Z(ptr) MSVCRT_exception_copy_ctor +@ cdecl -register ??0exception@@QAE@XZ() MSVCRT_exception_default_ctor +@ cdecl -register ??1__non_rtti_object@@UAE@XZ() MSVCRT___non_rtti_object_dtor +@ cdecl -register ??1bad_cast@@UAE@XZ() MSVCRT_bad_cast_dtor +@ cdecl -register ??1bad_typeid@@UAE@XZ() MSVCRT_bad_typeid_dtor +@ cdecl -register ??1exception@@UAE@XZ() MSVCRT_exception_dtor +@ cdecl -register ??1type_info@@UAE@XZ() MSVCRT_type_info_dtor @ cdecl ??2@YAPAXI@Z(long) MSVCRT_operator_new @ cdecl ??_U@YAPAXI@Z(long) MSVCRT_operator_new @ cdecl ??3@YAXPAX@Z(ptr) MSVCRT_operator_delete @ cdecl ??_V@YAXPAX@Z(ptr) MSVCRT_operator_delete -@ cdecl ??4__non_rtti_object@@QAEAAV0@ABV0@@Z(ptr ptr) MSVCRT___non_rtti_object_opequals -@ cdecl ??4bad_cast@@QAEAAV0@ABV0@@Z(ptr ptr) MSVCRT_bad_cast_opequals -@ cdecl ??4bad_typeid@@QAEAAV0@ABV0@@Z(ptr ptr)MSVCRT_bad_typeid_opequals -@ cdecl ??4exception@@QAEAAV0@ABV0@@Z(ptr ptr) MSVCRT_exception_opequals -@ stdcall ??8type_info@@QBEHABV0@@Z(ptr ptr) MSVCRT_type_info_opequals_equals -@ stdcall ??9type_info@@QBEHABV0@@Z(ptr ptr) MSVCRT_type_info_opnot_equals +@ cdecl -register ??4__non_rtti_object@@QAEAAV0@ABV0@@Z(ptr) MSVCRT___non_rtti_object_opequals +@ cdecl -register ??4bad_cast@@QAEAAV0@ABV0@@Z(ptr) MSVCRT_bad_cast_opequals +@ cdecl -register ??4bad_typeid@@QAEAAV0@ABV0@@Z(ptr)MSVCRT_bad_typeid_opequals +@ cdecl -register ??4exception@@QAEAAV0@ABV0@@Z(ptr) MSVCRT_exception_opequals +@ stdcall -register ??8type_info@@QBEHABV0@@Z(ptr) MSVCRT_type_info_opequals_equals +@ stdcall -register ??9type_info@@QBEHABV0@@Z(ptr) MSVCRT_type_info_opnot_equals @ stub ??_7__non_rtti_object@@6B@ @ stub ??_7bad_cast@@6B@ @ stub ??_7bad_typeid@@6B@ @ stub ??_7exception@@6B@ -@ cdecl ??_E__non_rtti_object@@UAEPAXI@Z(ptr long) MSVCRT___non_rtti_object__unknown_E +@ cdecl -register ??_E__non_rtti_object@@UAEPAXI@Z(long) MSVCRT___non_rtti_object__unknown_E @ stub ??_Ebad_cast@@UAEPAXI@Z #(ptr long) @ stub ??_Ebad_typeid@@UAEPAXI@Z #(ptr long) -@ cdecl ??_Eexception@@UAEPAXI@Z(ptr long) MSVCRT_exception__unknown_E -@ cdecl ??_G__non_rtti_object@@UAEPAXI@Z(ptr long) MSVCRT___non_rtti_object__unknown_G +@ cdecl -register ??_Eexception@@UAEPAXI@Z(long) MSVCRT_exception__unknown_E +@ cdecl -register ??_G__non_rtti_object@@UAEPAXI@Z(long) MSVCRT___non_rtti_object__unknown_G @ stub ??_Gbad_cast@@UAEPAXI@Z #(ptr long) @ stub ??_Gbad_typeid@@UAEPAXI@Z #(ptr long) -@ cdecl ??_Gexception@@UAEPAXI@Z(ptr long) MSVCRT_exception__unknown_G +@ cdecl -register ??_Gexception@@UAEPAXI@Z(long) MSVCRT_exception__unknown_G @ cdecl ?_query_new_handler@@YAP6AHI@ZXZ() MSVCRT__query_new_handler @ cdecl ?_query_new_mode@@YAHXZ() MSVCRT__query_new_mode @ cdecl ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z(ptr) MSVCRT__set_new_handler @ cdecl ?_set_new_mode@@YAHH@Z(long) MSVCRT__set_new_mode @ cdecl ?_set_se_translator@@YAP6AXIPAU_EXCEPTION_POINTERS@@@ZP6AXI0@Z@Z(ptr) MSVCRT__set_se_translator @ stub ?before@type_info@@QBEHABV1@@Z #(ptr ptr) stdcall -@ stdcall ?name@type_info@@QBEPBDXZ(ptr) MSVCRT_type_info_name -@ stdcall ?raw_name@type_info@@QBEPBDXZ(ptr) MSVCRT_type_info_raw_name +@ stdcall -register ?name@type_info@@QBEPBDXZ() MSVCRT_type_info_name +@ stdcall -register ?raw_name@type_info@@QBEPBDXZ() MSVCRT_type_info_raw_name @ cdecl ?set_new_handler@@YAP6AXXZP6AXXZ@Z(ptr) MSVCRT__set_new_handler @ cdecl ?set_terminate@@YAP6AXXZP6AXXZ@Z(ptr) MSVCRT_set_terminate @ cdecl ?set_unexpected@@YAP6AXXZP6AXXZ@Z(ptr) MSVCRT_set_unexpected @ cdecl ?terminate@@YAXXZ() MSVCRT_terminate @ cdecl ?unexpected@@YAXXZ() MSVCRT_unexpected -@ cdecl ?what@exception@@UBEPBDXZ(ptr) MSVCRT_what_exception +@ cdecl -register ?what@exception@@UBEPBDXZ() MSVCRT_what_exception @ cdecl _CIacos() @ cdecl _CIasin() @ cdecl _CIatan() Index: dlls/msvcrtd/msvcrtd.spec =================================================================== RCS file: /home/wine/wine/dlls/msvcrtd/msvcrtd.spec,v retrieving revision 1.2 diff -u -r1.2 msvcrtd.spec --- dlls/msvcrtd/msvcrtd.spec 7 Apr 2003 23:30:20 -0000 1.2 +++ dlls/msvcrtd/msvcrtd.spec 24 May 2003 19:40:49 -0000 @@ -1,55 +1,55 @@ # msvcrtd.dll - MS VC++ Run Time Library
@ cdecl $I10_OUTPUT() msvcrt.$I10_OUTPUT -@ cdecl ??0__non_rtti_object@@QAE@ABV0@@Z(ptr ptr) msvcrt.??0__non_rtti_object@@QAE@ABV0@@Z -@ cdecl ??0__non_rtti_object@@QAE@PBD@Z(ptr ptr) msvcrt.??0__non_rtti_object@@QAE@PBD@Z -@ cdecl ??0bad_cast@@QAE@ABQBD@Z(ptr ptr) msvcrt.??0bad_cast@@QAE@ABQBD@Z -@ cdecl ??0bad_cast@@QAE@ABV0@@Z(ptr ptr) msvcrt.??0bad_cast@@QAE@ABV0@@Z -@ cdecl ??0bad_typeid@@QAE@ABV0@@Z(ptr ptr) msvcrt.??0bad_typeid@@QAE@ABV0@@Z -@ cdecl ??0bad_typeid@@QAE@PBD@Z(ptr ptr) msvcrt.??0bad_typeid@@QAE@PBD@Z -@ cdecl ??0exception@@QAE@ABQBD@Z(ptr ptr) msvcrt.??0exception@@QAE@ABQBD@Z -@ cdecl ??0exception@@QAE@ABV0@@Z(ptr ptr) msvcrt.??0exception@@QAE@ABV0@@Z -@ cdecl ??0exception@@QAE@XZ(ptr) msvcrt.??0exception@@QAE@XZ -@ cdecl ??1__non_rtti_object@@UAE@XZ(ptr) msvcrt.??1__non_rtti_object@@UAE@XZ -@ cdecl ??1bad_cast@@UAE@XZ(ptr) msvcrt.??1bad_cast@@UAE@XZ -@ cdecl ??1bad_typeid@@UAE@XZ(ptr) msvcrt.??1bad_typeid@@UAE@XZ -@ cdecl ??1exception@@UAE@XZ(ptr) msvcrt.??1exception@@UAE@XZ -@ cdecl ??1type_info@@UAE@XZ(ptr) msvcrt.??1type_info@@UAE@XZ +@ cdecl -register ??0__non_rtti_object@@QAE@ABV0@@Z(ptr ptr) msvcrt.??0__non_rtti_object@@QAE@ABV0@@Z +@ cdecl -register ??0__non_rtti_object@@QAE@PBD@Z(ptr ptr) msvcrt.??0__non_rtti_object@@QAE@PBD@Z +@ cdecl -register ??0bad_cast@@QAE@ABQBD@Z(ptr ptr) msvcrt.??0bad_cast@@QAE@ABQBD@Z +@ cdecl -register ??0bad_cast@@QAE@ABV0@@Z(ptr ptr) msvcrt.??0bad_cast@@QAE@ABV0@@Z +@ cdecl -register ??0bad_typeid@@QAE@ABV0@@Z(ptr ptr) msvcrt.??0bad_typeid@@QAE@ABV0@@Z +@ cdecl -register ??0bad_typeid@@QAE@PBD@Z(ptr ptr) msvcrt.??0bad_typeid@@QAE@PBD@Z +@ cdecl -register ??0exception@@QAE@ABQBD@Z(ptr ptr) msvcrt.??0exception@@QAE@ABQBD@Z +@ cdecl -register ??0exception@@QAE@ABV0@@Z(ptr ptr) msvcrt.??0exception@@QAE@ABV0@@Z +@ cdecl -register ??0exception@@QAE@XZ(ptr) msvcrt.??0exception@@QAE@XZ +@ cdecl -register ??1__non_rtti_object@@UAE@XZ(ptr) msvcrt.??1__non_rtti_object@@UAE@XZ +@ cdecl -register ??1bad_cast@@UAE@XZ(ptr) msvcrt.??1bad_cast@@UAE@XZ +@ cdecl -register ??1bad_typeid@@UAE@XZ(ptr) msvcrt.??1bad_typeid@@UAE@XZ +@ cdecl -register ??1exception@@UAE@XZ(ptr) msvcrt.??1exception@@UAE@XZ +@ cdecl -register ??1type_info@@UAE@XZ(ptr) msvcrt.??1type_info@@UAE@XZ @ cdecl ??2@YAPAXI@Z(long) msvcrt.??2@YAPAXI@Z @ cdecl ??2@YAPAXIHPBDH@Z(long) msvcrt.??2@YAPAXIHPBDH@Z @ cdecl ??3@YAXPAX@Z(ptr) msvcrt.??3@YAXPAX@Z -@ cdecl ??4__non_rtti_object@@QAEAAV0@ABV0@@Z(ptr ptr) msvcrt.??4__non_rtti_object@@QAEAAV0@ABV0@@Z -@ cdecl ??4bad_cast@@QAEAAV0@ABV0@@Z(ptr ptr) msvcrt.??4bad_cast@@QAEAAV0@ABV0@@Z -@ cdecl ??4bad_typeid@@QAEAAV0@ABV0@@Z(ptr ptr) msvcrt.??4bad_typeid@@QAEAAV0@ABV0@@Z -@ cdecl ??4exception@@QAEAAV0@ABV0@@Z(ptr ptr) msvcrt.??4exception@@QAEAAV0@ABV0@@Z -@ stdcall ??8type_info@@QBEHABV0@@Z(ptr ptr) msvcrt.??8type_info@@QBEHABV0@@Z -@ stdcall ??9type_info@@QBEHABV0@@Z(ptr ptr) msvcrt.??9type_info@@QBEHABV0@@Z +@ cdecl -register ??4__non_rtti_object@@QAEAAV0@ABV0@@Z(ptr ptr) msvcrt.??4__non_rtti_object@@QAEAAV0@ABV0@@Z +@ cdecl -register ??4bad_cast@@QAEAAV0@ABV0@@Z(ptr ptr) msvcrt.??4bad_cast@@QAEAAV0@ABV0@@Z +@ cdecl -register ??4bad_typeid@@QAEAAV0@ABV0@@Z(ptr ptr) msvcrt.??4bad_typeid@@QAEAAV0@ABV0@@Z +@ cdecl -register ??4exception@@QAEAAV0@ABV0@@Z(ptr ptr) msvcrt.??4exception@@QAEAAV0@ABV0@@Z +@ stdcall -register ??8type_info@@QBEHABV0@@Z(ptr ptr) msvcrt.??8type_info@@QBEHABV0@@Z +@ stdcall -register ??9type_info@@QBEHABV0@@Z(ptr ptr) msvcrt.??9type_info@@QBEHABV0@@Z @ stub ??_7__non_rtti_object@@6B@ @ stub ??_7bad_cast@@6B@ @ stub ??_7bad_typeid@@6B@ @ stub ??_7exception@@6B@ -@ cdecl ??_E__non_rtti_object@@UAEPAXI@Z(ptr long) msvcrt.??_E__non_rtti_object@@UAEPAXI@Z +@ cdecl -register ??_E__non_rtti_object@@UAEPAXI@Z(ptr long) msvcrt.??_E__non_rtti_object@@UAEPAXI@Z @ stub ??_Ebad_cast@@UAEPAXI@Z #(ptr long) @ stub ??_Ebad_typeid@@UAEPAXI@Z #(ptr long) -@ cdecl ??_Eexception@@UAEPAXI@Z(ptr long) msvcrt.??_Eexception@@UAEPAXI@Z -@ cdecl ??_G__non_rtti_object@@UAEPAXI@Z(ptr long) msvcrt.??_G__non_rtti_object@@UAEPAXI@Z +@ cdecl -register ??_Eexception@@UAEPAXI@Z(ptr long) msvcrt.??_Eexception@@UAEPAXI@Z +@ cdecl -register ??_G__non_rtti_object@@UAEPAXI@Z(ptr long) msvcrt.??_G__non_rtti_object@@UAEPAXI@Z @ stub ??_Gbad_cast@@UAEPAXI@Z #(ptr long) @ stub ??_Gbad_typeid@@UAEPAXI@Z #(ptr long) -@ cdecl ??_Gexception@@UAEPAXI@Z(ptr long) msvcrt.??_Gexception@@UAEPAXI@Z +@ cdecl -register ??_Gexception@@UAEPAXI@Z(ptr long) msvcrt.??_Gexception@@UAEPAXI@Z @ cdecl ?_query_new_handler@@YAP6AHI@ZXZ() msvcrt.?_query_new_handler@@YAP6AHI@ZXZ @ cdecl ?_query_new_mode@@YAHXZ() msvcrt.?_query_new_mode@@YAHXZ @ cdecl ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z(ptr) msvcrt.?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z @ cdecl ?_set_new_mode@@YAHH@Z(long) msvcrt.?_set_new_mode@@YAHH@Z @ cdecl ?_set_se_translator@@YAP6AXIPAU_EXCEPTION_POINTERS@@@ZP6AXI0@Z@Z(ptr) msvcrt.?_set_se_translator@@YAP6AXIPAU_EXCEPTION_POINTERS@@@ZP6AXI0@Z@Z @ stub ?before@type_info@@QBEHABV1@@Z #(ptr ptr) stdcall -@ stdcall ?name@type_info@@QBEPBDXZ(ptr) msvcrt.?name@type_info@@QBEPBDXZ -@ stdcall ?raw_name@type_info@@QBEPBDXZ(ptr) msvcrt.?raw_name@type_info@@QBEPBDXZ +@ stdcall -register ?name@type_info@@QBEPBDXZ(ptr) msvcrt.?name@type_info@@QBEPBDXZ +@ stdcall -register ?raw_name@type_info@@QBEPBDXZ(ptr) msvcrt.?raw_name@type_info@@QBEPBDXZ @ cdecl ?set_new_handler@@YAP6AXXZP6AXXZ@Z(ptr) msvcrt.?set_new_handler@@YAP6AXXZP6AXXZ@Z @ cdecl ?set_terminate@@YAP6AXXZP6AXXZ@Z(ptr) msvcrt.?set_terminate@@YAP6AXXZP6AXXZ@Z @ cdecl ?set_unexpected@@YAP6AXXZP6AXXZ@Z(ptr) msvcrt.?set_unexpected@@YAP6AXXZP6AXXZ@Z @ cdecl ?terminate@@YAXXZ() msvcrt.?terminate@@YAXXZ @ cdecl ?unexpected@@YAXXZ() msvcrt.?unexpected@@YAXXZ -@ cdecl ?what@exception@@UBEPBDXZ(ptr) msvcrt.?what@exception@@UBEPBDXZ +@ cdecl -register ?what@exception@@UBEPBDXZ(ptr) msvcrt.?what@exception@@UBEPBDXZ @ cdecl _CIacos() msvcrt._CIacos @ cdecl _CIasin() msvcrt._CIasin @ cdecl _CIatan() msvcrt._CIatan
This will not compile, because I have ALSO changed MSVCRT_bad_typeid_copy_ctor as it too suffers from the _thiscall issue. (Even if I switch the parms around to account for moving the this to the last parm).
the simplest (and cleanest) way, may be to let the current functions untouched, but change the name in the .spec from. for example cdecl -register ??0bad_typeid@@QAE@ABV0@@Z(ptr) __reg_MSVCRT_bad_typeid_copy_ctor
and in C file, leave MSVCRT_bad_typeid_copy_ctor as it is and implement the __reg functions as:
void __reg_MSVCRT_bad_typeid_copy_ctor(const bad_typeid * rhs, CONTEXT86* context) { MSVCRT_bad_typeid_copy_ctor((bad_typeid *)context->Ecx, rhs); }
that should work... don't forget also that register functions return their result in context->Eax... A+
OK, i'll take a look at adding __reg stubs if this is the preferred method.
don't forget also that register functions return their result in context->Eax...
so should for example: exception * MSVCRT_exception_opequals(const exception * rhs, CONTEXT86* context) { : return _this; }
Be void MSVCRT_exception_opequals(const exception * rhs, CONTEXT86* context) { : context->Eax = (DWORD)_this; } ?
I assume the caller will look in the context structure passed in for the return val? Jason
"Ann&Jason" == Ann and Jason Edmeades us@the-edmeades.demon.co.uk writes:
Ann&Jason> OK, i'll take a look at adding __reg stubs if this is the Ann&Jason> preferred method.
>> don't forget also that register functions return their result in context-> Eax...
Ann&Jason> so should for example: exception * Ann&Jason> MSVCRT_exception_opequals(const exception * rhs, CONTEXT86* Ann&Jason> context) { : return _this; }
Ann&Jason> Be void MSVCRT_exception_opequals(const exception * rhs, Ann&Jason> CONTEXT86* context) { : context-> Eax = (DWORD)_this; Ann&Jason> } ?
Ann&Jason> I assume the caller will look in the context structure passed Ann&Jason> in for the return val?
On return the context structure is unpacked and the context-> Eax value is put in EAX. EAX is where the program expects it's rerurn value.
Bye