| 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 "src/isolate.h" | 5 #include "src/isolate.h" |
| 6 | 6 |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 | 8 |
| 9 #include <fstream> // NOLINT(readability/streams) | 9 #include <fstream> // NOLINT(readability/streams) |
| 10 #include <sstream> | 10 #include <sstream> |
| (...skipping 975 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 986 | 986 |
| 987 thread_local_top()->rethrowing_message_ = false; | 987 thread_local_top()->rethrowing_message_ = false; |
| 988 | 988 |
| 989 // Notify debugger of exception. | 989 // Notify debugger of exception. |
| 990 if (is_catchable_by_javascript(exception)) { | 990 if (is_catchable_by_javascript(exception)) { |
| 991 debug()->OnThrow(exception_handle); | 991 debug()->OnThrow(exception_handle); |
| 992 } | 992 } |
| 993 | 993 |
| 994 // Generate the message if required. | 994 // Generate the message if required. |
| 995 if (requires_message && !rethrowing_message) { | 995 if (requires_message && !rethrowing_message) { |
| 996 MessageLocation potential_computed_location; | 996 MessageLocation computed_location; |
| 997 if (location == NULL) { | 997 // If no location was specified we try to use a computed one instead. |
| 998 // If no location was specified we use a computed one instead. | 998 if (location == NULL && ComputeLocation(&computed_location)) { |
| 999 ComputeLocation(&potential_computed_location); | 999 location = &computed_location; |
| 1000 location = &potential_computed_location; | |
| 1001 } | 1000 } |
| 1002 | 1001 |
| 1003 if (bootstrapper()->IsActive()) { | 1002 if (bootstrapper()->IsActive()) { |
| 1004 // It's not safe to try to make message objects or collect stack traces | 1003 // It's not safe to try to make message objects or collect stack traces |
| 1005 // while the bootstrapper is active since the infrastructure may not have | 1004 // while the bootstrapper is active since the infrastructure may not have |
| 1006 // been properly initialized. | 1005 // been properly initialized. |
| 1007 ReportBootstrappingException(exception_handle, location); | 1006 ReportBootstrappingException(exception_handle, location); |
| 1008 } else { | 1007 } else { |
| 1009 Handle<Object> message_obj = CreateMessage(exception_handle, location); | 1008 Handle<Object> message_obj = CreateMessage(exception_handle, location); |
| 1010 thread_local_top()->pending_message_obj_ = *message_obj; | 1009 thread_local_top()->pending_message_obj_ = *message_obj; |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1251 Handle<String> line = | 1250 Handle<String> line = |
| 1252 Execution::GetStackTraceLine(recv, fun, pos_obj, is_top_level); | 1251 Execution::GetStackTraceLine(recv, fun, pos_obj, is_top_level); |
| 1253 if (line->length() > 0) { | 1252 if (line->length() > 0) { |
| 1254 line->PrintOn(out); | 1253 line->PrintOn(out); |
| 1255 PrintF(out, "\n"); | 1254 PrintF(out, "\n"); |
| 1256 } | 1255 } |
| 1257 } | 1256 } |
| 1258 } | 1257 } |
| 1259 | 1258 |
| 1260 | 1259 |
| 1261 void Isolate::ComputeLocation(MessageLocation* target) { | 1260 bool Isolate::ComputeLocation(MessageLocation* target) { |
| 1262 *target = MessageLocation(Handle<Script>(heap_.empty_script()), -1, -1); | |
| 1263 StackTraceFrameIterator it(this); | 1261 StackTraceFrameIterator it(this); |
| 1264 if (!it.done()) { | 1262 if (!it.done()) { |
| 1265 JavaScriptFrame* frame = it.frame(); | 1263 JavaScriptFrame* frame = it.frame(); |
| 1266 JSFunction* fun = frame->function(); | 1264 JSFunction* fun = frame->function(); |
| 1267 Object* script = fun->shared()->script(); | 1265 Object* script = fun->shared()->script(); |
| 1268 if (script->IsScript() && | 1266 if (script->IsScript() && |
| 1269 !(Script::cast(script)->source()->IsUndefined())) { | 1267 !(Script::cast(script)->source()->IsUndefined())) { |
| 1270 int pos = frame->LookupCode()->SourcePosition(frame->pc()); | 1268 int pos = frame->LookupCode()->SourcePosition(frame->pc()); |
| 1271 // Compute the location from the function and the reloc info. | 1269 // Compute the location from the function and the reloc info. |
| 1272 Handle<Script> casted_script(Script::cast(script)); | 1270 Handle<Script> casted_script(Script::cast(script)); |
| 1273 *target = MessageLocation(casted_script, pos, pos + 1, handle(fun)); | 1271 *target = MessageLocation(casted_script, pos, pos + 1, handle(fun)); |
| 1272 return true; |
| 1274 } | 1273 } |
| 1275 } | 1274 } |
| 1275 return false; |
| 1276 } | 1276 } |
| 1277 | 1277 |
| 1278 | 1278 |
| 1279 bool Isolate::ComputeLocationFromException(MessageLocation* target, | 1279 bool Isolate::ComputeLocationFromException(MessageLocation* target, |
| 1280 Handle<Object> exception) { | 1280 Handle<Object> exception) { |
| 1281 if (!exception->IsJSObject()) return false; | 1281 if (!exception->IsJSObject()) return false; |
| 1282 | 1282 |
| 1283 Handle<Name> start_pos_symbol = factory()->error_start_pos_symbol(); | 1283 Handle<Name> start_pos_symbol = factory()->error_start_pos_symbol(); |
| 1284 Handle<Object> start_pos = JSReceiver::GetDataProperty( | 1284 Handle<Object> start_pos = JSReceiver::GetDataProperty( |
| 1285 Handle<JSObject>::cast(exception), start_pos_symbol); | 1285 Handle<JSObject>::cast(exception), start_pos_symbol); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1298 if (!script->IsScript()) return false; | 1298 if (!script->IsScript()) return false; |
| 1299 | 1299 |
| 1300 Handle<Script> cast_script(Script::cast(*script)); | 1300 Handle<Script> cast_script(Script::cast(*script)); |
| 1301 *target = MessageLocation(cast_script, start_pos_value, end_pos_value); | 1301 *target = MessageLocation(cast_script, start_pos_value, end_pos_value); |
| 1302 return true; | 1302 return true; |
| 1303 } | 1303 } |
| 1304 | 1304 |
| 1305 | 1305 |
| 1306 bool Isolate::ComputeLocationFromStackTrace(MessageLocation* target, | 1306 bool Isolate::ComputeLocationFromStackTrace(MessageLocation* target, |
| 1307 Handle<Object> exception) { | 1307 Handle<Object> exception) { |
| 1308 *target = MessageLocation(Handle<Script>(heap_.empty_script()), -1, -1); | |
| 1309 | |
| 1310 if (!exception->IsJSObject()) return false; | 1308 if (!exception->IsJSObject()) return false; |
| 1311 Handle<Name> key = factory()->stack_trace_symbol(); | 1309 Handle<Name> key = factory()->stack_trace_symbol(); |
| 1312 Handle<Object> property = | 1310 Handle<Object> property = |
| 1313 JSReceiver::GetDataProperty(Handle<JSObject>::cast(exception), key); | 1311 JSReceiver::GetDataProperty(Handle<JSObject>::cast(exception), key); |
| 1314 if (!property->IsJSArray()) return false; | 1312 if (!property->IsJSArray()) return false; |
| 1315 Handle<JSArray> simple_stack_trace = Handle<JSArray>::cast(property); | 1313 Handle<JSArray> simple_stack_trace = Handle<JSArray>::cast(property); |
| 1316 | 1314 |
| 1317 Handle<FixedArray> elements(FixedArray::cast(simple_stack_trace->elements())); | 1315 Handle<FixedArray> elements(FixedArray::cast(simple_stack_trace->elements())); |
| 1318 int elements_limit = Smi::cast(simple_stack_trace->length())->value(); | 1316 int elements_limit = Smi::cast(simple_stack_trace->length())->value(); |
| 1319 | 1317 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1349 return true; | 1347 return true; |
| 1350 } | 1348 } |
| 1351 } | 1349 } |
| 1352 return false; | 1350 return false; |
| 1353 } | 1351 } |
| 1354 | 1352 |
| 1355 | 1353 |
| 1356 Handle<JSMessageObject> Isolate::CreateMessage(Handle<Object> exception, | 1354 Handle<JSMessageObject> Isolate::CreateMessage(Handle<Object> exception, |
| 1357 MessageLocation* location) { | 1355 MessageLocation* location) { |
| 1358 Handle<JSArray> stack_trace_object; | 1356 Handle<JSArray> stack_trace_object; |
| 1359 MessageLocation potential_computed_location; | |
| 1360 if (capture_stack_trace_for_uncaught_exceptions_) { | 1357 if (capture_stack_trace_for_uncaught_exceptions_) { |
| 1361 if (IsErrorObject(exception)) { | 1358 if (IsErrorObject(exception)) { |
| 1362 // We fetch the stack trace that corresponds to this error object. | 1359 // We fetch the stack trace that corresponds to this error object. |
| 1363 // If the lookup fails, the exception is probably not a valid Error | 1360 // If the lookup fails, the exception is probably not a valid Error |
| 1364 // object. In that case, we fall through and capture the stack trace | 1361 // object. In that case, we fall through and capture the stack trace |
| 1365 // at this throw site. | 1362 // at this throw site. |
| 1366 stack_trace_object = | 1363 stack_trace_object = |
| 1367 GetDetailedStackTrace(Handle<JSObject>::cast(exception)); | 1364 GetDetailedStackTrace(Handle<JSObject>::cast(exception)); |
| 1368 } | 1365 } |
| 1369 if (stack_trace_object.is_null()) { | 1366 if (stack_trace_object.is_null()) { |
| 1370 // Not an error object, we capture stack and location at throw site. | 1367 // Not an error object, we capture stack and location at throw site. |
| 1371 stack_trace_object = CaptureCurrentStackTrace( | 1368 stack_trace_object = CaptureCurrentStackTrace( |
| 1372 stack_trace_for_uncaught_exceptions_frame_limit_, | 1369 stack_trace_for_uncaught_exceptions_frame_limit_, |
| 1373 stack_trace_for_uncaught_exceptions_options_); | 1370 stack_trace_for_uncaught_exceptions_options_); |
| 1374 } | 1371 } |
| 1375 } | 1372 } |
| 1376 if (!location) { | 1373 MessageLocation computed_location; |
| 1377 if (!ComputeLocationFromException(&potential_computed_location, | 1374 if (location == NULL && |
| 1378 exception)) { | 1375 (ComputeLocationFromException(&computed_location, exception) || |
| 1379 if (!ComputeLocationFromStackTrace(&potential_computed_location, | 1376 ComputeLocationFromStackTrace(&computed_location, exception) || |
| 1380 exception)) { | 1377 ComputeLocation(&computed_location))) { |
| 1381 ComputeLocation(&potential_computed_location); | 1378 location = &computed_location; |
| 1382 } | |
| 1383 } | |
| 1384 location = &potential_computed_location; | |
| 1385 } | 1379 } |
| 1386 | 1380 |
| 1387 return MessageHandler::MakeMessageObject( | 1381 return MessageHandler::MakeMessageObject( |
| 1388 this, MessageTemplate::kUncaughtException, location, exception, | 1382 this, MessageTemplate::kUncaughtException, location, exception, |
| 1389 stack_trace_object); | 1383 stack_trace_object); |
| 1390 } | 1384 } |
| 1391 | 1385 |
| 1392 | 1386 |
| 1393 bool Isolate::IsJavaScriptHandlerOnTop(Object* exception) { | 1387 bool Isolate::IsJavaScriptHandlerOnTop(Object* exception) { |
| 1394 DCHECK_NE(heap()->the_hole_value(), exception); | 1388 DCHECK_NE(heap()->the_hole_value(), exception); |
| (...skipping 1415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2810 // Then check whether this scope intercepts. | 2804 // Then check whether this scope intercepts. |
| 2811 if ((flag & intercept_mask_)) { | 2805 if ((flag & intercept_mask_)) { |
| 2812 intercepted_flags_ |= flag; | 2806 intercepted_flags_ |= flag; |
| 2813 return true; | 2807 return true; |
| 2814 } | 2808 } |
| 2815 return false; | 2809 return false; |
| 2816 } | 2810 } |
| 2817 | 2811 |
| 2818 } // namespace internal | 2812 } // namespace internal |
| 2819 } // namespace v8 | 2813 } // namespace v8 |
| OLD | NEW |