1/* 2 * Copyright (C) 2012 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 "GCAwareJITStubRoutine.h" 28 29#if ENABLE(JIT) 30 31#include "Heap.h" 32#include "VM.h" 33#include "JSCInlines.h" 34#include "SlotVisitor.h" 35#include "Structure.h" 36 37namespace JSC { 38 39GCAwareJITStubRoutine::GCAwareJITStubRoutine( 40 const MacroAssemblerCodeRef& code, VM& vm) 41 : JITStubRoutine(code) 42 , m_mayBeExecuting(false) 43 , m_isJettisoned(false) 44{ 45 vm.heap.m_jitStubRoutines.add(this); 46} 47 48GCAwareJITStubRoutine::~GCAwareJITStubRoutine() { } 49 50void GCAwareJITStubRoutine::observeZeroRefCount() 51{ 52 if (m_isJettisoned) { 53 // This case is needed for when the system shuts down. It may be that 54 // the JIT stub routine set gets deleted before we get around to deleting 55 // this guy. In that case the GC informs us that we're jettisoned already 56 // and that we should delete ourselves as soon as the ref count reaches 57 // zero. 58 delete this; 59 return; 60 } 61 62 RELEASE_ASSERT(!m_refCount); 63 64 m_isJettisoned = true; 65} 66 67void GCAwareJITStubRoutine::deleteFromGC() 68{ 69 ASSERT(m_isJettisoned); 70 ASSERT(!m_refCount); 71 ASSERT(!m_mayBeExecuting); 72 73 delete this; 74} 75 76void GCAwareJITStubRoutine::markRequiredObjectsInternal(SlotVisitor&) 77{ 78} 79 80MarkingGCAwareJITStubRoutineWithOneObject::MarkingGCAwareJITStubRoutineWithOneObject( 81 const MacroAssemblerCodeRef& code, VM& vm, const JSCell* owner, 82 JSCell* object) 83 : GCAwareJITStubRoutine(code, vm) 84 , m_object(vm, owner, object) 85{ 86} 87 88MarkingGCAwareJITStubRoutineWithOneObject::~MarkingGCAwareJITStubRoutineWithOneObject() 89{ 90} 91 92void MarkingGCAwareJITStubRoutineWithOneObject::markRequiredObjectsInternal(SlotVisitor& visitor) 93{ 94 visitor.append(&m_object); 95} 96 97PassRefPtr<JITStubRoutine> createJITStubRoutine( 98 const MacroAssemblerCodeRef& code, 99 VM& vm, 100 const JSCell* owner, 101 bool makesCalls, 102 JSCell* object) 103{ 104 if (!makesCalls) 105 return adoptRef(new JITStubRoutine(code)); 106 107 if (!object) { 108 return static_pointer_cast<JITStubRoutine>( 109 adoptRef(new GCAwareJITStubRoutine(code, vm))); 110 } 111 112 return static_pointer_cast<JITStubRoutine>( 113 adoptRef(new MarkingGCAwareJITStubRoutineWithOneObject(code, vm, owner, object))); 114} 115 116} // namespace JSC 117 118#endif // ENABLE(JIT) 119 120