1/*
2 * Copyright (C) 2016-2018 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 "FTLExceptionTarget.h"
28
29#if ENABLE(FTL_JIT)
30
31#include "FTLState.h"
32
33namespace JSC { namespace FTL {
34
35ExceptionTarget::~ExceptionTarget()
36{
37}
38
39CodeLocationLabel<ExceptionHandlerPtrTag> ExceptionTarget::label(LinkBuffer& linkBuffer)
40{
41 if (m_isDefaultHandler)
42 return linkBuffer.locationOf<ExceptionHandlerPtrTag>(*m_defaultHandler);
43 return linkBuffer.locationOf<ExceptionHandlerPtrTag>(m_handle->label);
44}
45
46Box<CCallHelpers::JumpList> ExceptionTarget::jumps(CCallHelpers& jit)
47{
48 Box<CCallHelpers::JumpList> result = Box<CCallHelpers::JumpList>::create();
49 if (m_isDefaultHandler) {
50 Box<CCallHelpers::Label> defaultHandler = m_defaultHandler;
51 jit.addLinkTask(
52 [=] (LinkBuffer& linkBuffer) {
53 linkBuffer.link(*result, linkBuffer.locationOf<ExceptionHandlerPtrTag>(*defaultHandler));
54 });
55 } else {
56 RefPtr<OSRExitHandle> handle = m_handle;
57 jit.addLinkTask(
58 [=] (LinkBuffer& linkBuffer) {
59 linkBuffer.link(*result, linkBuffer.locationOf<OSRExitPtrTag>(handle->label));
60 });
61 }
62 return result;
63}
64
65ExceptionTarget::ExceptionTarget(
66 bool isDefaultHandler, Box<CCallHelpers::Label> defaultHandler, RefPtr<OSRExitHandle> handle)
67 : m_isDefaultHandler(isDefaultHandler)
68 , m_defaultHandler(defaultHandler)
69 , m_handle(handle)
70{
71}
72
73} } // namespace JSC::FTL
74
75#endif // ENABLE(FTL_JIT)
76
77