| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/assembler.h" | 7 #include "src/assembler.h" |
| 8 #include "src/compilation-cache.h" | 8 #include "src/compilation-cache.h" |
| 9 #include "src/serialize.h" | 9 #include "src/serialize.h" |
| 10 | 10 |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 } | 140 } |
| 141 | 141 |
| 142 | 142 |
| 143 // TODO(245): Need to allow identical code from different contexts to | 143 // TODO(245): Need to allow identical code from different contexts to |
| 144 // be cached in the same script generation. Currently the first use | 144 // be cached in the same script generation. Currently the first use |
| 145 // will be cached, but subsequent code from different source / line | 145 // will be cached, but subsequent code from different source / line |
| 146 // won't. | 146 // won't. |
| 147 Handle<SharedFunctionInfo> CompilationCacheScript::Lookup( | 147 Handle<SharedFunctionInfo> CompilationCacheScript::Lookup( |
| 148 Handle<String> source, Handle<Object> name, int line_offset, | 148 Handle<String> source, Handle<Object> name, int line_offset, |
| 149 int column_offset, bool is_embedder_debug_script, | 149 int column_offset, bool is_embedder_debug_script, |
| 150 bool is_shared_cross_origin, Handle<Context> context) { | 150 bool is_shared_cross_origin, Handle<Context> context, |
| 151 LanguageMode language_mode) { |
| 151 Object* result = NULL; | 152 Object* result = NULL; |
| 152 int generation; | 153 int generation; |
| 153 | 154 |
| 154 // Probe the script generation tables. Make sure not to leak handles | 155 // Probe the script generation tables. Make sure not to leak handles |
| 155 // into the caller's handle scope. | 156 // into the caller's handle scope. |
| 156 { HandleScope scope(isolate()); | 157 { HandleScope scope(isolate()); |
| 157 for (generation = 0; generation < generations(); generation++) { | 158 for (generation = 0; generation < generations(); generation++) { |
| 158 Handle<CompilationCacheTable> table = GetTable(generation); | 159 Handle<CompilationCacheTable> table = GetTable(generation); |
| 159 Handle<Object> probe = table->Lookup(source, context); | 160 Handle<Object> probe = table->Lookup(source, context, language_mode); |
| 160 if (probe->IsSharedFunctionInfo()) { | 161 if (probe->IsSharedFunctionInfo()) { |
| 161 Handle<SharedFunctionInfo> function_info = | 162 Handle<SharedFunctionInfo> function_info = |
| 162 Handle<SharedFunctionInfo>::cast(probe); | 163 Handle<SharedFunctionInfo>::cast(probe); |
| 163 // Break when we've found a suitable shared function info that | 164 // Break when we've found a suitable shared function info that |
| 164 // matches the origin. | 165 // matches the origin. |
| 165 if (HasOrigin(function_info, name, line_offset, column_offset, | 166 if (HasOrigin(function_info, name, line_offset, column_offset, |
| 166 is_embedder_debug_script, is_shared_cross_origin)) { | 167 is_embedder_debug_script, is_shared_cross_origin)) { |
| 167 result = *function_info; | 168 result = *function_info; |
| 168 break; | 169 break; |
| 169 } | 170 } |
| 170 } | 171 } |
| 171 } | 172 } |
| 172 } | 173 } |
| 173 | 174 |
| 174 // Once outside the manacles of the handle scope, we need to recheck | 175 // Once outside the manacles of the handle scope, we need to recheck |
| 175 // to see if we actually found a cached script. If so, we return a | 176 // to see if we actually found a cached script. If so, we return a |
| 176 // handle created in the caller's handle scope. | 177 // handle created in the caller's handle scope. |
| 177 if (result != NULL) { | 178 if (result != NULL) { |
| 178 Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(result), | 179 Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(result), |
| 179 isolate()); | 180 isolate()); |
| 180 DCHECK(HasOrigin(shared, name, line_offset, column_offset, | 181 DCHECK(HasOrigin(shared, name, line_offset, column_offset, |
| 181 is_embedder_debug_script, is_shared_cross_origin)); | 182 is_embedder_debug_script, is_shared_cross_origin)); |
| 182 // If the script was found in a later generation, we promote it to | 183 // If the script was found in a later generation, we promote it to |
| 183 // the first generation to let it survive longer in the cache. | 184 // the first generation to let it survive longer in the cache. |
| 184 if (generation != 0) Put(source, context, shared); | 185 if (generation != 0) Put(source, context, language_mode, shared); |
| 185 isolate()->counters()->compilation_cache_hits()->Increment(); | 186 isolate()->counters()->compilation_cache_hits()->Increment(); |
| 186 return shared; | 187 return shared; |
| 187 } else { | 188 } else { |
| 188 isolate()->counters()->compilation_cache_misses()->Increment(); | 189 isolate()->counters()->compilation_cache_misses()->Increment(); |
| 189 return Handle<SharedFunctionInfo>::null(); | 190 return Handle<SharedFunctionInfo>::null(); |
| 190 } | 191 } |
| 191 } | 192 } |
| 192 | 193 |
| 193 | 194 |
| 194 void CompilationCacheScript::Put(Handle<String> source, | 195 void CompilationCacheScript::Put(Handle<String> source, |
| 195 Handle<Context> context, | 196 Handle<Context> context, |
| 197 LanguageMode language_mode, |
| 196 Handle<SharedFunctionInfo> function_info) { | 198 Handle<SharedFunctionInfo> function_info) { |
| 197 HandleScope scope(isolate()); | 199 HandleScope scope(isolate()); |
| 198 Handle<CompilationCacheTable> table = GetFirstTable(); | 200 Handle<CompilationCacheTable> table = GetFirstTable(); |
| 199 SetFirstTable( | 201 SetFirstTable(CompilationCacheTable::Put(table, source, context, |
| 200 CompilationCacheTable::Put(table, source, context, function_info)); | 202 language_mode, function_info)); |
| 201 } | 203 } |
| 202 | 204 |
| 203 | 205 |
| 204 MaybeHandle<SharedFunctionInfo> CompilationCacheEval::Lookup( | 206 MaybeHandle<SharedFunctionInfo> CompilationCacheEval::Lookup( |
| 205 Handle<String> source, Handle<SharedFunctionInfo> outer_info, | 207 Handle<String> source, Handle<SharedFunctionInfo> outer_info, |
| 206 LanguageMode language_mode, int scope_position) { | 208 LanguageMode language_mode, int scope_position) { |
| 207 HandleScope scope(isolate()); | 209 HandleScope scope(isolate()); |
| 208 // Make sure not to leak the table into the surrounding handle | 210 // Make sure not to leak the table into the surrounding handle |
| 209 // scope. Otherwise, we risk keeping old tables around even after | 211 // scope. Otherwise, we risk keeping old tables around even after |
| 210 // having cleared the cache. | 212 // having cleared the cache. |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 | 287 |
| 286 eval_global_.Remove(function_info); | 288 eval_global_.Remove(function_info); |
| 287 eval_contextual_.Remove(function_info); | 289 eval_contextual_.Remove(function_info); |
| 288 script_.Remove(function_info); | 290 script_.Remove(function_info); |
| 289 } | 291 } |
| 290 | 292 |
| 291 | 293 |
| 292 MaybeHandle<SharedFunctionInfo> CompilationCache::LookupScript( | 294 MaybeHandle<SharedFunctionInfo> CompilationCache::LookupScript( |
| 293 Handle<String> source, Handle<Object> name, int line_offset, | 295 Handle<String> source, Handle<Object> name, int line_offset, |
| 294 int column_offset, bool is_embedder_debug_script, | 296 int column_offset, bool is_embedder_debug_script, |
| 295 bool is_shared_cross_origin, Handle<Context> context) { | 297 bool is_shared_cross_origin, Handle<Context> context, |
| 298 LanguageMode language_mode) { |
| 296 if (!IsEnabled()) return MaybeHandle<SharedFunctionInfo>(); | 299 if (!IsEnabled()) return MaybeHandle<SharedFunctionInfo>(); |
| 297 | 300 |
| 298 return script_.Lookup(source, name, line_offset, column_offset, | 301 return script_.Lookup(source, name, line_offset, column_offset, |
| 299 is_embedder_debug_script, is_shared_cross_origin, | 302 is_embedder_debug_script, is_shared_cross_origin, |
| 300 context); | 303 context, language_mode); |
| 301 } | 304 } |
| 302 | 305 |
| 303 | 306 |
| 304 MaybeHandle<SharedFunctionInfo> CompilationCache::LookupEval( | 307 MaybeHandle<SharedFunctionInfo> CompilationCache::LookupEval( |
| 305 Handle<String> source, Handle<SharedFunctionInfo> outer_info, | 308 Handle<String> source, Handle<SharedFunctionInfo> outer_info, |
| 306 Handle<Context> context, LanguageMode language_mode, int scope_position) { | 309 Handle<Context> context, LanguageMode language_mode, int scope_position) { |
| 307 if (!IsEnabled()) return MaybeHandle<SharedFunctionInfo>(); | 310 if (!IsEnabled()) return MaybeHandle<SharedFunctionInfo>(); |
| 308 | 311 |
| 309 MaybeHandle<SharedFunctionInfo> result; | 312 MaybeHandle<SharedFunctionInfo> result; |
| 310 if (context->IsNativeContext()) { | 313 if (context->IsNativeContext()) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 322 MaybeHandle<FixedArray> CompilationCache::LookupRegExp(Handle<String> source, | 325 MaybeHandle<FixedArray> CompilationCache::LookupRegExp(Handle<String> source, |
| 323 JSRegExp::Flags flags) { | 326 JSRegExp::Flags flags) { |
| 324 if (!IsEnabled()) return MaybeHandle<FixedArray>(); | 327 if (!IsEnabled()) return MaybeHandle<FixedArray>(); |
| 325 | 328 |
| 326 return reg_exp_.Lookup(source, flags); | 329 return reg_exp_.Lookup(source, flags); |
| 327 } | 330 } |
| 328 | 331 |
| 329 | 332 |
| 330 void CompilationCache::PutScript(Handle<String> source, | 333 void CompilationCache::PutScript(Handle<String> source, |
| 331 Handle<Context> context, | 334 Handle<Context> context, |
| 335 LanguageMode language_mode, |
| 332 Handle<SharedFunctionInfo> function_info) { | 336 Handle<SharedFunctionInfo> function_info) { |
| 333 if (!IsEnabled()) return; | 337 if (!IsEnabled()) return; |
| 334 | 338 |
| 335 script_.Put(source, context, function_info); | 339 script_.Put(source, context, language_mode, function_info); |
| 336 } | 340 } |
| 337 | 341 |
| 338 | 342 |
| 339 void CompilationCache::PutEval(Handle<String> source, | 343 void CompilationCache::PutEval(Handle<String> source, |
| 340 Handle<SharedFunctionInfo> outer_info, | 344 Handle<SharedFunctionInfo> outer_info, |
| 341 Handle<Context> context, | 345 Handle<Context> context, |
| 342 Handle<SharedFunctionInfo> function_info, | 346 Handle<SharedFunctionInfo> function_info, |
| 343 int scope_position) { | 347 int scope_position) { |
| 344 if (!IsEnabled()) return; | 348 if (!IsEnabled()) return; |
| 345 | 349 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 } | 402 } |
| 399 | 403 |
| 400 | 404 |
| 401 void CompilationCache::Disable() { | 405 void CompilationCache::Disable() { |
| 402 enabled_ = false; | 406 enabled_ = false; |
| 403 Clear(); | 407 Clear(); |
| 404 } | 408 } |
| 405 | 409 |
| 406 | 410 |
| 407 } } // namespace v8::internal | 411 } } // namespace v8::internal |
| OLD | NEW |