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 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1062 !(Script::cast(script)->source()->IsUndefined())) { | 1062 !(Script::cast(script)->source()->IsUndefined())) { |
1063 int pos = frame->LookupCode()->SourcePosition(frame->pc()); | 1063 int pos = frame->LookupCode()->SourcePosition(frame->pc()); |
1064 // Compute the location from the function and the reloc info. | 1064 // Compute the location from the function and the reloc info. |
1065 Handle<Script> casted_script(Script::cast(script)); | 1065 Handle<Script> casted_script(Script::cast(script)); |
1066 *target = MessageLocation(casted_script, pos, pos + 1, handle(fun)); | 1066 *target = MessageLocation(casted_script, pos, pos + 1, handle(fun)); |
1067 } | 1067 } |
1068 } | 1068 } |
1069 } | 1069 } |
1070 | 1070 |
1071 | 1071 |
| 1072 bool Isolate::ComputeLocationFromException(MessageLocation* target, |
| 1073 Handle<Object> exception) { |
| 1074 if (!exception->IsJSObject()) return false; |
| 1075 |
| 1076 Handle<Name> start_pos_symbol = factory()->error_start_pos_symbol(); |
| 1077 Handle<Object> start_pos = JSObject::GetDataProperty( |
| 1078 Handle<JSObject>::cast(exception), start_pos_symbol); |
| 1079 if (!start_pos->IsSmi()) return false; |
| 1080 int start_pos_value = Handle<Smi>::cast(start_pos)->value(); |
| 1081 |
| 1082 Handle<Name> end_pos_symbol = factory()->error_end_pos_symbol(); |
| 1083 Handle<Object> end_pos = JSObject::GetDataProperty( |
| 1084 Handle<JSObject>::cast(exception), end_pos_symbol); |
| 1085 if (!end_pos->IsSmi()) return false; |
| 1086 int end_pos_value = Handle<Smi>::cast(end_pos)->value(); |
| 1087 |
| 1088 Handle<Name> script_symbol = factory()->error_script_symbol(); |
| 1089 Handle<Object> script = JSObject::GetDataProperty( |
| 1090 Handle<JSObject>::cast(exception), script_symbol); |
| 1091 if (!script->IsScript()) return false; |
| 1092 |
| 1093 Handle<Script> cast_script(Script::cast(*script)); |
| 1094 *target = MessageLocation(cast_script, start_pos_value, end_pos_value); |
| 1095 return true; |
| 1096 } |
| 1097 |
| 1098 |
1072 bool Isolate::ComputeLocationFromStackTrace(MessageLocation* target, | 1099 bool Isolate::ComputeLocationFromStackTrace(MessageLocation* target, |
1073 Handle<Object> exception) { | 1100 Handle<Object> exception) { |
1074 *target = MessageLocation(Handle<Script>(heap_.empty_script()), -1, -1); | 1101 *target = MessageLocation(Handle<Script>(heap_.empty_script()), -1, -1); |
1075 | 1102 |
1076 if (!exception->IsJSObject()) return false; | 1103 if (!exception->IsJSObject()) return false; |
1077 Handle<Name> key = factory()->stack_trace_symbol(); | 1104 Handle<Name> key = factory()->stack_trace_symbol(); |
1078 Handle<Object> property = | 1105 Handle<Object> property = |
1079 JSObject::GetDataProperty(Handle<JSObject>::cast(exception), key); | 1106 JSObject::GetDataProperty(Handle<JSObject>::cast(exception), key); |
1080 if (!property->IsJSArray()) return false; | 1107 if (!property->IsJSArray()) return false; |
1081 Handle<JSArray> simple_stack_trace = Handle<JSArray>::cast(property); | 1108 Handle<JSArray> simple_stack_trace = Handle<JSArray>::cast(property); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1174 GetDetailedStackTrace(Handle<JSObject>::cast(exception)); | 1201 GetDetailedStackTrace(Handle<JSObject>::cast(exception)); |
1175 } | 1202 } |
1176 if (stack_trace_object.is_null()) { | 1203 if (stack_trace_object.is_null()) { |
1177 // Not an error object, we capture stack and location at throw site. | 1204 // Not an error object, we capture stack and location at throw site. |
1178 stack_trace_object = CaptureCurrentStackTrace( | 1205 stack_trace_object = CaptureCurrentStackTrace( |
1179 stack_trace_for_uncaught_exceptions_frame_limit_, | 1206 stack_trace_for_uncaught_exceptions_frame_limit_, |
1180 stack_trace_for_uncaught_exceptions_options_); | 1207 stack_trace_for_uncaught_exceptions_options_); |
1181 } | 1208 } |
1182 } | 1209 } |
1183 if (!location) { | 1210 if (!location) { |
1184 if (!ComputeLocationFromStackTrace(&potential_computed_location, | 1211 if (!ComputeLocationFromException(&potential_computed_location, |
1185 exception)) { | 1212 exception)) { |
1186 ComputeLocation(&potential_computed_location); | 1213 if (!ComputeLocationFromStackTrace(&potential_computed_location, |
| 1214 exception)) { |
| 1215 ComputeLocation(&potential_computed_location); |
| 1216 } |
1187 } | 1217 } |
1188 location = &potential_computed_location; | 1218 location = &potential_computed_location; |
1189 } | 1219 } |
1190 | 1220 |
1191 // If the exception argument is a custom object, turn it into a string | 1221 // If the exception argument is a custom object, turn it into a string |
1192 // before throwing as uncaught exception. Note that the pending | 1222 // before throwing as uncaught exception. Note that the pending |
1193 // exception object to be set later must not be turned into a string. | 1223 // exception object to be set later must not be turned into a string. |
1194 if (exception->IsJSObject() && !IsErrorObject(exception)) { | 1224 if (exception->IsJSObject() && !IsErrorObject(exception)) { |
1195 MaybeHandle<Object> maybe_exception = | 1225 MaybeHandle<Object> maybe_exception = |
1196 Execution::ToDetailString(this, exception); | 1226 Execution::ToDetailString(this, exception); |
(...skipping 1358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2555 if (prev_ && prev_->Intercept(flag)) return true; | 2585 if (prev_ && prev_->Intercept(flag)) return true; |
2556 // Then check whether this scope intercepts. | 2586 // Then check whether this scope intercepts. |
2557 if ((flag & intercept_mask_)) { | 2587 if ((flag & intercept_mask_)) { |
2558 intercepted_flags_ |= flag; | 2588 intercepted_flags_ |= flag; |
2559 return true; | 2589 return true; |
2560 } | 2590 } |
2561 return false; | 2591 return false; |
2562 } | 2592 } |
2563 | 2593 |
2564 } } // namespace v8::internal | 2594 } } // namespace v8::internal |
OLD | NEW |