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/api.h" | 5 #include "src/api.h" |
6 | 6 |
7 #include <string.h> // For memcpy, strlen. | 7 #include <string.h> // For memcpy, strlen. |
8 #ifdef V8_USE_ADDRESS_SANITIZER | 8 #ifdef V8_USE_ADDRESS_SANITIZER |
9 #include <sanitizer/asan_interface.h> | 9 #include <sanitizer/asan_interface.h> |
10 #endif // V8_USE_ADDRESS_SANITIZER | 10 #endif // V8_USE_ADDRESS_SANITIZER |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
236 | 236 |
237 // --- E x c e p t i o n B e h a v i o r --- | 237 // --- E x c e p t i o n B e h a v i o r --- |
238 | 238 |
239 | 239 |
240 void i::FatalProcessOutOfMemory(const char* location) { | 240 void i::FatalProcessOutOfMemory(const char* location) { |
241 i::V8::FatalProcessOutOfMemory(location, false); | 241 i::V8::FatalProcessOutOfMemory(location, false); |
242 } | 242 } |
243 | 243 |
244 | 244 |
245 // When V8 cannot allocated memory FatalProcessOutOfMemory is called. | 245 // When V8 cannot allocated memory FatalProcessOutOfMemory is called. |
246 // The default fatal error handler is called and execution is stopped. | 246 // The default OOM error handler is called and execution is stopped. |
247 void i::V8::FatalProcessOutOfMemory(const char* location, bool is_heap_oom) { | 247 void i::V8::FatalProcessOutOfMemory(const char* location, bool is_heap_oom) { |
248 i::Isolate* isolate = i::Isolate::Current(); | 248 i::Isolate* isolate = i::Isolate::Current(); |
249 char last_few_messages[Heap::kTraceRingBufferSize + 1]; | 249 char last_few_messages[Heap::kTraceRingBufferSize + 1]; |
250 char js_stacktrace[Heap::kStacktraceBufferSize + 1]; | 250 char js_stacktrace[Heap::kStacktraceBufferSize + 1]; |
251 memset(last_few_messages, 0, Heap::kTraceRingBufferSize + 1); | 251 memset(last_few_messages, 0, Heap::kTraceRingBufferSize + 1); |
252 memset(js_stacktrace, 0, Heap::kStacktraceBufferSize + 1); | 252 memset(js_stacktrace, 0, Heap::kStacktraceBufferSize + 1); |
253 | 253 |
254 i::HeapStats heap_stats; | 254 i::HeapStats heap_stats; |
255 int start_marker; | 255 int start_marker; |
256 heap_stats.start_marker = &start_marker; | 256 heap_stats.start_marker = &start_marker; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
299 if (isolate->heap()->HasBeenSetUp()) { | 299 if (isolate->heap()->HasBeenSetUp()) { |
300 // BUG(1718): Don't use the take_snapshot since we don't support | 300 // BUG(1718): Don't use the take_snapshot since we don't support |
301 // HeapIterator here without doing a special GC. | 301 // HeapIterator here without doing a special GC. |
302 isolate->heap()->RecordStats(&heap_stats, false); | 302 isolate->heap()->RecordStats(&heap_stats, false); |
303 char* first_newline = strchr(last_few_messages, '\n'); | 303 char* first_newline = strchr(last_few_messages, '\n'); |
304 if (first_newline == NULL || first_newline[1] == '\0') | 304 if (first_newline == NULL || first_newline[1] == '\0') |
305 first_newline = last_few_messages; | 305 first_newline = last_few_messages; |
306 PrintF("\n<--- Last few GCs --->\n%s\n", first_newline); | 306 PrintF("\n<--- Last few GCs --->\n%s\n", first_newline); |
307 PrintF("\n<--- JS stacktrace --->\n%s\n", js_stacktrace); | 307 PrintF("\n<--- JS stacktrace --->\n%s\n", js_stacktrace); |
308 } | 308 } |
309 Utils::ApiCheck(false, location, is_heap_oom | 309 Utils::ReportOOMFailure(location, is_heap_oom); |
310 ? "Allocation failed - JavaScript heap out of memory" | |
311 : "Allocation failed - process out of memory"); | |
312 // If the fatal error handler returns, we stop execution. | 310 // If the fatal error handler returns, we stop execution. |
313 FATAL("API fatal error handler returned after process out of memory"); | 311 FATAL("API fatal error handler returned after process out of memory"); |
314 } | 312 } |
315 | 313 |
316 | 314 |
317 void Utils::ReportApiFailure(const char* location, const char* message) { | 315 void Utils::ReportApiFailure(const char* location, const char* message) { |
318 i::Isolate* isolate = i::Isolate::Current(); | 316 i::Isolate* isolate = i::Isolate::Current(); |
319 FatalErrorCallback callback = isolate->exception_behavior(); | 317 FatalErrorCallback callback = isolate->exception_behavior(); |
320 if (callback == NULL) { | 318 if (callback == NULL) { |
321 base::OS::PrintError("\n#\n# Fatal error in %s\n# %s\n#\n\n", location, | 319 base::OS::PrintError("\n#\n# Fatal error in %s\n# %s\n#\n\n", location, |
322 message); | 320 message); |
323 base::OS::Abort(); | 321 base::OS::Abort(); |
324 } else { | 322 } else { |
325 callback(location, message); | 323 callback(location, message); |
326 } | 324 } |
327 isolate->SignalFatalError(); | 325 isolate->SignalFatalError(); |
328 } | 326 } |
329 | 327 |
330 | 328 |
329 void Utils::ReportOOMFailure(const char* location, bool is_heap_oom) { | |
330 i::Isolate* isolate = i::Isolate::Current(); | |
331 OOMErrorCallback callback = isolate->oom_behavior(); | |
332 if (callback == NULL) { | |
jochen (gone - plz use gerrit)
2016/07/12 15:11:30
nullptr
Will Harris
2016/07/12 15:42:53
Done.
| |
333 base::OS::PrintError("\n#\n# Fatal %s OOM in %s\n#\n\n", | |
334 is_heap_oom ? "javascript" : "process", location); | |
335 base::OS::Abort(); | |
336 } else { | |
337 callback(location, is_heap_oom); | |
338 } | |
339 isolate->SignalFatalError(); | |
340 } | |
341 | |
331 static inline bool IsExecutionTerminatingCheck(i::Isolate* isolate) { | 342 static inline bool IsExecutionTerminatingCheck(i::Isolate* isolate) { |
332 if (isolate->has_scheduled_exception()) { | 343 if (isolate->has_scheduled_exception()) { |
333 return isolate->scheduled_exception() == | 344 return isolate->scheduled_exception() == |
334 isolate->heap()->termination_exception(); | 345 isolate->heap()->termination_exception(); |
335 } | 346 } |
336 return false; | 347 return false; |
337 } | 348 } |
338 | 349 |
339 | 350 |
340 void V8::SetNativesDataBlob(StartupData* natives_blob) { | 351 void V8::SetNativesDataBlob(StartupData* natives_blob) { |
(...skipping 7559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7900 *length_in_bytes = 0; | 7911 *length_in_bytes = 0; |
7901 } | 7912 } |
7902 } | 7913 } |
7903 | 7914 |
7904 | 7915 |
7905 void Isolate::SetFatalErrorHandler(FatalErrorCallback that) { | 7916 void Isolate::SetFatalErrorHandler(FatalErrorCallback that) { |
7906 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | 7917 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
7907 isolate->set_exception_behavior(that); | 7918 isolate->set_exception_behavior(that); |
7908 } | 7919 } |
7909 | 7920 |
7921 void Isolate::SetOOMErrorHandler(OOMErrorCallback that) { | |
7922 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | |
7923 isolate->set_oom_behavior(that); | |
7924 } | |
7910 | 7925 |
7911 void Isolate::SetAllowCodeGenerationFromStringsCallback( | 7926 void Isolate::SetAllowCodeGenerationFromStringsCallback( |
7912 AllowCodeGenerationFromStringsCallback callback) { | 7927 AllowCodeGenerationFromStringsCallback callback) { |
7913 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | 7928 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
7914 isolate->set_allow_code_gen_callback(callback); | 7929 isolate->set_allow_code_gen_callback(callback); |
7915 } | 7930 } |
7916 | 7931 |
7917 | 7932 |
7918 bool Isolate::IsDead() { | 7933 bool Isolate::IsDead() { |
7919 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | 7934 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
(...skipping 1089 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9009 Address callback_address = | 9024 Address callback_address = |
9010 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 9025 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
9011 VMState<EXTERNAL> state(isolate); | 9026 VMState<EXTERNAL> state(isolate); |
9012 ExternalCallbackScope call_scope(isolate, callback_address); | 9027 ExternalCallbackScope call_scope(isolate, callback_address); |
9013 callback(info); | 9028 callback(info); |
9014 } | 9029 } |
9015 | 9030 |
9016 | 9031 |
9017 } // namespace internal | 9032 } // namespace internal |
9018 } // namespace v8 | 9033 } // namespace v8 |
OLD | NEW |