Author: [EMAIL PROTECTED]
Date: Fri Oct 24 06:08:31 2008
New Revision: 592
Added:
changes/[EMAIL PROTECTED]/xxx/
changes/[EMAIL PROTECTED]/xxx/bleeding_edge/
- copied from r591, /branches/bleeding_edge/
Modified:
changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/execution.cc
changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/top.cc
changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/top.h
Log:
Revorked version of http://codereview.chromium.org/8101. The only change is
that the exception stored in the TryCatch is not cleared as that was the
cause of the regression.
So the actual difference to http://codereview.chromium.org/8101 is:
Index: src/top.h
===================================================================
--- src/top.h (revision 576)
+++ src/top.h (working copy)
@@ -154,10 +154,6 @@
if (has_pending_exception()) {
thread_local_.external_caught_exception_ =
thread_local_.pending_external_caught_exception_;
- } else {
- if (thread_local_.try_catch_handler_ != NULL) {
- thread_local_.try_catch_handler_->Reset();
- }
}
thread_local_.pending_external_caught_exception_ = false;
}
@@ -312,14 +308,14 @@
};
Modified: changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/execution.cc
==============================================================================
--- /branches/bleeding_edge/src/execution.cc (original)
+++ changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/execution.cc Fri Oct
24 06:08:31 2008
@@ -91,12 +91,10 @@
value->Verify();
#endif
- // Update the pending exception flag and return the value.
+ // Update the pending exception and external caught flag and return the
value.
*has_pending_exception = value->IsException();
ASSERT(*has_pending_exception == Top::has_pending_exception());
- if (*has_pending_exception) {
- Top::setup_external_caught();
- }
+ Top::propagate_external_caught();
// If the pending exception is OutOfMemoryException set out_of_memory in
// the global context. Note: We have to mark the global context here
Modified: changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/top.cc
==============================================================================
--- /branches/bleeding_edge/src/top.cc (original)
+++ changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/top.cc Fri Oct 24
06:08:31 2008
@@ -101,7 +101,7 @@
clear_pending_exception();
clear_scheduled_exception();
thread_local_.save_context_ = NULL;
- thread_local_.catcher_ = NULL;
+ thread_local_.pending_external_caught_exception_ = false;
}
@@ -607,7 +607,7 @@
Failure* Top::ReThrow(Object* exception, MessageLocation* location) {
- // Set the exception beeing re-thrown.
+ // Set the exception being re-thrown.
set_pending_exception(exception);
return Failure::Exception();
}
@@ -789,9 +789,8 @@
// If the exception is caught externally, we store it in the
// try/catch handler. The C code can find it later and process it if
// necessary.
- thread_local_.catcher_ = NULL;
+ thread_local_.pending_external_caught_exception_ = is_caught_externally;
if (is_caught_externally) {
- thread_local_.catcher_ = thread_local_.try_catch_handler_;
thread_local_.try_catch_handler_->exception_ =
reinterpret_cast<void*>(*exception_handle);
if (!message_obj.is_null()) {
Modified: changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/top.h
==============================================================================
--- /branches/bleeding_edge/src/top.h (original)
+++ changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/top.h Fri Oct 24
06:08:31 2008
@@ -53,7 +53,9 @@
bool external_caught_exception_;
v8::TryCatch* try_catch_handler_;
SaveContext* save_context_;
- v8::TryCatch* catcher_;
+ // Flag indicating that the try_catch_handler_ contains an exception to
be
+ // caught.
+ bool pending_external_caught_exception_;
// Stack.
Address c_entry_fp_; // the frame pointer of the top c entry frame
@@ -144,10 +146,16 @@
thread_local_.scheduled_exception_ = Heap::the_hole_value();
}
- static void setup_external_caught() {
- thread_local_.external_caught_exception_ =
- (thread_local_.catcher_ != NULL) &&
- (Top::thread_local_.try_catch_handler_ ==
Top::thread_local_.catcher_);
+ // Propagate the external caught exception flag. If there is no external
+ // caught exception always clear the TryCatch handler as it might contain
+ // an exception object from a throw which was bypassed by a finally block
+ // doing an explicit return/break/continue.
+ static void propagate_external_caught() {
+ if (has_pending_exception()) {
+ thread_local_.external_caught_exception_ =
+ thread_local_.pending_external_caught_exception_;
+ }
+ thread_local_.pending_external_caught_exception_ = false;
}
// Tells whether the current context has experienced an out of memory
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---