ReactOS  0.4.15-dev-3303-g1ade494
except_arm.c
Go to the documentation of this file.
1 /*
2  * msvcrt C++ exception handling
3  *
4  * Copyright 2011 Alexandre Julliard
5  * Copyright 2013 AndrĂ© Hentschel
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21 
22 #include "config.h"
23 #include "wine/port.h"
24 
25 #ifdef __arm__
26 
27 #include <stdarg.h>
28 
29 #include "ntstatus.h"
30 #define WIN32_NO_STATUS
31 #include "windef.h"
32 #include "winbase.h"
33 #include "winternl.h"
34 #include "msvcrt.h"
35 #include "wine/exception.h"
36 #include "excpt.h"
37 #include "wine/debug.h"
38 
39 #include "cppexcept.h"
40 
42 
43 
44 /*********************************************************************
45  * __CxxExceptionFilter (MSVCRT.@)
46  */
47 int CDECL __CxxExceptionFilter( PEXCEPTION_POINTERS ptrs,
48  const type_info *ti, int flags, void **copy )
49 {
50  FIXME( "%p %p %x %p: not implemented\n", ptrs, ti, flags, copy );
52 }
53 
54 /*********************************************************************
55  * __CxxFrameHandler (MSVCRT.@)
56  */
57 EXCEPTION_DISPOSITION CDECL __CxxFrameHandler(EXCEPTION_RECORD *rec, DWORD frame, CONTEXT *context,
59 {
60  FIXME("%p %x %p %p: not implemented\n", rec, frame, context, dispatch);
62 }
63 
64 
65 /*********************************************************************
66  * __CppXcptFilter (MSVCRT.@)
67  */
69 {
70  /* only filter c++ exceptions */
72  return _XcptFilter(ex, ptr);
73 }
74 
75 
76 /*********************************************************************
77  * __CxxDetectRethrow (MSVCRT.@)
78  */
79 BOOL CDECL __CxxDetectRethrow(PEXCEPTION_POINTERS ptrs)
80 {
82 
83  if (!ptrs)
84  return FALSE;
85 
86  rec = ptrs->ExceptionRecord;
87 
88  if (rec->ExceptionCode == CXX_EXCEPTION &&
89  rec->NumberParameters == 3 &&
91  rec->ExceptionInformation[2])
92  {
93  ptrs->ExceptionRecord = msvcrt_get_thread_data()->exc_record;
94  return TRUE;
95  }
96  return (msvcrt_get_thread_data()->exc_record == rec);
97 }
98 
99 
100 /*********************************************************************
101  * __CxxQueryExceptionSize (MSVCRT.@)
102  */
103 unsigned int CDECL __CxxQueryExceptionSize(void)
104 {
105  return sizeof(cxx_exception_type);
106 }
107 
108 
109 /*******************************************************************
110  * _setjmp (MSVCRT.@)
111  */
112 __ASM_GLOBAL_FUNC(MSVCRT__setjmp,
113  "mov r1, #0\n\t" /* frame */
114  "b " __ASM_NAME("__wine_setjmpex"));
115 
116 /*******************************************************************
117  * longjmp (MSVCRT.@)
118  */
119 void __cdecl MSVCRT_longjmp(struct MSVCRT___JUMP_BUFFER *jmp, int retval)
120 {
121  EXCEPTION_RECORD rec;
122 
123  if (!retval) retval = 1;
124  if (jmp->Frame)
125  {
127  rec.ExceptionFlags = 0;
128  rec.ExceptionRecord = NULL;
129  rec.ExceptionAddress = NULL;
130  rec.NumberParameters = 1;
131  rec.ExceptionInformation[0] = (DWORD_PTR)jmp;
132  RtlUnwind((void *)jmp->Frame, (void *)jmp->Pc, &rec, IntToPtr(retval));
133  }
134  __wine_longjmp( (__wine_jmp_buf *)jmp, retval );
135 }
136 
137 /*********************************************************************
138  * _fpieee_flt (MSVCRT.@)
139  */
140 int __cdecl _fpieee_flt(ULONG exception_code, EXCEPTION_POINTERS *ep,
141  int (__cdecl *handler)(_FPIEEE_RECORD*))
142 {
143  FIXME("(%x %p %p)\n", exception_code, ep, handler);
145 }
146 
147 #endif /* __arm__ */
_CRTIMP int __cdecl _fpieee_flt(unsigned long _ExceptionCode, struct _EXCEPTION_POINTERS *_PtExceptionPtr, int(__cdecl *_Handler)(_FPIEEE_RECORD *))
Definition: comerr.c:44
#define DWORD_PTR
Definition: treelist.c:76
#define __cdecl
Definition: accygwin.h:79
#define CXX_FRAME_MAGIC_VC6
Definition: cppexcept.h:24
Definition: http.c:7251
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
NTSYSAPI VOID NTAPI RtlUnwind(_In_opt_ PVOID TargetFrame, _In_opt_ PVOID TargetIp, _In_opt_ PEXCEPTION_RECORD ExceptionRecord, _In_ PVOID ReturnValue)
Definition: except.c:47
PVOID ExceptionAddress
Definition: compat.h:211
#define __ASM_GLOBAL_FUNC(name, code)
Definition: port.h:201
DWORD ExceptionCode
Definition: compat.h:208
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define __ASM_NAME(name)
Definition: config.h:934
#define FIXME(fmt,...)
Definition: debug.h:111
static PVOID ptr
Definition: dispmode.c:27
#define STATUS_LONGJUMP
Definition: ntstatus.h:217
int CDECL __CppXcptFilter(NTSTATUS, PEXCEPTION_POINTERS)
#define IntToPtr(i)
Definition: basetsd.h:89
#define CXX_EXCEPTION
Definition: cppexcept.h:27
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]
Definition: compat.h:213
unsigned long DWORD
Definition: ntddk_ex.h:95
GLbitfield flags
Definition: glext.h:7161
thread_data_t * msvcrt_get_thread_data(void)
Definition: tls.c:31
void dispatch(HANDLE hStopEvent)
Definition: dispatch.c:70
struct __cxx_exception_type cxx_exception_type
struct _EXCEPTION_RECORD * ExceptionRecord
Definition: compat.h:210
#define EXCEPTION_CONTINUE_SEARCH
Definition: excpt.h:86
#define CDECL
Definition: compat.h:29
INT copy(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], INT append, DWORD lpdwFlags, BOOL bTouch)
Definition: copy.c:51
#define NULL
Definition: types.h:112
unsigned int ULONG
Definition: retypes.h:1
enum _EXCEPTION_DISPOSITION EXCEPTION_DISPOSITION
DWORD ExceptionFlags
Definition: compat.h:209
PEXCEPTION_RECORD ExceptionRecord
Definition: rtltypes.h:200
UINT(* handler)(MSIPACKAGE *)
Definition: action.c:7786
DWORD NumberParameters
Definition: compat.h:212
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
int CDECL _XcptFilter(NTSTATUS, PEXCEPTION_POINTERS)
Definition: except.c:274