| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 if (!name->IsString() || !script->name()->IsString()) return false; | 158 if (!name->IsString() || !script->name()->IsString()) return false; |
| 159 // Compare the two name strings for equality. | 159 // Compare the two name strings for equality. |
| 160 return String::cast(*name)->Equals(String::cast(script->name())); | 160 return String::cast(*name)->Equals(String::cast(script->name())); |
| 161 } | 161 } |
| 162 | 162 |
| 163 | 163 |
| 164 // TODO(245): Need to allow identical code from different contexts to | 164 // TODO(245): Need to allow identical code from different contexts to |
| 165 // be cached in the same script generation. Currently the first use | 165 // be cached in the same script generation. Currently the first use |
| 166 // will be cached, but subsequent code from different source / line | 166 // will be cached, but subsequent code from different source / line |
| 167 // won't. | 167 // won't. |
| 168 Handle<SharedFunctionInfo> CompilationCacheScript::Lookup(Handle<String> source, | 168 Handle<SharedFunctionInfo> CompilationCacheScript::Lookup( |
| 169 Handle<Object> name, | 169 Handle<String> source, |
| 170 int line_offset, | 170 Handle<Object> name, |
| 171 int column_offset) { | 171 int line_offset, |
| 172 int column_offset, |
| 173 Handle<Context> context) { |
| 172 Object* result = NULL; | 174 Object* result = NULL; |
| 173 int generation; | 175 int generation; |
| 174 | 176 |
| 175 // Probe the script generation tables. Make sure not to leak handles | 177 // Probe the script generation tables. Make sure not to leak handles |
| 176 // into the caller's handle scope. | 178 // into the caller's handle scope. |
| 177 { HandleScope scope(isolate()); | 179 { HandleScope scope(isolate()); |
| 178 for (generation = 0; generation < generations(); generation++) { | 180 for (generation = 0; generation < generations(); generation++) { |
| 179 Handle<CompilationCacheTable> table = GetTable(generation); | 181 Handle<CompilationCacheTable> table = GetTable(generation); |
| 180 Handle<Object> probe(table->Lookup(*source), isolate()); | 182 Handle<Object> probe(table->Lookup(*source, *context), isolate()); |
| 181 if (probe->IsSharedFunctionInfo()) { | 183 if (probe->IsSharedFunctionInfo()) { |
| 182 Handle<SharedFunctionInfo> function_info = | 184 Handle<SharedFunctionInfo> function_info = |
| 183 Handle<SharedFunctionInfo>::cast(probe); | 185 Handle<SharedFunctionInfo>::cast(probe); |
| 184 // Break when we've found a suitable shared function info that | 186 // Break when we've found a suitable shared function info that |
| 185 // matches the origin. | 187 // matches the origin. |
| 186 if (HasOrigin(function_info, name, line_offset, column_offset)) { | 188 if (HasOrigin(function_info, name, line_offset, column_offset)) { |
| 187 result = *function_info; | 189 result = *function_info; |
| 188 break; | 190 break; |
| 189 } | 191 } |
| 190 } | 192 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 207 | 209 |
| 208 // Once outside the manacles of the handle scope, we need to recheck | 210 // Once outside the manacles of the handle scope, we need to recheck |
| 209 // to see if we actually found a cached script. If so, we return a | 211 // to see if we actually found a cached script. If so, we return a |
| 210 // handle created in the caller's handle scope. | 212 // handle created in the caller's handle scope. |
| 211 if (result != NULL) { | 213 if (result != NULL) { |
| 212 Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(result), | 214 Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(result), |
| 213 isolate()); | 215 isolate()); |
| 214 ASSERT(HasOrigin(shared, name, line_offset, column_offset)); | 216 ASSERT(HasOrigin(shared, name, line_offset, column_offset)); |
| 215 // If the script was found in a later generation, we promote it to | 217 // If the script was found in a later generation, we promote it to |
| 216 // the first generation to let it survive longer in the cache. | 218 // the first generation to let it survive longer in the cache. |
| 217 if (generation != 0) Put(source, shared); | 219 if (generation != 0) Put(source, context, shared); |
| 218 isolate()->counters()->compilation_cache_hits()->Increment(); | 220 isolate()->counters()->compilation_cache_hits()->Increment(); |
| 219 return shared; | 221 return shared; |
| 220 } else { | 222 } else { |
| 221 isolate()->counters()->compilation_cache_misses()->Increment(); | 223 isolate()->counters()->compilation_cache_misses()->Increment(); |
| 222 return Handle<SharedFunctionInfo>::null(); | 224 return Handle<SharedFunctionInfo>::null(); |
| 223 } | 225 } |
| 224 } | 226 } |
| 225 | 227 |
| 226 | 228 |
| 227 MaybeObject* CompilationCacheScript::TryTablePut( | 229 MaybeObject* CompilationCacheScript::TryTablePut( |
| 228 Handle<String> source, | 230 Handle<String> source, |
| 231 Handle<Context> context, |
| 229 Handle<SharedFunctionInfo> function_info) { | 232 Handle<SharedFunctionInfo> function_info) { |
| 230 Handle<CompilationCacheTable> table = GetFirstTable(); | 233 Handle<CompilationCacheTable> table = GetFirstTable(); |
| 231 return table->Put(*source, *function_info); | 234 return table->Put(*source, *context, *function_info); |
| 232 } | 235 } |
| 233 | 236 |
| 234 | 237 |
| 235 Handle<CompilationCacheTable> CompilationCacheScript::TablePut( | 238 Handle<CompilationCacheTable> CompilationCacheScript::TablePut( |
| 236 Handle<String> source, | 239 Handle<String> source, |
| 240 Handle<Context> context, |
| 237 Handle<SharedFunctionInfo> function_info) { | 241 Handle<SharedFunctionInfo> function_info) { |
| 238 CALL_HEAP_FUNCTION(isolate(), | 242 CALL_HEAP_FUNCTION(isolate(), |
| 239 TryTablePut(source, function_info), | 243 TryTablePut(source, context, function_info), |
| 240 CompilationCacheTable); | 244 CompilationCacheTable); |
| 241 } | 245 } |
| 242 | 246 |
| 243 | 247 |
| 244 void CompilationCacheScript::Put(Handle<String> source, | 248 void CompilationCacheScript::Put(Handle<String> source, |
| 249 Handle<Context> context, |
| 245 Handle<SharedFunctionInfo> function_info) { | 250 Handle<SharedFunctionInfo> function_info) { |
| 246 HandleScope scope(isolate()); | 251 HandleScope scope(isolate()); |
| 247 SetFirstTable(TablePut(source, function_info)); | 252 SetFirstTable(TablePut(source, context, function_info)); |
| 248 } | 253 } |
| 249 | 254 |
| 250 | 255 |
| 251 Handle<SharedFunctionInfo> CompilationCacheEval::Lookup( | 256 Handle<SharedFunctionInfo> CompilationCacheEval::Lookup( |
| 252 Handle<String> source, | 257 Handle<String> source, |
| 253 Handle<Context> context, | 258 Handle<Context> context, |
| 254 LanguageMode language_mode, | 259 LanguageMode language_mode, |
| 255 int scope_position) { | 260 int scope_position) { |
| 256 // Make sure not to leak the table into the surrounding handle | 261 // Make sure not to leak the table into the surrounding handle |
| 257 // scope. Otherwise, we risk keeping old tables around even after | 262 // scope. Otherwise, we risk keeping old tables around even after |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 | 378 |
| 374 void CompilationCache::Remove(Handle<SharedFunctionInfo> function_info) { | 379 void CompilationCache::Remove(Handle<SharedFunctionInfo> function_info) { |
| 375 if (!IsEnabled()) return; | 380 if (!IsEnabled()) return; |
| 376 | 381 |
| 377 eval_global_.Remove(function_info); | 382 eval_global_.Remove(function_info); |
| 378 eval_contextual_.Remove(function_info); | 383 eval_contextual_.Remove(function_info); |
| 379 script_.Remove(function_info); | 384 script_.Remove(function_info); |
| 380 } | 385 } |
| 381 | 386 |
| 382 | 387 |
| 383 Handle<SharedFunctionInfo> CompilationCache::LookupScript(Handle<String> source, | 388 Handle<SharedFunctionInfo> CompilationCache::LookupScript( |
| 384 Handle<Object> name, | 389 Handle<String> source, |
| 385 int line_offset, | 390 Handle<Object> name, |
| 386 int column_offset) { | 391 int line_offset, |
| 392 int column_offset, |
| 393 Handle<Context> context) { |
| 387 if (!IsEnabled()) { | 394 if (!IsEnabled()) { |
| 388 return Handle<SharedFunctionInfo>::null(); | 395 return Handle<SharedFunctionInfo>::null(); |
| 389 } | 396 } |
| 390 | 397 |
| 391 return script_.Lookup(source, name, line_offset, column_offset); | 398 return script_.Lookup(source, name, line_offset, column_offset, context); |
| 392 } | 399 } |
| 393 | 400 |
| 394 | 401 |
| 395 Handle<SharedFunctionInfo> CompilationCache::LookupEval( | 402 Handle<SharedFunctionInfo> CompilationCache::LookupEval( |
| 396 Handle<String> source, | 403 Handle<String> source, |
| 397 Handle<Context> context, | 404 Handle<Context> context, |
| 398 bool is_global, | 405 bool is_global, |
| 399 LanguageMode language_mode, | 406 LanguageMode language_mode, |
| 400 int scope_position) { | 407 int scope_position) { |
| 401 if (!IsEnabled()) { | 408 if (!IsEnabled()) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 419 JSRegExp::Flags flags) { | 426 JSRegExp::Flags flags) { |
| 420 if (!IsEnabled()) { | 427 if (!IsEnabled()) { |
| 421 return Handle<FixedArray>::null(); | 428 return Handle<FixedArray>::null(); |
| 422 } | 429 } |
| 423 | 430 |
| 424 return reg_exp_.Lookup(source, flags); | 431 return reg_exp_.Lookup(source, flags); |
| 425 } | 432 } |
| 426 | 433 |
| 427 | 434 |
| 428 void CompilationCache::PutScript(Handle<String> source, | 435 void CompilationCache::PutScript(Handle<String> source, |
| 436 Handle<Context> context, |
| 429 Handle<SharedFunctionInfo> function_info) { | 437 Handle<SharedFunctionInfo> function_info) { |
| 430 if (!IsEnabled()) { | 438 if (!IsEnabled()) { |
| 431 return; | 439 return; |
| 432 } | 440 } |
| 433 | 441 |
| 434 script_.Put(source, function_info); | 442 script_.Put(source, context, function_info); |
| 435 } | 443 } |
| 436 | 444 |
| 437 | 445 |
| 438 void CompilationCache::PutEval(Handle<String> source, | 446 void CompilationCache::PutEval(Handle<String> source, |
| 439 Handle<Context> context, | 447 Handle<Context> context, |
| 440 bool is_global, | 448 bool is_global, |
| 441 Handle<SharedFunctionInfo> function_info, | 449 Handle<SharedFunctionInfo> function_info, |
| 442 int scope_position) { | 450 int scope_position) { |
| 443 if (!IsEnabled()) { | 451 if (!IsEnabled()) { |
| 444 return; | 452 return; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 } | 507 } |
| 500 | 508 |
| 501 | 509 |
| 502 void CompilationCache::Disable() { | 510 void CompilationCache::Disable() { |
| 503 enabled_ = false; | 511 enabled_ = false; |
| 504 Clear(); | 512 Clear(); |
| 505 } | 513 } |
| 506 | 514 |
| 507 | 515 |
| 508 } } // namespace v8::internal | 516 } } // namespace v8::internal |
| OLD | NEW |