| 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/compilation-cache.h" | 5 #include "src/compilation-cache.h" |
| 6 | 6 |
| 7 #include "src/assembler.h" | 7 #include "src/assembler.h" |
| 8 #include "src/counters.h" | 8 #include "src/counters.h" |
| 9 #include "src/factory.h" | 9 #include "src/factory.h" |
| 10 #include "src/objects-inl.h" | 10 #include "src/objects-inl.h" |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 } | 137 } |
| 138 | 138 |
| 139 | 139 |
| 140 // TODO(245): Need to allow identical code from different contexts to | 140 // TODO(245): Need to allow identical code from different contexts to |
| 141 // be cached in the same script generation. Currently the first use | 141 // be cached in the same script generation. Currently the first use |
| 142 // will be cached, but subsequent code from different source / line | 142 // will be cached, but subsequent code from different source / line |
| 143 // won't. | 143 // won't. |
| 144 Handle<SharedFunctionInfo> CompilationCacheScript::Lookup( | 144 Handle<SharedFunctionInfo> CompilationCacheScript::Lookup( |
| 145 Handle<String> source, Handle<Object> name, int line_offset, | 145 Handle<String> source, Handle<Object> name, int line_offset, |
| 146 int column_offset, ScriptOriginOptions resource_options, | 146 int column_offset, ScriptOriginOptions resource_options, |
| 147 Handle<Context> context, LanguageMode language_mode) { | 147 Handle<Context> context, LanguageMode language_mode, bool is_module) { |
| 148 Object* result = NULL; | 148 Object* result = NULL; |
| 149 int generation; | 149 int generation; |
| 150 | 150 |
| 151 // Probe the script generation tables. Make sure not to leak handles | 151 // Probe the script generation tables. Make sure not to leak handles |
| 152 // into the caller's handle scope. | 152 // into the caller's handle scope. |
| 153 { HandleScope scope(isolate()); | 153 { HandleScope scope(isolate()); |
| 154 for (generation = 0; generation < generations(); generation++) { | 154 for (generation = 0; generation < generations(); generation++) { |
| 155 Handle<CompilationCacheTable> table = GetTable(generation); | 155 Handle<CompilationCacheTable> table = GetTable(generation); |
| 156 Handle<Object> probe = table->Lookup(source, context, language_mode); | 156 Handle<Object> probe = |
| 157 table->Lookup(source, context, language_mode, is_module); |
| 157 if (probe->IsSharedFunctionInfo()) { | 158 if (probe->IsSharedFunctionInfo()) { |
| 158 Handle<SharedFunctionInfo> function_info = | 159 Handle<SharedFunctionInfo> function_info = |
| 159 Handle<SharedFunctionInfo>::cast(probe); | 160 Handle<SharedFunctionInfo>::cast(probe); |
| 160 // Break when we've found a suitable shared function info that | 161 // Break when we've found a suitable shared function info that |
| 161 // matches the origin. | 162 // matches the origin. |
| 162 if (HasOrigin(function_info, name, line_offset, column_offset, | 163 if (HasOrigin(function_info, name, line_offset, column_offset, |
| 163 resource_options)) { | 164 resource_options)) { |
| 164 result = *function_info; | 165 result = *function_info; |
| 165 break; | 166 break; |
| 166 } | 167 } |
| 167 } | 168 } |
| 168 } | 169 } |
| 169 } | 170 } |
| 170 | 171 |
| 171 // Once outside the manacles of the handle scope, we need to recheck | 172 // Once outside the manacles of the handle scope, we need to recheck |
| 172 // to see if we actually found a cached script. If so, we return a | 173 // to see if we actually found a cached script. If so, we return a |
| 173 // handle created in the caller's handle scope. | 174 // handle created in the caller's handle scope. |
| 174 if (result != NULL) { | 175 if (result != NULL) { |
| 175 Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(result), | 176 Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(result), |
| 176 isolate()); | 177 isolate()); |
| 177 DCHECK( | 178 DCHECK( |
| 178 HasOrigin(shared, name, line_offset, column_offset, resource_options)); | 179 HasOrigin(shared, name, line_offset, column_offset, resource_options)); |
| 179 // If the script was found in a later generation, we promote it to | 180 // If the script was found in a later generation, we promote it to |
| 180 // the first generation to let it survive longer in the cache. | 181 // the first generation to let it survive longer in the cache. |
| 181 if (generation != 0) Put(source, context, language_mode, shared); | 182 if (generation != 0) Put(source, context, language_mode, is_module, shared); |
| 182 isolate()->counters()->compilation_cache_hits()->Increment(); | 183 isolate()->counters()->compilation_cache_hits()->Increment(); |
| 183 return shared; | 184 return shared; |
| 184 } else { | 185 } else { |
| 185 isolate()->counters()->compilation_cache_misses()->Increment(); | 186 isolate()->counters()->compilation_cache_misses()->Increment(); |
| 186 return Handle<SharedFunctionInfo>::null(); | 187 return Handle<SharedFunctionInfo>::null(); |
| 187 } | 188 } |
| 188 } | 189 } |
| 189 | 190 |
| 190 | 191 void CompilationCacheScript::Put(Handle<String> source, Handle<Context> context, |
| 191 void CompilationCacheScript::Put(Handle<String> source, | 192 LanguageMode language_mode, bool is_module, |
| 192 Handle<Context> context, | |
| 193 LanguageMode language_mode, | |
| 194 Handle<SharedFunctionInfo> function_info) { | 193 Handle<SharedFunctionInfo> function_info) { |
| 195 HandleScope scope(isolate()); | 194 HandleScope scope(isolate()); |
| 196 Handle<CompilationCacheTable> table = GetFirstTable(); | 195 Handle<CompilationCacheTable> table = GetFirstTable(); |
| 197 SetFirstTable(CompilationCacheTable::Put(table, source, context, | 196 SetFirstTable(CompilationCacheTable::Put( |
| 198 language_mode, function_info)); | 197 table, source, context, language_mode, is_module, function_info)); |
| 199 } | 198 } |
| 200 | 199 |
| 201 | 200 |
| 202 MaybeHandle<SharedFunctionInfo> CompilationCacheEval::Lookup( | 201 MaybeHandle<SharedFunctionInfo> CompilationCacheEval::Lookup( |
| 203 Handle<String> source, Handle<SharedFunctionInfo> outer_info, | 202 Handle<String> source, Handle<SharedFunctionInfo> outer_info, |
| 204 LanguageMode language_mode, int scope_position) { | 203 LanguageMode language_mode, int scope_position) { |
| 205 HandleScope scope(isolate()); | 204 HandleScope scope(isolate()); |
| 206 // Make sure not to leak the table into the surrounding handle | 205 // Make sure not to leak the table into the surrounding handle |
| 207 // scope. Otherwise, we risk keeping old tables around even after | 206 // scope. Otherwise, we risk keeping old tables around even after |
| 208 // having cleared the cache. | 207 // having cleared the cache. |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 | 278 |
| 280 | 279 |
| 281 void CompilationCache::Remove(Handle<SharedFunctionInfo> function_info) { | 280 void CompilationCache::Remove(Handle<SharedFunctionInfo> function_info) { |
| 282 if (!IsEnabled()) return; | 281 if (!IsEnabled()) return; |
| 283 | 282 |
| 284 eval_global_.Remove(function_info); | 283 eval_global_.Remove(function_info); |
| 285 eval_contextual_.Remove(function_info); | 284 eval_contextual_.Remove(function_info); |
| 286 script_.Remove(function_info); | 285 script_.Remove(function_info); |
| 287 } | 286 } |
| 288 | 287 |
| 289 | |
| 290 MaybeHandle<SharedFunctionInfo> CompilationCache::LookupScript( | 288 MaybeHandle<SharedFunctionInfo> CompilationCache::LookupScript( |
| 291 Handle<String> source, Handle<Object> name, int line_offset, | 289 Handle<String> source, Handle<Object> name, int line_offset, |
| 292 int column_offset, ScriptOriginOptions resource_options, | 290 int column_offset, ScriptOriginOptions resource_options, |
| 293 Handle<Context> context, LanguageMode language_mode) { | 291 Handle<Context> context, LanguageMode language_mode, bool is_script) { |
| 294 if (!IsEnabled()) return MaybeHandle<SharedFunctionInfo>(); | 292 if (!IsEnabled()) return MaybeHandle<SharedFunctionInfo>(); |
| 295 | 293 |
| 296 return script_.Lookup(source, name, line_offset, column_offset, | 294 return script_.Lookup(source, name, line_offset, column_offset, |
| 297 resource_options, context, language_mode); | 295 resource_options, context, language_mode, is_script); |
| 298 } | 296 } |
| 299 | 297 |
| 300 | 298 |
| 301 MaybeHandle<SharedFunctionInfo> CompilationCache::LookupEval( | 299 MaybeHandle<SharedFunctionInfo> CompilationCache::LookupEval( |
| 302 Handle<String> source, Handle<SharedFunctionInfo> outer_info, | 300 Handle<String> source, Handle<SharedFunctionInfo> outer_info, |
| 303 Handle<Context> context, LanguageMode language_mode, int scope_position) { | 301 Handle<Context> context, LanguageMode language_mode, int scope_position) { |
| 304 if (!IsEnabled()) return MaybeHandle<SharedFunctionInfo>(); | 302 if (!IsEnabled()) return MaybeHandle<SharedFunctionInfo>(); |
| 305 | 303 |
| 306 MaybeHandle<SharedFunctionInfo> result; | 304 MaybeHandle<SharedFunctionInfo> result; |
| 307 if (context->IsNativeContext()) { | 305 if (context->IsNativeContext()) { |
| 308 result = | 306 result = |
| 309 eval_global_.Lookup(source, outer_info, language_mode, scope_position); | 307 eval_global_.Lookup(source, outer_info, language_mode, scope_position); |
| 310 } else { | 308 } else { |
| 311 DCHECK(scope_position != RelocInfo::kNoPosition); | 309 DCHECK(scope_position != RelocInfo::kNoPosition); |
| 312 result = eval_contextual_.Lookup(source, outer_info, language_mode, | 310 result = eval_contextual_.Lookup(source, outer_info, language_mode, |
| 313 scope_position); | 311 scope_position); |
| 314 } | 312 } |
| 315 return result; | 313 return result; |
| 316 } | 314 } |
| 317 | 315 |
| 318 | 316 |
| 319 MaybeHandle<FixedArray> CompilationCache::LookupRegExp(Handle<String> source, | 317 MaybeHandle<FixedArray> CompilationCache::LookupRegExp(Handle<String> source, |
| 320 JSRegExp::Flags flags) { | 318 JSRegExp::Flags flags) { |
| 321 if (!IsEnabled()) return MaybeHandle<FixedArray>(); | 319 if (!IsEnabled()) return MaybeHandle<FixedArray>(); |
| 322 | 320 |
| 323 return reg_exp_.Lookup(source, flags); | 321 return reg_exp_.Lookup(source, flags); |
| 324 } | 322 } |
| 325 | 323 |
| 326 | 324 void CompilationCache::PutScript(Handle<String> source, Handle<Context> context, |
| 327 void CompilationCache::PutScript(Handle<String> source, | 325 LanguageMode language_mode, bool is_module, |
| 328 Handle<Context> context, | |
| 329 LanguageMode language_mode, | |
| 330 Handle<SharedFunctionInfo> function_info) { | 326 Handle<SharedFunctionInfo> function_info) { |
| 331 if (!IsEnabled()) return; | 327 if (!IsEnabled()) return; |
| 332 | 328 |
| 333 script_.Put(source, context, language_mode, function_info); | 329 script_.Put(source, context, language_mode, is_module, function_info); |
| 334 } | 330 } |
| 335 | 331 |
| 336 | 332 |
| 337 void CompilationCache::PutEval(Handle<String> source, | 333 void CompilationCache::PutEval(Handle<String> source, |
| 338 Handle<SharedFunctionInfo> outer_info, | 334 Handle<SharedFunctionInfo> outer_info, |
| 339 Handle<Context> context, | 335 Handle<Context> context, |
| 340 Handle<SharedFunctionInfo> function_info, | 336 Handle<SharedFunctionInfo> function_info, |
| 341 int scope_position) { | 337 int scope_position) { |
| 342 if (!IsEnabled()) return; | 338 if (!IsEnabled()) return; |
| 343 | 339 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 | 393 |
| 398 | 394 |
| 399 void CompilationCache::Disable() { | 395 void CompilationCache::Disable() { |
| 400 enabled_ = false; | 396 enabled_ = false; |
| 401 Clear(); | 397 Clear(); |
| 402 } | 398 } |
| 403 | 399 |
| 404 | 400 |
| 405 } // namespace internal | 401 } // namespace internal |
| 406 } // namespace v8 | 402 } // namespace v8 |
| OLD | NEW |