Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
35d728ef
Commit
35d728ef
authored
Mar 13, 2007
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
msvcrt: Improved _local_unwind2 implementation.
Thanks to Dmitry Timoshkov for a test case.
parent
4d1d01f2
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
11 additions
and
13 deletions
+11
-13
except.c
dlls/msvcrt/except.c
+11
-13
No files found.
dlls/msvcrt/except.c
View file @
35d728ef
...
...
@@ -88,7 +88,7 @@ static DWORD MSVCRT_nested_handler(PEXCEPTION_RECORD rec,
PCONTEXT
context
,
EXCEPTION_REGISTRATION_RECORD
**
dispatch
)
{
if
(
rec
->
ExceptionFlags
&
0x6
)
if
(
!
(
rec
->
ExceptionFlags
&
(
EH_UNWINDING
|
EH_EXIT_UNWIND
))
)
return
ExceptionContinueSearch
;
*
dispatch
=
frame
;
return
ExceptionCollidedUnwind
;
...
...
@@ -126,28 +126,26 @@ void CDECL _global_unwind2(EXCEPTION_REGISTRATION_RECORD* frame)
*/
void
CDECL
_local_unwind2
(
MSVCRT_EXCEPTION_FRAME
*
frame
,
int
trylevel
)
{
MSVCRT_EXCEPTION_FRAME
*
curframe
=
frame
;
EXCEPTION_REGISTRATION_RECORD
reg
;
TRACE
(
"(%p,%d,%d)
\n
"
,
frame
,
frame
->
trylevel
,
trylevel
);
/* Register a handler in case of a nested exception */
reg
.
Handler
=
(
PEXCEPTION_HANDLER
)
MSVCRT_nested_handler
;
reg
.
Handler
=
MSVCRT_nested_handler
;
reg
.
Prev
=
NtCurrentTeb
()
->
Tib
.
ExceptionList
;
__wine_push_frame
(
&
reg
);
while
(
frame
->
trylevel
!=
TRYLEVEL_END
&&
frame
->
trylevel
!=
trylevel
)
{
int
curtrylevel
=
frame
->
scopetable
[
frame
->
trylevel
].
previousTryLevel
;
curframe
=
frame
;
curframe
->
trylevel
=
curtrylevel
;
if
(
!
frame
->
scopetable
[
curtrylevel
].
lpfnFilter
)
{
ERR
(
"__try block cleanup not implemented - expect crash!
\n
"
);
/* FIXME: Remove current frame, set ebp, call
* frame->scopetable[curtrylevel].lpfnHandler()
*/
}
int
level
=
frame
->
trylevel
;
frame
->
trylevel
=
frame
->
scopetable
[
level
].
previousTryLevel
;
if
(
!
frame
->
scopetable
[
level
].
lpfnFilter
)
{
FIXME
(
"__try block cleanup level %d handler %p not fully implemented
\n
"
,
level
,
frame
->
scopetable
[
level
].
lpfnHandler
);
/* FIXME: should probably set ebp to frame->_ebp */
frame
->
scopetable
[
level
].
lpfnHandler
();
}
}
__wine_pop_frame
(
&
reg
);
TRACE
(
"unwound OK
\n
"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment