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 10907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10918 serialized_scope_info, scope_info, | 10918 serialized_scope_info, scope_info, |
10919 context, block_scope)) { | 10919 context, block_scope)) { |
10920 return Handle<JSObject>(); | 10920 return Handle<JSObject>(); |
10921 } | 10921 } |
10922 } | 10922 } |
10923 | 10923 |
10924 return block_scope; | 10924 return block_scope; |
10925 } | 10925 } |
10926 | 10926 |
10927 | 10927 |
10928 // Iterate over the actual scopes visible from a stack frame. All scopes are | 10928 // Iterate over the actual scopes visible from a stack frame. The iteration |
10929 // proceeds from the innermost visible nested scope outwards. All scopes are | |
10929 // backed by an actual context except the local scope, which is inserted | 10930 // backed by an actual context except the local scope, which is inserted |
10930 // "artifically" in the context chain. | 10931 // "artificially" in the context chain. |
10931 class ScopeIterator { | 10932 class ScopeIterator { |
10932 public: | 10933 public: |
10933 enum ScopeType { | 10934 enum ScopeType { |
Kevin Millikin (Chromium)
2011/10/05 08:43:36
Can this be the same as Scope::Type?
Steven
2011/10/06 19:09:27
Almost. The ScopeIterator so far makes a differenc
| |
10934 ScopeTypeGlobal = 0, | 10935 ScopeTypeGlobal = 0, |
10935 ScopeTypeLocal, | 10936 ScopeTypeLocal, |
10936 ScopeTypeWith, | 10937 ScopeTypeWith, |
10937 ScopeTypeClosure, | 10938 ScopeTypeClosure, |
10938 ScopeTypeCatch, | 10939 ScopeTypeCatch, |
10939 ScopeTypeBlock | 10940 ScopeTypeBlock |
10940 }; | 10941 }; |
10941 | 10942 |
10942 ScopeIterator(Isolate* isolate, | 10943 ScopeIterator(Isolate* isolate, |
10943 JavaScriptFrame* frame, | 10944 JavaScriptFrame* frame, |
10944 int inlined_frame_index) | 10945 int inlined_frame_index) |
10945 : isolate_(isolate), | 10946 : isolate_(isolate), |
10946 frame_(frame), | 10947 frame_(frame), |
10947 inlined_frame_index_(inlined_frame_index), | 10948 inlined_frame_index_(inlined_frame_index), |
10948 function_(JSFunction::cast(frame->function())), | 10949 function_(JSFunction::cast(frame->function())), |
10949 context_(Context::cast(frame->context())), | 10950 context_(Context::cast(frame->context())), |
10950 local_done_(false), | 10951 nested_scope_chain_(4) { |
10951 at_local_(false) { | |
10952 | 10952 |
10953 // Check whether the first scope is actually a local scope. | 10953 Handle<SerializedScopeInfo> scope_info(function_->shared()->scope_info()); |
10954 // If there is a stack slot for .result then this local scope has been | 10954 int statement_position = |
10955 // created for evaluating top level code and it is not a real local scope. | 10955 function_->shared()->code()->SourceStatementPosition(frame_->pc()); |
10956 // Checking for the existence of .result seems fragile, but the scope info | 10956 scope_info->GetNestedScopeChain(&nested_scope_chain_, statement_position); |
10957 // saved with the code object does not otherwise have that information. | |
10958 int index = function_->shared()->scope_info()-> | |
10959 StackSlotIndex(isolate_->heap()->result_symbol()); | |
10960 if (index >= 0) { | |
10961 local_done_ = true; | |
10962 } else if (context_->IsGlobalContext() || | |
10963 context_->IsFunctionContext()) { | |
10964 at_local_ = true; | |
10965 } else if (context_->closure() != *function_) { | |
10966 // The context_ is a block or with or catch block from the outer function. | |
10967 ASSERT(context_->IsWithContext() || | |
10968 context_->IsCatchContext() || | |
10969 context_->IsBlockContext()); | |
10970 at_local_ = true; | |
10971 } | |
10972 } | 10957 } |
10973 | 10958 |
10974 // More scopes? | 10959 // More scopes? |
10975 bool Done() { return context_.is_null(); } | 10960 bool Done() { return context_.is_null(); } |
10976 | 10961 |
10977 // Move to the next scope. | 10962 // Move to the next scope. |
10978 void Next() { | 10963 void Next() { |
10979 // If at a local scope mark the local scope as passed. | 10964 ScopeType scope_type = Type(); |
10980 if (at_local_) { | 10965 if (scope_type == ScopeTypeGlobal) { |
10981 at_local_ = false; | 10966 // The global scope is always the last in the chain. |
10982 local_done_ = true; | 10967 ASSERT(context_->IsGlobalContext()); |
10983 | |
10984 // If the current context is not associated with the local scope the | |
10985 // current context is the next real scope, so don't move to the next | |
10986 // context in this case. | |
10987 if (context_->closure() != *function_) { | |
10988 return; | |
10989 } | |
10990 } | |
10991 | |
10992 // The global scope is always the last in the chain. | |
10993 if (context_->IsGlobalContext()) { | |
10994 context_ = Handle<Context>(); | 10968 context_ = Handle<Context>(); |
10995 return; | 10969 return; |
10996 } | 10970 } |
10997 | 10971 if (nested_scope_chain_.is_empty()) { |
10998 // Move to the next context. | 10972 context_ = Handle<Context>(context_->previous(), isolate_); |
10999 context_ = Handle<Context>(context_->previous(), isolate_); | 10973 } else { |
11000 | 10974 if (nested_scope_chain_.last()->HasContext()) { |
11001 // If passing the local scope indicate that the current scope is now the | 10975 context_ = Handle<Context>(context_->previous(), isolate_); |
11002 // local scope. | 10976 } |
11003 if (!local_done_ && | 10977 nested_scope_chain_.RemoveLast(); |
11004 (context_->IsGlobalContext() || context_->IsFunctionContext())) { | |
11005 at_local_ = true; | |
11006 } | 10978 } |
11007 } | 10979 } |
11008 | 10980 |
11009 // Return the type of the current scope. | 10981 // Return the type of the current scope. |
11010 ScopeType Type() { | 10982 ScopeType Type() { |
11011 if (at_local_) { | 10983 if (!nested_scope_chain_.is_empty()) { |
11012 return ScopeTypeLocal; | 10984 Handle<SerializedScopeInfo> scope_info = nested_scope_chain_.last(); |
10985 switch (scope_info->ScopeType()) { | |
10986 case Scope::FUNCTION_SCOPE: | |
10987 ASSERT(context_->IsFunctionContext() || | |
10988 !scope_info->HasContext()); | |
10989 return ScopeTypeLocal; | |
10990 case Scope::GLOBAL_SCOPE: | |
10991 ASSERT(context_->IsGlobalContext()); | |
10992 return ScopeTypeGlobal; | |
10993 case Scope::WITH_SCOPE: | |
10994 ASSERT(context_->IsWithContext()); | |
10995 return ScopeTypeWith; | |
10996 case Scope::CATCH_SCOPE: | |
10997 ASSERT(context_->IsCatchContext()); | |
10998 return ScopeTypeCatch; | |
10999 case Scope::BLOCK_SCOPE: | |
11000 ASSERT(!scope_info->HasContext() || | |
11001 context_->IsBlockContext()); | |
11002 return ScopeTypeBlock; | |
11003 case Scope::EVAL_SCOPE: | |
11004 UNREACHABLE(); | |
11005 } | |
11013 } | 11006 } |
11014 if (context_->IsGlobalContext()) { | 11007 if (context_->IsGlobalContext()) { |
11015 ASSERT(context_->global()->IsGlobalObject()); | 11008 ASSERT(context_->global()->IsGlobalObject()); |
11016 return ScopeTypeGlobal; | 11009 return ScopeTypeGlobal; |
11017 } | 11010 } |
11018 if (context_->IsFunctionContext()) { | 11011 if (context_->IsFunctionContext()) { |
11019 return ScopeTypeClosure; | 11012 return ScopeTypeClosure; |
11020 } | 11013 } |
11021 if (context_->IsCatchContext()) { | 11014 if (context_->IsCatchContext()) { |
11022 return ScopeTypeCatch; | 11015 return ScopeTypeCatch; |
11023 } | 11016 } |
11024 if (context_->IsBlockContext()) { | 11017 if (context_->IsBlockContext()) { |
11025 return ScopeTypeBlock; | 11018 return ScopeTypeBlock; |
11026 } | 11019 } |
11027 ASSERT(context_->IsWithContext()); | 11020 ASSERT(context_->IsWithContext()); |
11028 return ScopeTypeWith; | 11021 return ScopeTypeWith; |
11029 } | 11022 } |
11030 | 11023 |
11031 // Return the JavaScript object with the content of the current scope. | 11024 // Return the JavaScript object with the content of the current scope. |
11032 Handle<JSObject> ScopeObject() { | 11025 Handle<JSObject> ScopeObject() { |
11033 switch (Type()) { | 11026 switch (Type()) { |
11034 case ScopeIterator::ScopeTypeGlobal: | 11027 case ScopeIterator::ScopeTypeGlobal: |
11035 return Handle<JSObject>(CurrentContext()->global()); | 11028 return Handle<JSObject>(CurrentContext()->global()); |
11036 case ScopeIterator::ScopeTypeLocal: | 11029 case ScopeIterator::ScopeTypeLocal: |
11037 // Materialize the content of the local scope into a JSObject. | 11030 // Materialize the content of the local scope into a JSObject. |
11031 ASSERT(nested_scope_chain_.length() == 1); | |
11038 return MaterializeLocalScope(isolate_, frame_, inlined_frame_index_); | 11032 return MaterializeLocalScope(isolate_, frame_, inlined_frame_index_); |
11039 case ScopeIterator::ScopeTypeWith: | 11033 case ScopeIterator::ScopeTypeWith: |
11040 // Return the with object. | 11034 // Return the with object. |
11041 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension())); | 11035 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension())); |
11042 case ScopeIterator::ScopeTypeCatch: | 11036 case ScopeIterator::ScopeTypeCatch: |
11043 return MaterializeCatchScope(isolate_, CurrentContext()); | 11037 return MaterializeCatchScope(isolate_, CurrentContext()); |
11044 case ScopeIterator::ScopeTypeClosure: | 11038 case ScopeIterator::ScopeTypeClosure: |
11045 // Materialize the content of the closure scope into a JSObject. | 11039 // Materialize the content of the closure scope into a JSObject. |
11046 return MaterializeClosure(isolate_, CurrentContext()); | 11040 return MaterializeClosure(isolate_, CurrentContext()); |
11047 case ScopeIterator::ScopeTypeBlock: | 11041 case ScopeIterator::ScopeTypeBlock: |
11048 return MaterializeBlockScope(isolate_, CurrentContext()); | 11042 return MaterializeBlockScope(isolate_, CurrentContext()); |
11049 } | 11043 } |
11050 UNREACHABLE(); | 11044 UNREACHABLE(); |
11051 return Handle<JSObject>(); | 11045 return Handle<JSObject>(); |
11052 } | 11046 } |
11053 | 11047 |
11048 Handle<SerializedScopeInfo> CurrentScopeInfo() { | |
11049 if (!nested_scope_chain_.is_empty()) { | |
11050 return nested_scope_chain_.last(); | |
11051 } else if (context_->IsBlockContext()) { | |
11052 return Handle<SerializedScopeInfo>( | |
11053 SerializedScopeInfo::cast(context_->extension())); | |
11054 } else if (context_->IsFunctionContext()) { | |
11055 return Handle<SerializedScopeInfo>( | |
11056 context_->closure()->shared()->scope_info()); | |
11057 } | |
11058 return Handle<SerializedScopeInfo>::null(); | |
11059 } | |
11060 | |
11054 // Return the context for this scope. For the local context there might not | 11061 // Return the context for this scope. For the local context there might not |
11055 // be an actual context. | 11062 // be an actual context. |
11056 Handle<Context> CurrentContext() { | 11063 Handle<Context> CurrentContext() { |
11057 if (at_local_ && context_->closure() != *function_) { | 11064 if (Type() == ScopeTypeGlobal || |
11065 nested_scope_chain_.is_empty()) { | |
11066 return context_; | |
11067 } else if (nested_scope_chain_.last()->HasContext()) { | |
11068 return context_; | |
11069 } else { | |
11058 return Handle<Context>(); | 11070 return Handle<Context>(); |
11059 } | 11071 } |
11060 return context_; | |
11061 } | 11072 } |
11062 | 11073 |
11063 #ifdef DEBUG | 11074 #ifdef DEBUG |
11064 // Debug print of the content of the current scope. | 11075 // Debug print of the content of the current scope. |
11065 void DebugPrint() { | 11076 void DebugPrint() { |
11066 switch (Type()) { | 11077 switch (Type()) { |
11067 case ScopeIterator::ScopeTypeGlobal: | 11078 case ScopeIterator::ScopeTypeGlobal: |
11068 PrintF("Global:\n"); | 11079 PrintF("Global:\n"); |
11069 CurrentContext()->Print(); | 11080 CurrentContext()->Print(); |
11070 break; | 11081 break; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11113 PrintF("\n"); | 11124 PrintF("\n"); |
11114 } | 11125 } |
11115 #endif | 11126 #endif |
11116 | 11127 |
11117 private: | 11128 private: |
11118 Isolate* isolate_; | 11129 Isolate* isolate_; |
11119 JavaScriptFrame* frame_; | 11130 JavaScriptFrame* frame_; |
11120 int inlined_frame_index_; | 11131 int inlined_frame_index_; |
11121 Handle<JSFunction> function_; | 11132 Handle<JSFunction> function_; |
11122 Handle<Context> context_; | 11133 Handle<Context> context_; |
11123 bool local_done_; | 11134 List<Handle<SerializedScopeInfo> > nested_scope_chain_; |
11124 bool at_local_; | |
11125 | 11135 |
11126 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator); | 11136 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator); |
11127 }; | 11137 }; |
11128 | 11138 |
11129 | 11139 |
11130 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeCount) { | 11140 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeCount) { |
11131 HandleScope scope(isolate); | 11141 HandleScope scope(isolate); |
11132 ASSERT(args.length() == 2); | 11142 ASSERT(args.length() == 2); |
11133 | 11143 |
11134 // Check arguments. | 11144 // Check arguments. |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11577 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearStepping) { | 11587 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearStepping) { |
11578 HandleScope scope(isolate); | 11588 HandleScope scope(isolate); |
11579 ASSERT(args.length() == 0); | 11589 ASSERT(args.length() == 0); |
11580 isolate->debug()->ClearStepping(); | 11590 isolate->debug()->ClearStepping(); |
11581 return isolate->heap()->undefined_value(); | 11591 return isolate->heap()->undefined_value(); |
11582 } | 11592 } |
11583 | 11593 |
11584 | 11594 |
11585 // Creates a copy of the with context chain. The copy of the context chain is | 11595 // Creates a copy of the with context chain. The copy of the context chain is |
11586 // is linked to the function context supplied. | 11596 // is linked to the function context supplied. |
11587 static Handle<Context> CopyWithContextChain(Isolate* isolate, | 11597 static Handle<Context> CopyNestedScopeContextChain(Isolate* isolate, |
11588 Handle<JSFunction> function, | 11598 Handle<JSFunction> function, |
11589 Handle<Context> current, | 11599 Handle<Context> base, |
11590 Handle<Context> base) { | 11600 JavaScriptFrame* frame, |
11591 // At the end of the chain. Return the base context to link to. | 11601 int inlined_frame_index) { |
11592 if (current->IsFunctionContext() || current->IsGlobalContext()) { | 11602 HandleScope scope(isolate); |
11593 return base; | 11603 List<Handle<SerializedScopeInfo> > scope_chain; |
11604 List<Handle<Context> > context_chain; | |
11605 | |
11606 ScopeIterator it(isolate, frame, inlined_frame_index); | |
11607 for (; it.Type() != ScopeIterator::ScopeTypeGlobal && | |
11608 it.Type() != ScopeIterator::ScopeTypeLocal ; it.Next()) { | |
11609 ASSERT(!it.Done()); | |
11610 scope_chain.Add(it.CurrentScopeInfo()); | |
11611 context_chain.Add(it.CurrentContext()); | |
11594 } | 11612 } |
11595 | 11613 |
11596 // Recursively copy the with and catch contexts. | 11614 // At the end of the chain. Return the base context to link to. |
11597 HandleScope scope(isolate); | 11615 Handle<Context> context = base; |
11598 Handle<Context> previous(current->previous()); | 11616 |
11599 Handle<Context> new_previous = | 11617 // Iteratively copy and or materialize the nested contexts. |
11600 CopyWithContextChain(isolate, function, previous, base); | 11618 while (!scope_chain.is_empty()) { |
11601 Handle<Context> new_current; | 11619 Handle<SerializedScopeInfo> scope_info = scope_chain.RemoveLast(); |
11602 if (current->IsCatchContext()) { | 11620 Handle<Context> current = context_chain.RemoveLast(); |
11603 Handle<String> name(String::cast(current->extension())); | 11621 ASSERT(!(scope_info->HasContext() & current.is_null())); |
11604 Handle<Object> thrown_object(current->get(Context::THROWN_OBJECT_INDEX)); | 11622 |
11605 new_current = | 11623 if (scope_info->ScopeType() == Scope::CATCH_SCOPE) { |
11606 isolate->factory()->NewCatchContext(function, | 11624 Handle<String> name(String::cast(current->extension())); |
11607 new_previous, | 11625 Handle<Object> thrown_object(current->get(Context::THROWN_OBJECT_INDEX)); |
11608 name, | 11626 context = |
11609 thrown_object); | 11627 isolate->factory()->NewCatchContext(function, |
11610 } else if (current->IsBlockContext()) { | 11628 context, |
11611 Handle<SerializedScopeInfo> scope_info( | 11629 name, |
11612 SerializedScopeInfo::cast(current->extension())); | 11630 thrown_object); |
11613 new_current = | 11631 } else if (scope_info->ScopeType() == Scope::BLOCK_SCOPE) { |
11614 isolate->factory()->NewBlockContext(function, new_previous, scope_info); | 11632 // Materialize the contents of the block scope into a JSObject. |
11615 // Copy context slots. | 11633 Handle<JSObject> block_scope_object = |
11616 int num_context_slots = scope_info->NumberOfContextSlots(); | 11634 MaterializeBlockScope(isolate, current); |
11617 for (int i = Context::MIN_CONTEXT_SLOTS; i < num_context_slots; ++i) { | 11635 if (block_scope_object.is_null()) { |
11618 new_current->set(i, current->get(i)); | 11636 return Handle<Context>::null(); |
11637 } | |
11638 // Allocate a new function context for the debug evaluation and set the | |
11639 // extension object. | |
11640 Handle<Context> new_context = | |
11641 isolate->factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, | |
11642 function); | |
11643 new_context->set_extension(*block_scope_object); | |
11644 new_context->set_previous(*context); | |
11645 context = new_context; | |
11646 } else { | |
11647 ASSERT(scope_info->ScopeType() == Scope::WITH_SCOPE); | |
11648 ASSERT(current->IsWithContext()); | |
11649 Handle<JSObject> extension(JSObject::cast(current->extension())); | |
11650 context = | |
11651 isolate->factory()->NewWithContext(function, context, extension); | |
11619 } | 11652 } |
11620 } else { | |
11621 ASSERT(current->IsWithContext()); | |
11622 Handle<JSObject> extension(JSObject::cast(current->extension())); | |
11623 new_current = | |
11624 isolate->factory()->NewWithContext(function, new_previous, extension); | |
11625 } | 11653 } |
11626 return scope.CloseAndEscape(new_current); | 11654 |
11655 return scope.CloseAndEscape(context); | |
11627 } | 11656 } |
11628 | 11657 |
11629 | 11658 |
11630 // Helper function to find or create the arguments object for | 11659 // Helper function to find or create the arguments object for |
11631 // Runtime_DebugEvaluate. | 11660 // Runtime_DebugEvaluate. |
11632 static Handle<Object> GetArgumentsObject(Isolate* isolate, | 11661 static Handle<Object> GetArgumentsObject(Isolate* isolate, |
11633 JavaScriptFrame* frame, | 11662 JavaScriptFrame* frame, |
11634 int inlined_frame_index, | 11663 int inlined_frame_index, |
11635 Handle<JSFunction> function, | 11664 Handle<JSFunction> function, |
11636 Handle<SerializedScopeInfo> scope_info, | 11665 Handle<SerializedScopeInfo> scope_info, |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11754 isolate->factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, | 11783 isolate->factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, |
11755 go_between); | 11784 go_between); |
11756 context->set_extension(*local_scope); | 11785 context->set_extension(*local_scope); |
11757 // Copy any with contexts present and chain them in front of this context. | 11786 // Copy any with contexts present and chain them in front of this context. |
11758 Handle<Context> frame_context(Context::cast(frame->context())); | 11787 Handle<Context> frame_context(Context::cast(frame->context())); |
11759 Handle<Context> function_context; | 11788 Handle<Context> function_context; |
11760 // Get the function's context if it has one. | 11789 // Get the function's context if it has one. |
11761 if (scope_info->HasHeapAllocatedLocals()) { | 11790 if (scope_info->HasHeapAllocatedLocals()) { |
11762 function_context = Handle<Context>(frame_context->declaration_context()); | 11791 function_context = Handle<Context>(frame_context->declaration_context()); |
11763 } | 11792 } |
11764 context = CopyWithContextChain(isolate, go_between, frame_context, context); | 11793 context = CopyNestedScopeContextChain(isolate, |
11794 go_between, | |
11795 context, | |
11796 frame, | |
11797 inlined_frame_index); | |
11765 | 11798 |
11766 if (additional_context->IsJSObject()) { | 11799 if (additional_context->IsJSObject()) { |
11767 Handle<JSObject> extension = Handle<JSObject>::cast(additional_context); | 11800 Handle<JSObject> extension = Handle<JSObject>::cast(additional_context); |
11768 context = | 11801 context = |
11769 isolate->factory()->NewWithContext(go_between, context, extension); | 11802 isolate->factory()->NewWithContext(go_between, context, extension); |
11770 } | 11803 } |
11771 | 11804 |
11772 // Wrap the evaluation statement in a new function compiled in the newly | 11805 // Wrap the evaluation statement in a new function compiled in the newly |
11773 // created context. The function has one parameter which has to be called | 11806 // created context. The function has one parameter which has to be called |
11774 // 'arguments'. This it to have access to what would have been 'arguments' in | 11807 // 'arguments'. This it to have access to what would have been 'arguments' in |
(...skipping 1421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13196 } else { | 13229 } else { |
13197 // Handle last resort GC and make sure to allow future allocations | 13230 // Handle last resort GC and make sure to allow future allocations |
13198 // to grow the heap without causing GCs (if possible). | 13231 // to grow the heap without causing GCs (if possible). |
13199 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13232 isolate->counters()->gc_last_resort_from_js()->Increment(); |
13200 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); | 13233 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); |
13201 } | 13234 } |
13202 } | 13235 } |
13203 | 13236 |
13204 | 13237 |
13205 } } // namespace v8::internal | 13238 } } // namespace v8::internal |
OLD | NEW |