]>
Commit | Line | Data |
---|---|---|
93a37866 A |
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 | #ifndef GCAwareJITStubRoutine_h | |
27 | #define GCAwareJITStubRoutine_h | |
28 | ||
29 | #include <wtf/Platform.h> | |
30 | ||
31 | #if ENABLE(JIT) | |
32 | ||
33 | #include "JITStubRoutine.h" | |
34 | #include "JSObject.h" | |
35 | #include "JSString.h" | |
36 | #include "WriteBarrier.h" | |
37 | #include <wtf/RefCounted.h> | |
38 | #include <wtf/Vector.h> | |
39 | ||
40 | namespace JSC { | |
41 | ||
42 | class JITStubRoutineSet; | |
43 | ||
44 | // Use this stub routine if you know that your code might be on stack when | |
45 | // either GC or other kinds of stub deletion happen. Basicaly, if your stub | |
46 | // routine makes calls (either to JS code or to C++ code) then you should | |
47 | // assume that it's possible for that JS or C++ code to do something that | |
48 | // causes the system to try to delete your routine. Using this routine type | |
49 | // ensures that the actual deletion is delayed until the GC proves that the | |
50 | // routine is no longer running. You can also subclass this routine if you | |
51 | // want to mark additional objects during GC in those cases where the | |
52 | // routine is known to be executing, or if you want to force this routine to | |
53 | // keep other routines alive (for example due to the use of a slow-path | |
54 | // list which does not get reclaimed all at once). | |
55 | class GCAwareJITStubRoutine : public JITStubRoutine { | |
56 | public: | |
57 | GCAwareJITStubRoutine(const MacroAssemblerCodeRef&, VM&, bool isClosureCall = false); | |
58 | virtual ~GCAwareJITStubRoutine(); | |
59 | ||
60 | void markRequiredObjects(SlotVisitor& visitor) | |
61 | { | |
62 | markRequiredObjectsInternal(visitor); | |
63 | } | |
64 | ||
65 | void deleteFromGC(); | |
66 | ||
67 | bool isClosureCall() const { return m_isClosureCall; } | |
68 | ||
69 | protected: | |
70 | virtual void observeZeroRefCount(); | |
71 | ||
72 | virtual void markRequiredObjectsInternal(SlotVisitor&); | |
73 | ||
74 | private: | |
75 | friend class JITStubRoutineSet; | |
76 | ||
77 | bool m_mayBeExecuting; | |
78 | bool m_isJettisoned; | |
79 | bool m_isClosureCall; | |
80 | }; | |
81 | ||
82 | // Use this if you want to mark one additional object during GC if your stub | |
83 | // routine is known to be executing. | |
84 | class MarkingGCAwareJITStubRoutineWithOneObject : public GCAwareJITStubRoutine { | |
85 | public: | |
86 | MarkingGCAwareJITStubRoutineWithOneObject( | |
87 | const MacroAssemblerCodeRef&, VM&, const JSCell* owner, JSCell*); | |
88 | virtual ~MarkingGCAwareJITStubRoutineWithOneObject(); | |
89 | ||
90 | protected: | |
91 | virtual void markRequiredObjectsInternal(SlotVisitor&); | |
92 | ||
93 | private: | |
94 | WriteBarrier<JSCell> m_object; | |
95 | }; | |
96 | ||
97 | // Helper for easily creating a GC-aware JIT stub routine. For the varargs, | |
98 | // pass zero or more JSCell*'s. This will either create a JITStubRoutine, a | |
99 | // GCAwareJITStubRoutine, or an ObjectMarkingGCAwareJITStubRoutine as | |
100 | // appropriate. Generally you only need to pass pointers that will be used | |
101 | // after the first call to C++ or JS. | |
102 | // | |
103 | // PassRefPtr<JITStubRoutine> createJITStubRoutine( | |
104 | // const MacroAssemblerCodeRef& code, | |
105 | // VM& vm, | |
106 | // const JSCell* owner, | |
107 | // bool makesCalls, | |
108 | // ...); | |
109 | // | |
110 | // Note that we don't actually use C-style varargs because that leads to | |
111 | // strange type-related problems. For example it would preclude us from using | |
112 | // our custom of passing '0' as NULL pointer. Besides, when I did try to write | |
113 | // this function using varargs, I ended up with more code than this simple | |
114 | // way. | |
115 | ||
116 | PassRefPtr<JITStubRoutine> createJITStubRoutine( | |
117 | const MacroAssemblerCodeRef&, VM&, const JSCell* owner, bool makesCalls); | |
118 | PassRefPtr<JITStubRoutine> createJITStubRoutine( | |
119 | const MacroAssemblerCodeRef&, VM&, const JSCell* owner, bool makesCalls, | |
120 | JSCell*); | |
121 | ||
122 | } // namespace JSC | |
123 | ||
124 | #endif // ENABLE(JIT) | |
125 | ||
126 | #endif // GCAwareJITStubRoutine_h | |
127 |