Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdlib.h> | 5 #include <stdlib.h> |
| 6 | 6 |
| 7 #include <fstream> // NOLINT(readability/streams) | 7 #include <fstream> // NOLINT(readability/streams) |
| 8 #include <sstream> | 8 #include <sstream> |
| 9 | 9 |
| 10 #include "src/v8.h" | 10 #include "src/v8.h" |
| (...skipping 972 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 983 if (bootstrapper()->IsActive()) { | 983 if (bootstrapper()->IsActive()) { |
| 984 // It's not safe to try to make message objects or collect stack traces | 984 // It's not safe to try to make message objects or collect stack traces |
| 985 // while the bootstrapper is active since the infrastructure may not have | 985 // while the bootstrapper is active since the infrastructure may not have |
| 986 // been properly initialized. | 986 // been properly initialized. |
| 987 ReportBootstrappingException(exception_handle, location); | 987 ReportBootstrappingException(exception_handle, location); |
| 988 } else { | 988 } else { |
| 989 Handle<Object> message_obj = CreateMessage(exception_handle, location); | 989 Handle<Object> message_obj = CreateMessage(exception_handle, location); |
| 990 | 990 |
| 991 thread_local_top()->pending_message_obj_ = *message_obj; | 991 thread_local_top()->pending_message_obj_ = *message_obj; |
| 992 thread_local_top()->pending_message_script_ = *location->script(); | 992 thread_local_top()->pending_message_script_ = *location->script(); |
| 993 thread_local_top()->pending_message_start_pos_ = location->start_pos(); | |
| 994 thread_local_top()->pending_message_end_pos_ = location->end_pos(); | |
| 995 | 993 |
| 996 // If the abort-on-uncaught-exception flag is specified, abort on any | 994 // If the abort-on-uncaught-exception flag is specified, abort on any |
| 997 // exception not caught by JavaScript, even when an external handler is | 995 // exception not caught by JavaScript, even when an external handler is |
| 998 // present. This flag is intended for use by JavaScript developers, so | 996 // present. This flag is intended for use by JavaScript developers, so |
| 999 // print a user-friendly stack trace (not an internal one). | 997 // print a user-friendly stack trace (not an internal one). |
| 1000 if (fatal_exception_depth == 0 && FLAG_abort_on_uncaught_exception && | 998 if (fatal_exception_depth == 0 && FLAG_abort_on_uncaught_exception && |
| 1001 (report_exception || can_be_caught_externally)) { | 999 (report_exception || can_be_caught_externally)) { |
| 1002 fatal_exception_depth++; | 1000 fatal_exception_depth++; |
| 1003 PrintF(stderr, "%s\n\nFROM\n", | 1001 PrintF(stderr, "%s\n\nFROM\n", |
| 1004 MessageHandler::GetLocalizedMessage(this, message_obj).get()); | 1002 MessageHandler::GetLocalizedMessage(this, message_obj).get()); |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1161 DCHECK(handler == try_catch_handler()); | 1159 DCHECK(handler == try_catch_handler()); |
| 1162 DCHECK(handler->HasCaught()); | 1160 DCHECK(handler->HasCaught()); |
| 1163 DCHECK(handler->rethrow_); | 1161 DCHECK(handler->rethrow_); |
| 1164 DCHECK(handler->capture_message_); | 1162 DCHECK(handler->capture_message_); |
| 1165 Object* message = reinterpret_cast<Object*>(handler->message_obj_); | 1163 Object* message = reinterpret_cast<Object*>(handler->message_obj_); |
| 1166 Object* script = reinterpret_cast<Object*>(handler->message_script_); | 1164 Object* script = reinterpret_cast<Object*>(handler->message_script_); |
| 1167 DCHECK(message->IsJSMessageObject() || message->IsTheHole()); | 1165 DCHECK(message->IsJSMessageObject() || message->IsTheHole()); |
| 1168 DCHECK(script->IsScript() || script->IsTheHole()); | 1166 DCHECK(script->IsScript() || script->IsTheHole()); |
| 1169 thread_local_top()->pending_message_obj_ = message; | 1167 thread_local_top()->pending_message_obj_ = message; |
| 1170 thread_local_top()->pending_message_script_ = script; | 1168 thread_local_top()->pending_message_script_ = script; |
| 1171 thread_local_top()->pending_message_start_pos_ = handler->message_start_pos_; | |
| 1172 thread_local_top()->pending_message_end_pos_ = handler->message_end_pos_; | |
| 1173 } | 1169 } |
| 1174 | 1170 |
| 1175 | 1171 |
| 1176 void Isolate::CancelScheduledExceptionFromTryCatch(v8::TryCatch* handler) { | 1172 void Isolate::CancelScheduledExceptionFromTryCatch(v8::TryCatch* handler) { |
| 1177 DCHECK(has_scheduled_exception()); | 1173 DCHECK(has_scheduled_exception()); |
| 1178 if (scheduled_exception() == handler->exception_) { | 1174 if (scheduled_exception() == handler->exception_) { |
| 1179 DCHECK(scheduled_exception() != heap()->termination_exception()); | 1175 DCHECK(scheduled_exception() != heap()->termination_exception()); |
| 1180 clear_scheduled_exception(); | 1176 clear_scheduled_exception(); |
| 1181 } | 1177 } |
| 1182 } | 1178 } |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1441 | 1437 |
| 1442 HandleScope scope(this); | 1438 HandleScope scope(this); |
| 1443 if (thread_local_top_.pending_exception_ == heap()->termination_exception()) { | 1439 if (thread_local_top_.pending_exception_ == heap()->termination_exception()) { |
| 1444 // Do nothing: if needed, the exception has been already propagated to | 1440 // Do nothing: if needed, the exception has been already propagated to |
| 1445 // v8::TryCatch. | 1441 // v8::TryCatch. |
| 1446 } else { | 1442 } else { |
| 1447 if (thread_local_top_.has_pending_message_) { | 1443 if (thread_local_top_.has_pending_message_) { |
| 1448 thread_local_top_.has_pending_message_ = false; | 1444 thread_local_top_.has_pending_message_ = false; |
| 1449 if (!thread_local_top_.pending_message_obj_->IsTheHole()) { | 1445 if (!thread_local_top_.pending_message_obj_->IsTheHole()) { |
| 1450 HandleScope scope(this); | 1446 HandleScope scope(this); |
| 1451 Handle<Object> message_obj(thread_local_top_.pending_message_obj_, | 1447 Handle<JSMessageObject> message_obj( |
| 1452 this); | 1448 JSMessageObject::cast(thread_local_top_.pending_message_obj_)); |
| 1453 if (!thread_local_top_.pending_message_script_->IsTheHole()) { | 1449 if (!thread_local_top_.pending_message_script_->IsTheHole()) { |
| 1454 Handle<Script> script( | 1450 Handle<Script> script( |
| 1455 Script::cast(thread_local_top_.pending_message_script_)); | 1451 Script::cast(thread_local_top_.pending_message_script_)); |
| 1456 int start_pos = thread_local_top_.pending_message_start_pos_; | 1452 int start_pos = message_obj->start_position(); |
| 1457 int end_pos = thread_local_top_.pending_message_end_pos_; | 1453 int end_pos = message_obj->end_position(); |
| 1458 MessageLocation location(script, start_pos, end_pos); | 1454 MessageLocation location(script, start_pos, end_pos); |
| 1459 MessageHandler::ReportMessage(this, &location, message_obj); | 1455 MessageHandler::ReportMessage(this, &location, message_obj); |
| 1460 } else { | 1456 } else { |
| 1461 MessageHandler::ReportMessage(this, NULL, message_obj); | 1457 MessageHandler::ReportMessage(this, NULL, message_obj); |
| 1462 } | 1458 } |
| 1463 } | 1459 } |
| 1464 } | 1460 } |
| 1465 } | 1461 } |
| 1466 if (can_clear_message) clear_pending_message(); | 1462 if (can_clear_message) clear_pending_message(); |
| 1467 } | 1463 } |
| 1468 | 1464 |
| 1469 | 1465 |
| 1470 MessageLocation Isolate::GetMessageLocation() { | 1466 MessageLocation Isolate::GetMessageLocation() { |
|
Michael Starzinger
2015/03/10 13:45:07
Please appreciate the fact that I can put UNREACHA
titzer
2015/03/10 13:48:24
Yeah, given that you showed me that this is only c
| |
| 1471 DCHECK(has_pending_exception()); | 1467 DCHECK(has_pending_exception()); |
| 1472 | 1468 |
| 1473 if (thread_local_top_.pending_exception_ != heap()->termination_exception() && | 1469 if (thread_local_top_.pending_exception_ != heap()->termination_exception() && |
| 1474 thread_local_top_.has_pending_message_ && | 1470 thread_local_top_.has_pending_message_ && |
| 1475 !thread_local_top_.pending_message_obj_->IsTheHole()) { | 1471 !thread_local_top_.pending_message_obj_->IsTheHole()) { |
| 1472 Handle<JSMessageObject> message_obj( | |
| 1473 JSMessageObject::cast(thread_local_top_.pending_message_obj_)); | |
| 1476 Handle<Script> script( | 1474 Handle<Script> script( |
| 1477 Script::cast(thread_local_top_.pending_message_script_)); | 1475 Script::cast(thread_local_top_.pending_message_script_)); |
| 1478 int start_pos = thread_local_top_.pending_message_start_pos_; | 1476 int start_pos = message_obj->start_position(); |
| 1479 int end_pos = thread_local_top_.pending_message_end_pos_; | 1477 int end_pos = message_obj->end_position(); |
| 1480 return MessageLocation(script, start_pos, end_pos); | 1478 return MessageLocation(script, start_pos, end_pos); |
| 1481 } | 1479 } |
| 1482 | 1480 |
| 1483 return MessageLocation(); | 1481 return MessageLocation(); |
| 1484 } | 1482 } |
| 1485 | 1483 |
| 1486 | 1484 |
| 1487 bool Isolate::OptionalRescheduleException(bool is_bottom_call) { | 1485 bool Isolate::OptionalRescheduleException(bool is_bottom_call) { |
| 1488 DCHECK(has_pending_exception()); | 1486 DCHECK(has_pending_exception()); |
| 1489 PropagatePendingExceptionToExternalTryCatch(); | 1487 PropagatePendingExceptionToExternalTryCatch(); |
| (...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1993 DCHECK(thread_local_top_.pending_message_script_->IsScript() || | 1991 DCHECK(thread_local_top_.pending_message_script_->IsScript() || |
| 1994 thread_local_top_.pending_message_script_->IsTheHole()); | 1992 thread_local_top_.pending_message_script_->IsTheHole()); |
| 1995 handler->can_continue_ = true; | 1993 handler->can_continue_ = true; |
| 1996 handler->has_terminated_ = false; | 1994 handler->has_terminated_ = false; |
| 1997 handler->exception_ = pending_exception(); | 1995 handler->exception_ = pending_exception(); |
| 1998 // Propagate to the external try-catch only if we got an actual message. | 1996 // Propagate to the external try-catch only if we got an actual message. |
| 1999 if (thread_local_top_.pending_message_obj_->IsTheHole()) return true; | 1997 if (thread_local_top_.pending_message_obj_->IsTheHole()) return true; |
| 2000 | 1998 |
| 2001 handler->message_obj_ = thread_local_top_.pending_message_obj_; | 1999 handler->message_obj_ = thread_local_top_.pending_message_obj_; |
| 2002 handler->message_script_ = thread_local_top_.pending_message_script_; | 2000 handler->message_script_ = thread_local_top_.pending_message_script_; |
| 2003 handler->message_start_pos_ = thread_local_top_.pending_message_start_pos_; | |
| 2004 handler->message_end_pos_ = thread_local_top_.pending_message_end_pos_; | |
| 2005 } | 2001 } |
| 2006 return true; | 2002 return true; |
| 2007 } | 2003 } |
| 2008 | 2004 |
| 2009 | 2005 |
| 2010 void Isolate::InitializeLoggingAndCounters() { | 2006 void Isolate::InitializeLoggingAndCounters() { |
| 2011 if (logger_ == NULL) { | 2007 if (logger_ == NULL) { |
| 2012 logger_ = new Logger(this); | 2008 logger_ = new Logger(this); |
| 2013 } | 2009 } |
| 2014 if (counters_ == NULL) { | 2010 if (counters_ == NULL) { |
| (...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2654 if (prev_ && prev_->Intercept(flag)) return true; | 2650 if (prev_ && prev_->Intercept(flag)) return true; |
| 2655 // Then check whether this scope intercepts. | 2651 // Then check whether this scope intercepts. |
| 2656 if ((flag & intercept_mask_)) { | 2652 if ((flag & intercept_mask_)) { |
| 2657 intercepted_flags_ |= flag; | 2653 intercepted_flags_ |= flag; |
| 2658 return true; | 2654 return true; |
| 2659 } | 2655 } |
| 2660 return false; | 2656 return false; |
| 2661 } | 2657 } |
| 2662 | 2658 |
| 2663 } } // namespace v8::internal | 2659 } } // namespace v8::internal |
| OLD | NEW |