OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 2939 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2950 | 2950 |
2951 CONVERT_ARG_HANDLE_CHECKED(JSFunction, target, 0); | 2951 CONVERT_ARG_HANDLE_CHECKED(JSFunction, target, 0); |
2952 Handle<Object> code = args.at<Object>(1); | 2952 Handle<Object> code = args.at<Object>(1); |
2953 | 2953 |
2954 if (code->IsNull()) return *target; | 2954 if (code->IsNull()) return *target; |
2955 RUNTIME_ASSERT(code->IsJSFunction()); | 2955 RUNTIME_ASSERT(code->IsJSFunction()); |
2956 Handle<JSFunction> source = Handle<JSFunction>::cast(code); | 2956 Handle<JSFunction> source = Handle<JSFunction>::cast(code); |
2957 Handle<SharedFunctionInfo> target_shared(target->shared()); | 2957 Handle<SharedFunctionInfo> target_shared(target->shared()); |
2958 Handle<SharedFunctionInfo> source_shared(source->shared()); | 2958 Handle<SharedFunctionInfo> source_shared(source->shared()); |
2959 | 2959 |
2960 if (!JSFunction::EnsureCompiled(source, KEEP_EXCEPTION)) { | 2960 if (!Compiler::EnsureCompiled(source, KEEP_EXCEPTION)) { |
2961 return Failure::Exception(); | 2961 return Failure::Exception(); |
2962 } | 2962 } |
2963 | 2963 |
2964 // Mark both, the source and the target, as un-flushable because the | 2964 // Mark both, the source and the target, as un-flushable because the |
2965 // shared unoptimized code makes them impossible to enqueue in a list. | 2965 // shared unoptimized code makes them impossible to enqueue in a list. |
2966 ASSERT(target_shared->code()->gc_metadata() == NULL); | 2966 ASSERT(target_shared->code()->gc_metadata() == NULL); |
2967 ASSERT(source_shared->code()->gc_metadata() == NULL); | 2967 ASSERT(source_shared->code()->gc_metadata() == NULL); |
2968 target_shared->set_dont_flush(true); | 2968 target_shared->set_dont_flush(true); |
2969 source_shared->set_dont_flush(true); | 2969 source_shared->set_dont_flush(true); |
2970 | 2970 |
(...skipping 5287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8258 // ignored anyway, we use the global object as the receiver | 8258 // ignored anyway, we use the global object as the receiver |
8259 // instead of a new JSFunction object. This way, errors are | 8259 // instead of a new JSFunction object. This way, errors are |
8260 // reported the same way whether or not 'Function' is called | 8260 // reported the same way whether or not 'Function' is called |
8261 // using 'new'. | 8261 // using 'new'. |
8262 return isolate->context()->global_object(); | 8262 return isolate->context()->global_object(); |
8263 } | 8263 } |
8264 } | 8264 } |
8265 | 8265 |
8266 // The function should be compiled for the optimization hints to be | 8266 // The function should be compiled for the optimization hints to be |
8267 // available. | 8267 // available. |
8268 JSFunction::EnsureCompiled(function, CLEAR_EXCEPTION); | 8268 Compiler::EnsureCompiled(function, CLEAR_EXCEPTION); |
8269 | 8269 |
8270 Handle<SharedFunctionInfo> shared(function->shared(), isolate); | 8270 Handle<SharedFunctionInfo> shared(function->shared(), isolate); |
8271 if (!function->has_initial_map() && | 8271 if (!function->has_initial_map() && |
8272 shared->IsInobjectSlackTrackingInProgress()) { | 8272 shared->IsInobjectSlackTrackingInProgress()) { |
8273 // The tracking is already in progress for another function. We can only | 8273 // The tracking is already in progress for another function. We can only |
8274 // track one initial_map at a time, so we force the completion before the | 8274 // track one initial_map at a time, so we force the completion before the |
8275 // function is called as a constructor for the first time. | 8275 // function is called as a constructor for the first time. |
8276 shared->CompleteInobjectSlackTracking(); | 8276 shared->CompleteInobjectSlackTracking(); |
8277 } | 8277 } |
8278 | 8278 |
(...skipping 11 matching lines...) Expand all Loading... |
8290 HandleScope scope(isolate); | 8290 HandleScope scope(isolate); |
8291 ASSERT(args.length() == 1); | 8291 ASSERT(args.length() == 1); |
8292 | 8292 |
8293 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 8293 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8294 function->shared()->CompleteInobjectSlackTracking(); | 8294 function->shared()->CompleteInobjectSlackTracking(); |
8295 | 8295 |
8296 return isolate->heap()->undefined_value(); | 8296 return isolate->heap()->undefined_value(); |
8297 } | 8297 } |
8298 | 8298 |
8299 | 8299 |
8300 RUNTIME_FUNCTION(MaybeObject*, Runtime_LazyCompile) { | 8300 RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileUnoptimized) { |
8301 HandleScope scope(isolate); | 8301 HandleScope scope(isolate); |
8302 ASSERT(args.length() == 1); | 8302 ASSERT(args.length() == 1); |
8303 | 8303 |
8304 Handle<JSFunction> function = args.at<JSFunction>(0); | 8304 Handle<JSFunction> function = args.at<JSFunction>(0); |
8305 #ifdef DEBUG | 8305 #ifdef DEBUG |
8306 if (FLAG_trace_lazy && !function->shared()->is_compiled()) { | 8306 if (FLAG_trace_lazy && !function->shared()->is_compiled()) { |
8307 PrintF("[lazy: "); | 8307 PrintF("[unoptimized: "); |
8308 function->PrintName(); | 8308 function->PrintName(); |
8309 PrintF("]\n"); | 8309 PrintF("]\n"); |
8310 } | 8310 } |
8311 #endif | 8311 #endif |
8312 | 8312 |
8313 // Compile the target function. | 8313 // Compile the target function. |
8314 ASSERT(!function->is_compiled()); | 8314 ASSERT(function->shared()->allows_lazy_compilation()); |
8315 if (!JSFunction::CompileLazy(function, KEEP_EXCEPTION)) { | 8315 |
8316 return Failure::Exception(); | 8316 Handle<Code> code = Compiler::GetUnoptimizedCode(function); |
8317 } | 8317 RETURN_IF_EMPTY_HANDLE(isolate, code); |
| 8318 function->ReplaceCode(*code); |
8318 | 8319 |
8319 // All done. Return the compiled code. | 8320 // All done. Return the compiled code. |
8320 ASSERT(function->is_compiled()); | 8321 ASSERT(function->is_compiled()); |
8321 return function->code(); | 8322 ASSERT(function->code()->kind() == Code::FUNCTION || |
| 8323 (FLAG_always_opt && |
| 8324 function->code()->kind() == Code::OPTIMIZED_FUNCTION)); |
| 8325 return *code; |
8322 } | 8326 } |
8323 | 8327 |
8324 | 8328 |
8325 bool AllowOptimization(Isolate* isolate, Handle<JSFunction> function) { | 8329 RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileOptimized) { |
8326 // If the function is not compiled ignore the lazy | 8330 HandleScope scope(isolate); |
8327 // recompilation. This can happen if the debugger is activated and | 8331 ASSERT(args.length() == 2); |
8328 // the function is returned to the not compiled state. | 8332 Handle<JSFunction> function = args.at<JSFunction>(0); |
8329 if (!function->shared()->is_compiled()) return false; | 8333 CONVERT_BOOLEAN_ARG_CHECKED(concurrent, 1); |
8330 | 8334 |
8331 // If the function is not optimizable or debugger is active continue using the | 8335 Handle<Code> unoptimized(function->shared()->code()); |
8332 // code from the full compiler. | 8336 if (!function->shared()->is_compiled()) { |
8333 if (!isolate->use_crankshaft() || | 8337 // If the function is not compiled, do not optimize. |
8334 function->shared()->optimization_disabled() || | 8338 // This can happen if the debugger is activated and |
8335 isolate->DebuggerHasBreakPoints()) { | 8339 // the function is returned to the not compiled state. |
| 8340 // TODO(yangguo): reconsider this. |
| 8341 function->ReplaceCode(function->shared()->code()); |
| 8342 } else if (!isolate->use_crankshaft() || |
| 8343 function->shared()->optimization_disabled() || |
| 8344 isolate->DebuggerHasBreakPoints()) { |
| 8345 // If the function is not optimizable or debugger is active continue |
| 8346 // using the code from the full compiler. |
8336 if (FLAG_trace_opt) { | 8347 if (FLAG_trace_opt) { |
8337 PrintF("[failed to optimize "); | 8348 PrintF("[failed to optimize "); |
8338 function->PrintName(); | 8349 function->PrintName(); |
8339 PrintF(": is code optimizable: %s, is debugger enabled: %s]\n", | 8350 PrintF(": is code optimizable: %s, is debugger enabled: %s]\n", |
8340 function->shared()->optimization_disabled() ? "F" : "T", | 8351 function->shared()->optimization_disabled() ? "F" : "T", |
8341 isolate->DebuggerHasBreakPoints() ? "T" : "F"); | 8352 isolate->DebuggerHasBreakPoints() ? "T" : "F"); |
8342 } | 8353 } |
8343 return false; | 8354 function->ReplaceCode(*unoptimized); |
| 8355 } else { |
| 8356 Compiler::ConcurrencyMode mode = concurrent ? Compiler::CONCURRENT |
| 8357 : Compiler::NOT_CONCURRENT; |
| 8358 Handle<Code> code = Compiler::GetOptimizedCode(function, unoptimized, mode); |
| 8359 function->ReplaceCode(code.is_null() ? *unoptimized : *code); |
8344 } | 8360 } |
8345 return true; | |
8346 } | |
8347 | 8361 |
8348 | 8362 ASSERT(function->code()->kind() == Code::FUNCTION || |
8349 RUNTIME_FUNCTION(MaybeObject*, Runtime_LazyRecompile) { | 8363 function->code()->kind() == Code::OPTIMIZED_FUNCTION || |
8350 HandleScope scope(isolate); | 8364 function->IsInOptimizationQueue()); |
8351 ASSERT(args.length() == 1); | |
8352 Handle<JSFunction> function = args.at<JSFunction>(0); | |
8353 | |
8354 if (!AllowOptimization(isolate, function)) { | |
8355 function->ReplaceCode(function->shared()->code()); | |
8356 return function->code(); | |
8357 } | |
8358 function->shared()->code()->set_profiler_ticks(0); | |
8359 if (JSFunction::CompileOptimized(function, CLEAR_EXCEPTION)) { | |
8360 return function->code(); | |
8361 } | |
8362 if (FLAG_trace_opt) { | |
8363 PrintF("[failed to optimize "); | |
8364 function->PrintName(); | |
8365 PrintF(": optimized compilation failed]\n"); | |
8366 } | |
8367 function->ReplaceCode(function->shared()->code()); | |
8368 return function->code(); | 8365 return function->code(); |
8369 } | 8366 } |
8370 | 8367 |
8371 | 8368 |
8372 RUNTIME_FUNCTION(MaybeObject*, Runtime_ConcurrentRecompile) { | |
8373 HandleScope handle_scope(isolate); | |
8374 ASSERT(args.length() == 1); | |
8375 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | |
8376 if (!AllowOptimization(isolate, function)) { | |
8377 function->ReplaceCode(function->shared()->code()); | |
8378 return isolate->heap()->undefined_value(); | |
8379 } | |
8380 Handle<Code> shared_code(function->shared()->code()); | |
8381 shared_code->set_profiler_ticks(0); | |
8382 ASSERT(isolate->concurrent_recompilation_enabled()); | |
8383 if (!Compiler::RecompileConcurrent(function, shared_code)) { | |
8384 function->ReplaceCode(*shared_code); | |
8385 } | |
8386 return isolate->heap()->undefined_value(); | |
8387 } | |
8388 | |
8389 | |
8390 class ActivationsFinder : public ThreadVisitor { | 8369 class ActivationsFinder : public ThreadVisitor { |
8391 public: | 8370 public: |
8392 Code* code_; | 8371 Code* code_; |
8393 bool has_code_activations_; | 8372 bool has_code_activations_; |
8394 | 8373 |
8395 explicit ActivationsFinder(Code* code) | 8374 explicit ActivationsFinder(Code* code) |
8396 : code_(code), | 8375 : code_(code), |
8397 has_code_activations_(false) { } | 8376 has_code_activations_(false) { } |
8398 | 8377 |
8399 void VisitThread(Isolate* isolate, ThreadLocalTop* top) { | 8378 void VisitThread(Isolate* isolate, ThreadLocalTop* top) { |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8520 ? isolate->heap()->true_value() : isolate->heap()->false_value(); | 8499 ? isolate->heap()->true_value() : isolate->heap()->false_value(); |
8521 } | 8500 } |
8522 | 8501 |
8523 | 8502 |
8524 RUNTIME_FUNCTION(MaybeObject*, Runtime_OptimizeFunctionOnNextCall) { | 8503 RUNTIME_FUNCTION(MaybeObject*, Runtime_OptimizeFunctionOnNextCall) { |
8525 HandleScope scope(isolate); | 8504 HandleScope scope(isolate); |
8526 RUNTIME_ASSERT(args.length() == 1 || args.length() == 2); | 8505 RUNTIME_ASSERT(args.length() == 1 || args.length() == 2); |
8527 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 8506 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8528 | 8507 |
8529 if (!function->IsOptimizable()) return isolate->heap()->undefined_value(); | 8508 if (!function->IsOptimizable()) return isolate->heap()->undefined_value(); |
8530 function->MarkForLazyRecompilation(); | 8509 function->MarkForOptimization(); |
8531 | 8510 |
8532 Code* unoptimized = function->shared()->code(); | 8511 Code* unoptimized = function->shared()->code(); |
8533 if (args.length() == 2 && | 8512 if (args.length() == 2 && |
8534 unoptimized->kind() == Code::FUNCTION) { | 8513 unoptimized->kind() == Code::FUNCTION) { |
8535 CONVERT_ARG_HANDLE_CHECKED(String, type, 1); | 8514 CONVERT_ARG_HANDLE_CHECKED(String, type, 1); |
8536 if (type->IsOneByteEqualTo(STATIC_ASCII_VECTOR("osr"))) { | 8515 if (type->IsOneByteEqualTo(STATIC_ASCII_VECTOR("osr"))) { |
8537 // Start patching from the currently patched loop nesting level. | 8516 // Start patching from the currently patched loop nesting level. |
8538 int current_level = unoptimized->allow_osr_at_loop_nesting_level(); | 8517 int current_level = unoptimized->allow_osr_at_loop_nesting_level(); |
8539 ASSERT(BackEdgeTable::Verify(isolate, unoptimized, current_level)); | 8518 ASSERT(BackEdgeTable::Verify(isolate, unoptimized, current_level)); |
8540 for (int i = current_level + 1; i <= Code::kMaxLoopNestingMarker; i++) { | 8519 for (int i = current_level + 1; i <= Code::kMaxLoopNestingMarker; i++) { |
8541 unoptimized->set_allow_osr_at_loop_nesting_level(i); | 8520 unoptimized->set_allow_osr_at_loop_nesting_level(i); |
8542 isolate->runtime_profiler()->AttemptOnStackReplacement(*function); | 8521 isolate->runtime_profiler()->AttemptOnStackReplacement(*function); |
8543 } | 8522 } |
8544 } else if (type->IsOneByteEqualTo(STATIC_ASCII_VECTOR("concurrent"))) { | 8523 } else if (type->IsOneByteEqualTo(STATIC_ASCII_VECTOR("concurrent"))) { |
8545 function->MarkForConcurrentRecompilation(); | 8524 function->MarkForConcurrentOptimization(); |
8546 } | 8525 } |
8547 } | 8526 } |
8548 | 8527 |
8549 return isolate->heap()->undefined_value(); | 8528 return isolate->heap()->undefined_value(); |
8550 } | 8529 } |
8551 | 8530 |
8552 | 8531 |
8553 RUNTIME_FUNCTION(MaybeObject*, Runtime_NeverOptimizeFunction) { | 8532 RUNTIME_FUNCTION(MaybeObject*, Runtime_NeverOptimizeFunction) { |
8554 HandleScope scope(isolate); | 8533 HandleScope scope(isolate); |
8555 ASSERT(args.length() == 1); | 8534 ASSERT(args.length() == 1); |
(...skipping 13 matching lines...) Expand all Loading... |
8569 bool sync_with_compiler_thread = true; | 8548 bool sync_with_compiler_thread = true; |
8570 if (args.length() == 2) { | 8549 if (args.length() == 2) { |
8571 CONVERT_ARG_HANDLE_CHECKED(String, sync, 1); | 8550 CONVERT_ARG_HANDLE_CHECKED(String, sync, 1); |
8572 if (sync->IsOneByteEqualTo(STATIC_ASCII_VECTOR("no sync"))) { | 8551 if (sync->IsOneByteEqualTo(STATIC_ASCII_VECTOR("no sync"))) { |
8573 sync_with_compiler_thread = false; | 8552 sync_with_compiler_thread = false; |
8574 } | 8553 } |
8575 } | 8554 } |
8576 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 8555 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8577 if (isolate->concurrent_recompilation_enabled() && | 8556 if (isolate->concurrent_recompilation_enabled() && |
8578 sync_with_compiler_thread) { | 8557 sync_with_compiler_thread) { |
8579 while (function->IsInRecompileQueue()) { | 8558 while (function->IsInOptimizationQueue()) { |
8580 isolate->optimizing_compiler_thread()->InstallOptimizedFunctions(); | 8559 isolate->optimizing_compiler_thread()->InstallOptimizedFunctions(); |
8581 OS::Sleep(50); | 8560 OS::Sleep(50); |
8582 } | 8561 } |
8583 } | 8562 } |
8584 if (FLAG_always_opt) { | 8563 if (FLAG_always_opt) { |
8585 // We may have always opt, but that is more best-effort than a real | 8564 // We may have always opt, but that is more best-effort than a real |
8586 // promise, so we still say "no" if it is not optimized. | 8565 // promise, so we still say "no" if it is not optimized. |
8587 return function->IsOptimized() ? Smi::FromInt(3) // 3 == "always". | 8566 return function->IsOptimized() ? Smi::FromInt(3) // 3 == "always". |
8588 : Smi::FromInt(2); // 2 == "no". | 8567 : Smi::FromInt(2); // 2 == "no". |
8589 } | 8568 } |
(...skipping 15 matching lines...) Expand all Loading... |
8605 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOptimizationCount) { | 8584 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOptimizationCount) { |
8606 HandleScope scope(isolate); | 8585 HandleScope scope(isolate); |
8607 ASSERT(args.length() == 1); | 8586 ASSERT(args.length() == 1); |
8608 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 8587 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8609 return Smi::FromInt(function->shared()->opt_count()); | 8588 return Smi::FromInt(function->shared()->opt_count()); |
8610 } | 8589 } |
8611 | 8590 |
8612 | 8591 |
8613 static bool IsSuitableForOnStackReplacement(Isolate* isolate, | 8592 static bool IsSuitableForOnStackReplacement(Isolate* isolate, |
8614 Handle<JSFunction> function, | 8593 Handle<JSFunction> function, |
8615 Handle<Code> unoptimized) { | 8594 Handle<Code> current_code) { |
8616 // Keep track of whether we've succeeded in optimizing. | 8595 // Keep track of whether we've succeeded in optimizing. |
8617 if (!isolate->use_crankshaft() || !unoptimized->optimizable()) return false; | 8596 if (!isolate->use_crankshaft() || !current_code->optimizable()) return false; |
8618 // If we are trying to do OSR when there are already optimized | 8597 // If we are trying to do OSR when there are already optimized |
8619 // activations of the function, it means (a) the function is directly or | 8598 // activations of the function, it means (a) the function is directly or |
8620 // indirectly recursive and (b) an optimized invocation has been | 8599 // indirectly recursive and (b) an optimized invocation has been |
8621 // deoptimized so that we are currently in an unoptimized activation. | 8600 // deoptimized so that we are currently in an unoptimized activation. |
8622 // Check for optimized activations of this function. | 8601 // Check for optimized activations of this function. |
8623 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) { | 8602 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) { |
8624 JavaScriptFrame* frame = it.frame(); | 8603 JavaScriptFrame* frame = it.frame(); |
8625 if (frame->is_optimized() && frame->function() == *function) return false; | 8604 if (frame->is_optimized() && frame->function() == *function) return false; |
8626 } | 8605 } |
8627 | 8606 |
8628 return true; | 8607 return true; |
8629 } | 8608 } |
8630 | 8609 |
8631 | 8610 |
8632 RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileForOnStackReplacement) { | 8611 RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileForOnStackReplacement) { |
8633 HandleScope scope(isolate); | 8612 HandleScope scope(isolate); |
8634 ASSERT(args.length() == 1); | 8613 ASSERT(args.length() == 1); |
8635 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 8614 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8636 Handle<Code> unoptimized(function->shared()->code(), isolate); | 8615 Handle<Code> caller_code(function->shared()->code()); |
| 8616 |
| 8617 // We're not prepared to handle a function with arguments object. |
| 8618 ASSERT(!function->shared()->uses_arguments()); |
8637 | 8619 |
8638 // Passing the PC in the javascript frame from the caller directly is | 8620 // Passing the PC in the javascript frame from the caller directly is |
8639 // not GC safe, so we walk the stack to get it. | 8621 // not GC safe, so we walk the stack to get it. |
8640 JavaScriptFrameIterator it(isolate); | 8622 JavaScriptFrameIterator it(isolate); |
8641 JavaScriptFrame* frame = it.frame(); | 8623 JavaScriptFrame* frame = it.frame(); |
8642 if (!unoptimized->contains(frame->pc())) { | 8624 if (!caller_code->contains(frame->pc())) { |
8643 // Code on the stack may not be the code object referenced by the shared | 8625 // Code on the stack may not be the code object referenced by the shared |
8644 // function info. It may have been replaced to include deoptimization data. | 8626 // function info. It may have been replaced to include deoptimization data. |
8645 unoptimized = Handle<Code>(frame->LookupCode()); | 8627 caller_code = Handle<Code>(frame->LookupCode()); |
8646 } | 8628 } |
8647 | 8629 |
8648 uint32_t pc_offset = static_cast<uint32_t>(frame->pc() - | 8630 uint32_t pc_offset = static_cast<uint32_t>( |
8649 unoptimized->instruction_start()); | 8631 frame->pc() - caller_code->instruction_start()); |
8650 | 8632 |
8651 #ifdef DEBUG | 8633 #ifdef DEBUG |
8652 ASSERT_EQ(frame->function(), *function); | 8634 ASSERT_EQ(frame->function(), *function); |
8653 ASSERT_EQ(frame->LookupCode(), *unoptimized); | 8635 ASSERT_EQ(frame->LookupCode(), *caller_code); |
8654 ASSERT(unoptimized->contains(frame->pc())); | 8636 ASSERT(caller_code->contains(frame->pc())); |
8655 #endif // DEBUG | 8637 #endif // DEBUG |
8656 | 8638 |
8657 // We're not prepared to handle a function with arguments object. | |
8658 ASSERT(!function->shared()->uses_arguments()); | |
8659 | 8639 |
| 8640 BailoutId ast_id = caller_code->TranslatePcOffsetToAstId(pc_offset); |
| 8641 ASSERT(!ast_id.IsNone()); |
| 8642 |
| 8643 Compiler::ConcurrencyMode mode = isolate->concurrent_osr_enabled() |
| 8644 ? Compiler::CONCURRENT : Compiler::NOT_CONCURRENT; |
8660 Handle<Code> result = Handle<Code>::null(); | 8645 Handle<Code> result = Handle<Code>::null(); |
8661 BailoutId ast_id = BailoutId::None(); | |
8662 | 8646 |
8663 if (isolate->concurrent_osr_enabled()) { | 8647 OptimizedCompileJob* job = NULL; |
8664 if (isolate->optimizing_compiler_thread()-> | 8648 if (mode == Compiler::CONCURRENT) { |
8665 IsQueuedForOSR(function, pc_offset)) { | 8649 // Gate the OSR entry with a stack check. |
8666 // Still waiting for the optimizing compiler thread to finish. Carry on. | 8650 BackEdgeTable::AddStackCheck(caller_code, pc_offset); |
| 8651 // Poll already queued compilation jobs. |
| 8652 OptimizingCompilerThread* thread = isolate->optimizing_compiler_thread(); |
| 8653 if (thread->IsQueuedForOSR(function, ast_id)) { |
8667 if (FLAG_trace_osr) { | 8654 if (FLAG_trace_osr) { |
8668 PrintF("[COSR - polling recompile tasks for "); | 8655 PrintF("[OSR - Still waiting for queued: "); |
8669 function->PrintName(); | 8656 function->PrintName(); |
8670 PrintF("]\n"); | 8657 PrintF(" at AST id %d]\n", ast_id.ToInt()); |
8671 } | 8658 } |
8672 return NULL; | 8659 return NULL; |
8673 } | 8660 } |
8674 | 8661 |
8675 RecompileJob* job = isolate->optimizing_compiler_thread()-> | 8662 job = thread->FindReadyOSRCandidate(function, ast_id); |
8676 FindReadyOSRCandidate(function, pc_offset); | 8663 } |
8677 | 8664 |
8678 if (job == NULL) { | 8665 if (job != NULL) { |
8679 if (IsSuitableForOnStackReplacement(isolate, function, unoptimized) && | 8666 if (FLAG_trace_osr) { |
8680 Compiler::RecompileConcurrent(function, unoptimized, pc_offset)) { | 8667 PrintF("[OSR - Found ready: "); |
8681 if (function->IsMarkedForLazyRecompilation() || | 8668 function->PrintName(); |
8682 function->IsMarkedForConcurrentRecompilation()) { | 8669 PrintF(" at AST id %d]\n", ast_id.ToInt()); |
8683 // Prevent regular recompilation if we queue this for OSR. | |
8684 // TODO(yangguo): remove this as soon as OSR becomes one-shot. | |
8685 function->ReplaceCode(function->shared()->code()); | |
8686 } | |
8687 return NULL; | |
8688 } | |
8689 // Fall through to the end in case of failure. | |
8690 } else { | |
8691 // TODO(titzer): don't install the OSR code into the function. | |
8692 ast_id = job->info()->osr_ast_id(); | |
8693 result = Compiler::InstallOptimizedCode(job); | |
8694 } | 8670 } |
8695 } else if (IsSuitableForOnStackReplacement(isolate, function, unoptimized)) { | 8671 result = Compiler::GetConcurrentlyOptimizedCode(job); |
8696 ast_id = unoptimized->TranslatePcOffsetToAstId(pc_offset); | 8672 } else if (result.is_null() && |
8697 ASSERT(!ast_id.IsNone()); | 8673 IsSuitableForOnStackReplacement(isolate, function, caller_code)) { |
8698 if (FLAG_trace_osr) { | 8674 if (FLAG_trace_osr) { |
8699 PrintF("[OSR - replacing at AST id %d in ", ast_id.ToInt()); | 8675 PrintF("[OSR - Compiling: "); |
8700 function->PrintName(); | 8676 function->PrintName(); |
8701 PrintF("]\n"); | 8677 PrintF(" at AST id %d]\n", ast_id.ToInt()); |
8702 } | 8678 } |
8703 // Attempt OSR compilation. | 8679 result = Compiler::GetOptimizedCode(function, caller_code, mode, ast_id); |
8704 result = JSFunction::CompileOsr(function, ast_id, CLEAR_EXCEPTION); | 8680 if (result.is_identical_to(isolate->builtins()->InOptimizationQueue())) { |
| 8681 // Optimization is queued. Return to check later. |
| 8682 return NULL; |
| 8683 } |
8705 } | 8684 } |
8706 | 8685 |
8707 // Revert the patched back edge table, regardless of whether OSR succeeds. | 8686 // Revert the patched back edge table, regardless of whether OSR succeeds. |
8708 BackEdgeTable::Revert(isolate, *unoptimized); | 8687 BackEdgeTable::Revert(isolate, *caller_code); |
8709 | 8688 |
8710 // Check whether we ended up with usable optimized code. | 8689 // Check whether we ended up with usable optimized code. |
8711 if (!result.is_null() && result->kind() == Code::OPTIMIZED_FUNCTION) { | 8690 if (!result.is_null() && result->kind() == Code::OPTIMIZED_FUNCTION) { |
8712 DeoptimizationInputData* data = | 8691 DeoptimizationInputData* data = |
8713 DeoptimizationInputData::cast(result->deoptimization_data()); | 8692 DeoptimizationInputData::cast(result->deoptimization_data()); |
8714 | 8693 |
8715 if (data->OsrPcOffset()->value() >= 0) { | 8694 if (data->OsrPcOffset()->value() >= 0) { |
8716 ASSERT(BailoutId(data->OsrAstId()->value()) == ast_id); | 8695 ASSERT(BailoutId(data->OsrAstId()->value()) == ast_id); |
8717 if (FLAG_trace_osr) { | 8696 if (FLAG_trace_osr) { |
8718 PrintF("[OSR - entry at AST id %d, offset %d in optimized code]\n", | 8697 PrintF("[OSR - Entry at AST id %d, offset %d in optimized code]\n", |
8719 ast_id.ToInt(), data->OsrPcOffset()->value()); | 8698 ast_id.ToInt(), data->OsrPcOffset()->value()); |
8720 } | 8699 } |
8721 // TODO(titzer): this is a massive hack to make the deopt counts | 8700 // TODO(titzer): this is a massive hack to make the deopt counts |
8722 // match. Fix heuristics for reenabling optimizations! | 8701 // match. Fix heuristics for reenabling optimizations! |
8723 function->shared()->increment_deopt_count(); | 8702 function->shared()->increment_deopt_count(); |
| 8703 |
| 8704 // TODO(titzer): Do not install code into the function. |
| 8705 function->ReplaceCode(*result); |
8724 return *result; | 8706 return *result; |
8725 } | 8707 } |
8726 } | 8708 } |
8727 | 8709 |
| 8710 // Failed. |
8728 if (FLAG_trace_osr) { | 8711 if (FLAG_trace_osr) { |
8729 PrintF("[OSR - optimization failed for "); | 8712 PrintF("[OSR - Failed: "); |
8730 function->PrintName(); | 8713 function->PrintName(); |
8731 PrintF("]\n"); | 8714 PrintF(" at AST id %d]\n", ast_id.ToInt()); |
8732 } | 8715 } |
8733 | 8716 |
8734 if (function->IsMarkedForLazyRecompilation() || | 8717 function->ReplaceCode(function->shared()->code()); |
8735 function->IsMarkedForConcurrentRecompilation()) { | |
8736 function->ReplaceCode(function->shared()->code()); | |
8737 } | |
8738 return NULL; | 8718 return NULL; |
8739 } | 8719 } |
8740 | 8720 |
8741 | 8721 |
8742 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetAllocationTimeout) { | 8722 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetAllocationTimeout) { |
8743 SealHandleScope shs(isolate); | 8723 SealHandleScope shs(isolate); |
8744 ASSERT(args.length() == 2); | 8724 ASSERT(args.length() == 2); |
8745 #ifdef DEBUG | 8725 #ifdef DEBUG |
8746 CONVERT_SMI_ARG_CHECKED(interval, 0); | 8726 CONVERT_SMI_ARG_CHECKED(interval, 0); |
8747 CONVERT_SMI_ARG_CHECKED(timeout, 1); | 8727 CONVERT_SMI_ARG_CHECKED(timeout, 1); |
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9429 | 9409 |
9430 // First check if this is a real stack overflow. | 9410 // First check if this is a real stack overflow. |
9431 if (isolate->stack_guard()->IsStackOverflow()) { | 9411 if (isolate->stack_guard()->IsStackOverflow()) { |
9432 return isolate->StackOverflow(); | 9412 return isolate->StackOverflow(); |
9433 } | 9413 } |
9434 | 9414 |
9435 return Execution::HandleStackGuardInterrupt(isolate); | 9415 return Execution::HandleStackGuardInterrupt(isolate); |
9436 } | 9416 } |
9437 | 9417 |
9438 | 9418 |
9439 RUNTIME_FUNCTION(MaybeObject*, Runtime_TryInstallRecompiledCode) { | 9419 RUNTIME_FUNCTION(MaybeObject*, Runtime_TryInstallOptimizedCode) { |
9440 HandleScope scope(isolate); | 9420 HandleScope scope(isolate); |
9441 ASSERT(args.length() == 1); | 9421 ASSERT(args.length() == 1); |
9442 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 9422 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
9443 | 9423 |
9444 // First check if this is a real stack overflow. | 9424 // First check if this is a real stack overflow. |
9445 if (isolate->stack_guard()->IsStackOverflow()) { | 9425 if (isolate->stack_guard()->IsStackOverflow()) { |
9446 SealHandleScope shs(isolate); | 9426 SealHandleScope shs(isolate); |
9447 return isolate->StackOverflow(); | 9427 return isolate->StackOverflow(); |
9448 } | 9428 } |
9449 | 9429 |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9678 !CodeGenerationFromStringsAllowed(isolate, context)) { | 9658 !CodeGenerationFromStringsAllowed(isolate, context)) { |
9679 Handle<Object> error_message = | 9659 Handle<Object> error_message = |
9680 context->ErrorMessageForCodeGenerationFromStrings(); | 9660 context->ErrorMessageForCodeGenerationFromStrings(); |
9681 return isolate->Throw(*isolate->factory()->NewEvalError( | 9661 return isolate->Throw(*isolate->factory()->NewEvalError( |
9682 "code_gen_from_strings", HandleVector<Object>(&error_message, 1))); | 9662 "code_gen_from_strings", HandleVector<Object>(&error_message, 1))); |
9683 } | 9663 } |
9684 | 9664 |
9685 // Compile source string in the native context. | 9665 // Compile source string in the native context. |
9686 ParseRestriction restriction = function_literal_only | 9666 ParseRestriction restriction = function_literal_only |
9687 ? ONLY_SINGLE_FUNCTION_LITERAL : NO_PARSE_RESTRICTION; | 9667 ? ONLY_SINGLE_FUNCTION_LITERAL : NO_PARSE_RESTRICTION; |
9688 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( | 9668 Handle<JSFunction> fun = Compiler::GetFunctionFromEval( |
9689 source, context, true, CLASSIC_MODE, restriction, RelocInfo::kNoPosition); | 9669 source, context, CLASSIC_MODE, restriction, RelocInfo::kNoPosition); |
9690 RETURN_IF_EMPTY_HANDLE(isolate, shared); | 9670 RETURN_IF_EMPTY_HANDLE(isolate, fun); |
9691 Handle<JSFunction> fun = | |
9692 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, | |
9693 context, | |
9694 NOT_TENURED); | |
9695 return *fun; | 9671 return *fun; |
9696 } | 9672 } |
9697 | 9673 |
9698 | 9674 |
9699 static ObjectPair CompileGlobalEval(Isolate* isolate, | 9675 static ObjectPair CompileGlobalEval(Isolate* isolate, |
9700 Handle<String> source, | 9676 Handle<String> source, |
9701 Handle<Object> receiver, | 9677 Handle<Object> receiver, |
9702 LanguageMode language_mode, | 9678 LanguageMode language_mode, |
9703 int scope_position) { | 9679 int scope_position) { |
9704 Handle<Context> context = Handle<Context>(isolate->context()); | 9680 Handle<Context> context = Handle<Context>(isolate->context()); |
9705 Handle<Context> native_context = Handle<Context>(context->native_context()); | 9681 Handle<Context> native_context = Handle<Context>(context->native_context()); |
9706 | 9682 |
9707 // Check if native context allows code generation from | 9683 // Check if native context allows code generation from |
9708 // strings. Throw an exception if it doesn't. | 9684 // strings. Throw an exception if it doesn't. |
9709 if (native_context->allow_code_gen_from_strings()->IsFalse() && | 9685 if (native_context->allow_code_gen_from_strings()->IsFalse() && |
9710 !CodeGenerationFromStringsAllowed(isolate, native_context)) { | 9686 !CodeGenerationFromStringsAllowed(isolate, native_context)) { |
9711 Handle<Object> error_message = | 9687 Handle<Object> error_message = |
9712 native_context->ErrorMessageForCodeGenerationFromStrings(); | 9688 native_context->ErrorMessageForCodeGenerationFromStrings(); |
9713 isolate->Throw(*isolate->factory()->NewEvalError( | 9689 isolate->Throw(*isolate->factory()->NewEvalError( |
9714 "code_gen_from_strings", HandleVector<Object>(&error_message, 1))); | 9690 "code_gen_from_strings", HandleVector<Object>(&error_message, 1))); |
9715 return MakePair(Failure::Exception(), NULL); | 9691 return MakePair(Failure::Exception(), NULL); |
9716 } | 9692 } |
9717 | 9693 |
9718 // Deal with a normal eval call with a string argument. Compile it | 9694 // Deal with a normal eval call with a string argument. Compile it |
9719 // and return the compiled function bound in the local context. | 9695 // and return the compiled function bound in the local context. |
9720 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( | 9696 static const ParseRestriction restriction = NO_PARSE_RESTRICTION; |
9721 source, | 9697 Handle<JSFunction> compiled = Compiler::GetFunctionFromEval( |
9722 context, | 9698 source, context, language_mode, restriction, scope_position); |
9723 context->IsNativeContext(), | 9699 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, compiled, |
9724 language_mode, | |
9725 NO_PARSE_RESTRICTION, | |
9726 scope_position); | |
9727 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, shared, | |
9728 MakePair(Failure::Exception(), NULL)); | 9700 MakePair(Failure::Exception(), NULL)); |
9729 Handle<JSFunction> compiled = | |
9730 isolate->factory()->NewFunctionFromSharedFunctionInfo( | |
9731 shared, context, NOT_TENURED); | |
9732 return MakePair(*compiled, *receiver); | 9701 return MakePair(*compiled, *receiver); |
9733 } | 9702 } |
9734 | 9703 |
9735 | 9704 |
9736 RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEval) { | 9705 RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEval) { |
9737 HandleScope scope(isolate); | 9706 HandleScope scope(isolate); |
9738 ASSERT(args.length() == 5); | 9707 ASSERT(args.length() == 5); |
9739 | 9708 |
9740 Handle<Object> callee = args.at<Object>(0); | 9709 Handle<Object> callee = args.at<Object>(0); |
9741 | 9710 |
(...skipping 2814 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12556 static_cast<BreakPositionAlignment>(statement_aligned_code); | 12525 static_cast<BreakPositionAlignment>(statement_aligned_code); |
12557 | 12526 |
12558 // Get the script from the script wrapper. | 12527 // Get the script from the script wrapper. |
12559 RUNTIME_ASSERT(wrapper->value()->IsScript()); | 12528 RUNTIME_ASSERT(wrapper->value()->IsScript()); |
12560 Handle<Script> script(Script::cast(wrapper->value())); | 12529 Handle<Script> script(Script::cast(wrapper->value())); |
12561 | 12530 |
12562 // Set break point. | 12531 // Set break point. |
12563 if (!isolate->debug()->SetBreakPointForScript(script, break_point_object_arg, | 12532 if (!isolate->debug()->SetBreakPointForScript(script, break_point_object_arg, |
12564 &source_position, | 12533 &source_position, |
12565 alignment)) { | 12534 alignment)) { |
12566 return isolate->heap()->undefined_value(); | 12535 return isolate->heap()->undefined_value(); |
12567 } | 12536 } |
12568 | 12537 |
12569 return Smi::FromInt(source_position); | 12538 return Smi::FromInt(source_position); |
12570 } | 12539 } |
12571 | 12540 |
12572 | 12541 |
12573 // Clear a break point | 12542 // Clear a break point |
12574 // args[0]: number: break point object | 12543 // args[0]: number: break point object |
12575 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearBreakPoint) { | 12544 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearBreakPoint) { |
12576 HandleScope scope(isolate); | 12545 HandleScope scope(isolate); |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12716 Handle<Context> context, | 12685 Handle<Context> context, |
12717 Handle<Object> context_extension, | 12686 Handle<Object> context_extension, |
12718 Handle<Object> receiver, | 12687 Handle<Object> receiver, |
12719 Handle<String> source) { | 12688 Handle<String> source) { |
12720 if (context_extension->IsJSObject()) { | 12689 if (context_extension->IsJSObject()) { |
12721 Handle<JSObject> extension = Handle<JSObject>::cast(context_extension); | 12690 Handle<JSObject> extension = Handle<JSObject>::cast(context_extension); |
12722 Handle<JSFunction> closure(context->closure(), isolate); | 12691 Handle<JSFunction> closure(context->closure(), isolate); |
12723 context = isolate->factory()->NewWithContext(closure, context, extension); | 12692 context = isolate->factory()->NewWithContext(closure, context, extension); |
12724 } | 12693 } |
12725 | 12694 |
12726 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( | 12695 Handle<JSFunction> eval_fun = |
12727 source, | 12696 Compiler::GetFunctionFromEval(source, |
12728 context, | 12697 context, |
12729 context->IsNativeContext(), | 12698 CLASSIC_MODE, |
12730 CLASSIC_MODE, | 12699 NO_PARSE_RESTRICTION, |
12731 NO_PARSE_RESTRICTION, | 12700 RelocInfo::kNoPosition); |
12732 RelocInfo::kNoPosition); | 12701 RETURN_IF_EMPTY_HANDLE(isolate, eval_fun); |
12733 RETURN_IF_EMPTY_HANDLE(isolate, shared); | |
12734 | 12702 |
12735 Handle<JSFunction> eval_fun = | |
12736 isolate->factory()->NewFunctionFromSharedFunctionInfo( | |
12737 shared, context, NOT_TENURED); | |
12738 bool pending_exception; | 12703 bool pending_exception; |
12739 Handle<Object> result = Execution::Call( | 12704 Handle<Object> result = Execution::Call( |
12740 isolate, eval_fun, receiver, 0, NULL, &pending_exception); | 12705 isolate, eval_fun, receiver, 0, NULL, &pending_exception); |
12741 | 12706 |
12742 if (pending_exception) return Failure::Exception(); | 12707 if (pending_exception) return Failure::Exception(); |
12743 | 12708 |
12744 // Skip the global proxy as it has no properties and always delegates to the | 12709 // Skip the global proxy as it has no properties and always delegates to the |
12745 // real global object. | 12710 // real global object. |
12746 if (result->IsJSGlobalProxy()) { | 12711 if (result->IsJSGlobalProxy()) { |
12747 result = Handle<JSObject>(JSObject::cast(result->GetPrototype(isolate))); | 12712 result = Handle<JSObject>(JSObject::cast(result->GetPrototype(isolate))); |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13143 return isolate->heap()->undefined_value(); | 13108 return isolate->heap()->undefined_value(); |
13144 } | 13109 } |
13145 | 13110 |
13146 | 13111 |
13147 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugDisassembleFunction) { | 13112 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugDisassembleFunction) { |
13148 HandleScope scope(isolate); | 13113 HandleScope scope(isolate); |
13149 #ifdef DEBUG | 13114 #ifdef DEBUG |
13150 ASSERT(args.length() == 1); | 13115 ASSERT(args.length() == 1); |
13151 // Get the function and make sure it is compiled. | 13116 // Get the function and make sure it is compiled. |
13152 CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0); | 13117 CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0); |
13153 if (!JSFunction::EnsureCompiled(func, KEEP_EXCEPTION)) { | 13118 if (!Compiler::EnsureCompiled(func, KEEP_EXCEPTION)) { |
13154 return Failure::Exception(); | 13119 return Failure::Exception(); |
13155 } | 13120 } |
13156 func->code()->PrintLn(); | 13121 func->code()->PrintLn(); |
13157 #endif // DEBUG | 13122 #endif // DEBUG |
13158 return isolate->heap()->undefined_value(); | 13123 return isolate->heap()->undefined_value(); |
13159 } | 13124 } |
13160 | 13125 |
13161 | 13126 |
13162 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugDisassembleConstructor) { | 13127 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugDisassembleConstructor) { |
13163 HandleScope scope(isolate); | 13128 HandleScope scope(isolate); |
13164 #ifdef DEBUG | 13129 #ifdef DEBUG |
13165 ASSERT(args.length() == 1); | 13130 ASSERT(args.length() == 1); |
13166 // Get the function and make sure it is compiled. | 13131 // Get the function and make sure it is compiled. |
13167 CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0); | 13132 CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0); |
13168 if (!JSFunction::EnsureCompiled(func, KEEP_EXCEPTION)) { | 13133 if (!Compiler::EnsureCompiled(func, KEEP_EXCEPTION)) { |
13169 return Failure::Exception(); | 13134 return Failure::Exception(); |
13170 } | 13135 } |
13171 func->shared()->construct_stub()->PrintLn(); | 13136 func->shared()->construct_stub()->PrintLn(); |
13172 #endif // DEBUG | 13137 #endif // DEBUG |
13173 return isolate->heap()->undefined_value(); | 13138 return isolate->heap()->undefined_value(); |
13174 } | 13139 } |
13175 | 13140 |
13176 | 13141 |
13177 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetInferredName) { | 13142 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetInferredName) { |
13178 SealHandleScope shs(isolate); | 13143 SealHandleScope shs(isolate); |
(...skipping 1714 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14893 // Handle last resort GC and make sure to allow future allocations | 14858 // Handle last resort GC and make sure to allow future allocations |
14894 // to grow the heap without causing GCs (if possible). | 14859 // to grow the heap without causing GCs (if possible). |
14895 isolate->counters()->gc_last_resort_from_js()->Increment(); | 14860 isolate->counters()->gc_last_resort_from_js()->Increment(); |
14896 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 14861 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
14897 "Runtime::PerformGC"); | 14862 "Runtime::PerformGC"); |
14898 } | 14863 } |
14899 } | 14864 } |
14900 | 14865 |
14901 | 14866 |
14902 } } // namespace v8::internal | 14867 } } // namespace v8::internal |
OLD | NEW |