]>
git.saurik.com Git - apple/javascriptcore.git/blob - runtime/FunctionHasExecutedCache.cpp
2 * Copyright (C) 2014 Apple Inc. All Rights Reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
27 #include "FunctionHasExecutedCache.h"
33 bool FunctionHasExecutedCache :: hasExecutedAtOffset ( intptr_t id
, unsigned offset
)
35 if ( m_rangeMap
. find ( id
) == m_rangeMap
. end ())
38 RangeMap
& map
= m_rangeMap
. find ( id
)-> second
;
39 unsigned distance
= UINT_MAX
;
40 bool hasExecuted
= false ;
41 for ( auto iter
= map
. begin (), end
= map
. end (); iter
!= end
; ++ iter
) {
42 const FunctionRange
& range
= iter
-> first
;
43 if ( range
. m_start
<= offset
&& offset
<= range
. m_end
&& range
. m_end
- range
. m_start
< distance
) {
44 hasExecuted
= iter
-> second
;
45 distance
= range
. m_end
- range
. m_start
;
52 void FunctionHasExecutedCache :: insertUnexecutedRange ( intptr_t id
, unsigned start
, unsigned end
)
54 if ( m_rangeMap
. find ( id
) == m_rangeMap
. end ()) {
59 RangeMap
& map
= m_rangeMap
. find ( id
)-> second
;
61 range
. m_start
= start
;
63 // Only insert unexecuted ranges once for a given sourceID because we may run into a situation where an executable executes, then is GCed, and then is allocated again,
64 // and tries to reinsert itself, claiming it has never run, but this is false because it indeed already executed.
65 if ( map
. find ( range
) == map
. end ())
69 void FunctionHasExecutedCache :: removeUnexecutedRange ( intptr_t id
, unsigned start
, unsigned end
)
71 // FIXME: We should never have an instance where we return here, but currently do in some situations. Find out why.
72 if ( m_rangeMap
. find ( id
) == m_rangeMap
. end ())
75 RangeMap
& map
= m_rangeMap
. find ( id
)-> second
;
78 range
. m_start
= start
;
83 Vector
< std :: tuple
< bool , unsigned , unsigned >> FunctionHasExecutedCache :: getFunctionRanges ( intptr_t id
)
85 Vector
< std :: tuple
< bool , unsigned , unsigned >> ranges ( 0 );
86 auto findResult
= m_rangeMap
. find ( id
);
87 if ( findResult
== m_rangeMap
. end ())
90 RangeMap
& map
= m_rangeMap
. find ( id
)-> second
;
91 for ( auto iter
= map
. begin (), end
= map
. end (); iter
!= end
; ++ iter
) {
92 const FunctionRange
& range
= iter
-> first
;
93 bool hasExecuted
= iter
-> second
;
94 ranges
. append ( std :: tuple
< bool , unsigned , unsigned >( hasExecuted
, range
. m_start
, range
. m_end
));