Exception.cpp
1 /* 2 * Copyright (C) 2015-2019 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 #include "Exception.h" 28 29 #include "Interpreter.h" 30 #include "JSCJSValueInlines.h" 31 #include "JSObjectInlines.h" 32 #include "StructureInlines.h" 33 34 namespace JSC { 35 36 const ClassInfo Exception::s_info = { "Exception", nullptr, nullptr, nullptr, CREATE_METHOD_TABLE(Exception) }; 37 38 Exception* Exception::create(VM& vm, JSValue thrownValue, StackCaptureAction action) 39 { 40 Exception* result = new (NotNull, allocateCell<Exception>(vm.heap)) Exception(vm); 41 result->finishCreation(vm, thrownValue, action); 42 return result; 43 } 44 45 void Exception::destroy(JSCell* cell) 46 { 47 Exception* exception = static_cast<Exception*>(cell); 48 exception->~Exception(); 49 } 50 51 Structure* Exception::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) 52 { 53 return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info()); 54 } 55 56 void Exception::visitChildren(JSCell* cell, SlotVisitor& visitor) 57 { 58 Exception* thisObject = jsCast<Exception*>(cell); 59 ASSERT_GC_OBJECT_INHERITS(thisObject, info()); 60 Base::visitChildren(thisObject, visitor); 61 62 visitor.append(thisObject->m_value); 63 for (StackFrame& frame : thisObject->m_stack) 64 frame.visitChildren(visitor); 65 } 66 67 Exception::Exception(VM& vm) 68 : Base(vm, vm.exceptionStructure.get()) 69 { 70 } 71 72 Exception::~Exception() 73 { 74 } 75 76 void Exception::finishCreation(VM& vm, JSValue thrownValue, StackCaptureAction action) 77 { 78 Base::finishCreation(vm); 79 80 m_value.set(vm, this, thrownValue); 81 82 Vector<StackFrame> stackTrace; 83 if (action == StackCaptureAction::CaptureStack) 84 vm.interpreter->getStackTrace(this, stackTrace, 0, Options::exceptionStackTraceLimit()); 85 m_stack = WTFMove(stackTrace); 86 } 87 88 } // namespace JSC