blob: f779a23aacc6702d4575c73442ceb1d457119408 [file] [log] [blame]
kasperl@chromium.orgb9123622008-09-17 14:05:56 +00001// Copyright 2008 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28#ifndef V8_COMPILATION_CACHE_H_
29#define V8_COMPILATION_CACHE_H_
30
kasperl@chromium.org71affb52009-05-26 05:44:31 +000031namespace v8 {
32namespace internal {
kasperl@chromium.orgb9123622008-09-17 14:05:56 +000033
34
ricow@chromium.orgc9c80822010-04-21 08:22:37 +000035// The compilation cache keeps shared function infos for compiled
36// scripts and evals. The shared function infos are looked up using
37// the source string as the key. For regular expressions the
38// compilation data is cached.
kasperl@chromium.orgb9123622008-09-17 14:05:56 +000039class CompilationCache {
40 public:
ricow@chromium.orgc9c80822010-04-21 08:22:37 +000041 // Finds the script shared function info for a source
kasperl@chromium.orgb9123622008-09-17 14:05:56 +000042 // string. Returns an empty handle if the cache doesn't contain a
43 // script for the given source string with the right origin.
kmillikin@chromium.org5d8f0e62010-03-24 08:21:20 +000044 static Handle<SharedFunctionInfo> LookupScript(Handle<String> source,
45 Handle<Object> name,
46 int line_offset,
47 int column_offset);
kasperl@chromium.orgb9123622008-09-17 14:05:56 +000048
ricow@chromium.orgc9c80822010-04-21 08:22:37 +000049 // Finds the shared function info for a source string for eval in a
ager@chromium.org381abbb2009-02-25 13:23:22 +000050 // given context. Returns an empty handle if the cache doesn't
51 // contain a script for the given source string.
kmillikin@chromium.org5d8f0e62010-03-24 08:21:20 +000052 static Handle<SharedFunctionInfo> LookupEval(Handle<String> source,
53 Handle<Context> context,
ricow@chromium.org83aa5492011-02-07 12:42:56 +000054 bool is_global,
55 StrictModeFlag strict_mode);
kasperl@chromium.orgb9123622008-09-17 14:05:56 +000056
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +000057 // Returns the regexp data associated with the given regexp if it
58 // is in cache, otherwise an empty handle.
59 static Handle<FixedArray> LookupRegExp(Handle<String> source,
60 JSRegExp::Flags flags);
61
ricow@chromium.orgc9c80822010-04-21 08:22:37 +000062 // Associate the (source, kind) pair to the shared function
63 // info. This may overwrite an existing mapping.
kasperl@chromium.org7be3c992009-03-12 07:19:55 +000064 static void PutScript(Handle<String> source,
kmillikin@chromium.org5d8f0e62010-03-24 08:21:20 +000065 Handle<SharedFunctionInfo> function_info);
kasperl@chromium.org7be3c992009-03-12 07:19:55 +000066
67 // Associate the (source, context->closure()->shared(), kind) triple
ricow@chromium.orgc9c80822010-04-21 08:22:37 +000068 // with the shared function info. This may overwrite an existing mapping.
kasperl@chromium.org7be3c992009-03-12 07:19:55 +000069 static void PutEval(Handle<String> source,
70 Handle<Context> context,
ager@chromium.org5aa501c2009-06-23 07:57:28 +000071 bool is_global,
kmillikin@chromium.org5d8f0e62010-03-24 08:21:20 +000072 Handle<SharedFunctionInfo> function_info);
kasperl@chromium.org7be3c992009-03-12 07:19:55 +000073
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +000074 // Associate the (source, flags) pair to the given regexp data.
75 // This may overwrite an existing mapping.
76 static void PutRegExp(Handle<String> source,
77 JSRegExp::Flags flags,
78 Handle<FixedArray> data);
79
kasperl@chromium.orga5551262010-12-07 12:49:48 +000080 // Support for eager optimization tracking.
81 static bool ShouldOptimizeEagerly(Handle<JSFunction> function);
82 static void MarkForEagerOptimizing(Handle<JSFunction> function);
83 static void MarkForLazyOptimizing(Handle<JSFunction> function);
84
85 // Reset the eager optimization tracking data.
86 static void ResetEagerOptimizingData();
87
kasperl@chromium.orgb9123622008-09-17 14:05:56 +000088 // Clear the cache - also used to initialize the cache at startup.
89 static void Clear();
90
kasperl@chromium.orga5551262010-12-07 12:49:48 +000091 // Remove given shared function info from all caches.
92 static void Remove(Handle<SharedFunctionInfo> function_info);
93
kasperl@chromium.orgb9123622008-09-17 14:05:56 +000094 // GC support.
95 static void Iterate(ObjectVisitor* v);
ricow@chromium.org0b9f8502010-08-18 07:45:01 +000096 static void IterateFunctions(ObjectVisitor* v);
kasperl@chromium.orgb9123622008-09-17 14:05:56 +000097
98 // Notify the cache that a mark-sweep garbage collection is about to
99 // take place. This is used to retire entries from the cache to
kasperl@chromium.orgb3284ad2009-05-18 06:12:45 +0000100 // avoid keeping them alive too long without using them.
101 static void MarkCompactPrologue();
kasperl@chromium.org71affb52009-05-26 05:44:31 +0000102
103 // Enable/disable compilation cache. Used by debugger to disable compilation
104 // cache during debugging to make sure new scripts are always compiled.
105 static void Enable();
106 static void Disable();
kasperl@chromium.orgb9123622008-09-17 14:05:56 +0000107};
108
109
110} } // namespace v8::internal
111
112#endif // V8_COMPILATION_CACHE_H_