Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(237)

Side by Side Diff: src/runtime.cc

Issue 8344046: Reapply r9673 "Scope tree serialization and ScopeIterator cleanup." (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Skip nested contexts of an internal function. Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/parser.cc ('k') | src/scopeinfo.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 11090 matching lines...) Expand 10 before | Expand all | Expand 10 after
11101 serialized_scope_info, scope_info, 11101 serialized_scope_info, scope_info,
11102 context, block_scope)) { 11102 context, block_scope)) {
11103 return Handle<JSObject>(); 11103 return Handle<JSObject>();
11104 } 11104 }
11105 } 11105 }
11106 11106
11107 return block_scope; 11107 return block_scope;
11108 } 11108 }
11109 11109
11110 11110
11111 // Iterate over the actual scopes visible from a stack frame. All scopes are 11111 // Iterate over the actual scopes visible from a stack frame. The iteration
11112 // proceeds from the innermost visible nested scope outwards. All scopes are
11112 // backed by an actual context except the local scope, which is inserted 11113 // backed by an actual context except the local scope, which is inserted
11113 // "artifically" in the context chain. 11114 // "artificially" in the context chain.
11114 class ScopeIterator { 11115 class ScopeIterator {
11115 public: 11116 public:
11116 enum ScopeType { 11117 enum ScopeType {
11117 ScopeTypeGlobal = 0, 11118 ScopeTypeGlobal = 0,
11118 ScopeTypeLocal, 11119 ScopeTypeLocal,
11119 ScopeTypeWith, 11120 ScopeTypeWith,
11120 ScopeTypeClosure, 11121 ScopeTypeClosure,
11121 ScopeTypeCatch, 11122 ScopeTypeCatch,
11122 ScopeTypeBlock 11123 ScopeTypeBlock
11123 }; 11124 };
11124 11125
11125 ScopeIterator(Isolate* isolate, 11126 ScopeIterator(Isolate* isolate,
11126 JavaScriptFrame* frame, 11127 JavaScriptFrame* frame,
11127 int inlined_frame_index) 11128 int inlined_frame_index)
11128 : isolate_(isolate), 11129 : isolate_(isolate),
11129 frame_(frame), 11130 frame_(frame),
11130 inlined_frame_index_(inlined_frame_index), 11131 inlined_frame_index_(inlined_frame_index),
11131 function_(JSFunction::cast(frame->function())), 11132 function_(JSFunction::cast(frame->function())),
11132 context_(Context::cast(frame->context())), 11133 context_(Context::cast(frame->context())),
11133 local_done_(false), 11134 nested_scope_chain_(4) {
11134 at_local_(false) {
11135 11135
11136 // Check whether the first scope is actually a local scope. 11136 // Catch the case when the debugger stops in an internal function.
11137 // If there is a stack slot for .result then this local scope has been 11137 Handle<SharedFunctionInfo> shared_info(function_->shared());
11138 // created for evaluating top level code and it is not a real local scope. 11138 if (shared_info->script() == isolate->heap()->undefined_value()) {
11139 while (context_->closure() == *function_) {
11140 context_ = Handle<Context>(context_->previous(), isolate_);
11141 }
11142 return;
11143 }
11144
11145 // Check whether we are in global code or function code. If there is a stack
11146 // slot for .result then this function has been created for evaluating
11147 // global code and it is not a real function.
11139 // Checking for the existence of .result seems fragile, but the scope info 11148 // Checking for the existence of .result seems fragile, but the scope info
11140 // saved with the code object does not otherwise have that information. 11149 // saved with the code object does not otherwise have that information.
11141 int index = function_->shared()->scope_info()-> 11150 int index = shared_info->scope_info()->
11142 StackSlotIndex(isolate_->heap()->result_symbol()); 11151 StackSlotIndex(isolate_->heap()->result_symbol());
11152
11153 // Reparse the code and analyze the scopes.
11154 ZoneScope zone_scope(isolate, DELETE_ON_EXIT);
11155 Handle<Script> script(Script::cast(shared_info->script()));
11156 Scope* scope;
11143 if (index >= 0) { 11157 if (index >= 0) {
11144 local_done_ = true; 11158 // Global code
11145 } else if (context_->IsGlobalContext() || 11159 CompilationInfo info(script);
11146 context_->IsFunctionContext()) { 11160 info.MarkAsGlobal();
11147 at_local_ = true; 11161 bool result = ParserApi::Parse(&info);
11148 } else if (context_->closure() != *function_) { 11162 ASSERT(result);
11149 // The context_ is a block or with or catch block from the outer function. 11163 result = Scope::Analyze(&info);
11150 ASSERT(context_->IsWithContext() || 11164 ASSERT(result);
11151 context_->IsCatchContext() || 11165 scope = info.function()->scope();
11152 context_->IsBlockContext()); 11166 } else {
11153 at_local_ = true; 11167 // Function code
11168 CompilationInfo info(shared_info);
11169 bool result = ParserApi::Parse(&info);
11170 ASSERT(result);
11171 result = Scope::Analyze(&info);
11172 ASSERT(result);
11173 scope = info.function()->scope();
11154 } 11174 }
11175
11176 // Retrieve the scope chain for the current position.
11177 int statement_position =
11178 shared_info->code()->SourceStatementPosition(frame_->pc());
11179 scope->GetNestedScopeChain(&nested_scope_chain_, statement_position);
11155 } 11180 }
11156 11181
11157 // More scopes? 11182 // More scopes?
11158 bool Done() { return context_.is_null(); } 11183 bool Done() { return context_.is_null(); }
11159 11184
11160 // Move to the next scope. 11185 // Move to the next scope.
11161 void Next() { 11186 void Next() {
11162 // If at a local scope mark the local scope as passed. 11187 ScopeType scope_type = Type();
11163 if (at_local_) { 11188 if (scope_type == ScopeTypeGlobal) {
11164 at_local_ = false; 11189 // The global scope is always the last in the chain.
11165 local_done_ = true; 11190 ASSERT(context_->IsGlobalContext());
11166
11167 // If the current context is not associated with the local scope the
11168 // current context is the next real scope, so don't move to the next
11169 // context in this case.
11170 if (context_->closure() != *function_) {
11171 return;
11172 }
11173 }
11174
11175 // The global scope is always the last in the chain.
11176 if (context_->IsGlobalContext()) {
11177 context_ = Handle<Context>(); 11191 context_ = Handle<Context>();
11178 return; 11192 return;
11179 } 11193 }
11180 11194 if (nested_scope_chain_.is_empty()) {
11181 // Move to the next context. 11195 context_ = Handle<Context>(context_->previous(), isolate_);
11182 context_ = Handle<Context>(context_->previous(), isolate_); 11196 } else {
11183 11197 if (nested_scope_chain_.last()->HasContext()) {
11184 // If passing the local scope indicate that the current scope is now the 11198 context_ = Handle<Context>(context_->previous(), isolate_);
11185 // local scope. 11199 }
11186 if (!local_done_ && 11200 nested_scope_chain_.RemoveLast();
11187 (context_->IsGlobalContext() || context_->IsFunctionContext())) {
11188 at_local_ = true;
11189 } 11201 }
11190 } 11202 }
11191 11203
11192 // Return the type of the current scope. 11204 // Return the type of the current scope.
11193 ScopeType Type() { 11205 ScopeType Type() {
11194 if (at_local_) { 11206 if (!nested_scope_chain_.is_empty()) {
11195 return ScopeTypeLocal; 11207 Handle<SerializedScopeInfo> scope_info = nested_scope_chain_.last();
11208 switch (scope_info->Type()) {
11209 case FUNCTION_SCOPE:
11210 ASSERT(context_->IsFunctionContext() ||
11211 !scope_info->HasContext());
11212 return ScopeTypeLocal;
11213 case GLOBAL_SCOPE:
11214 ASSERT(context_->IsGlobalContext());
11215 return ScopeTypeGlobal;
11216 case WITH_SCOPE:
11217 ASSERT(context_->IsWithContext());
11218 return ScopeTypeWith;
11219 case CATCH_SCOPE:
11220 ASSERT(context_->IsCatchContext());
11221 return ScopeTypeCatch;
11222 case BLOCK_SCOPE:
11223 ASSERT(!scope_info->HasContext() ||
11224 context_->IsBlockContext());
11225 return ScopeTypeBlock;
11226 case EVAL_SCOPE:
11227 UNREACHABLE();
11228 }
11196 } 11229 }
11197 if (context_->IsGlobalContext()) { 11230 if (context_->IsGlobalContext()) {
11198 ASSERT(context_->global()->IsGlobalObject()); 11231 ASSERT(context_->global()->IsGlobalObject());
11199 return ScopeTypeGlobal; 11232 return ScopeTypeGlobal;
11200 } 11233 }
11201 if (context_->IsFunctionContext()) { 11234 if (context_->IsFunctionContext()) {
11202 return ScopeTypeClosure; 11235 return ScopeTypeClosure;
11203 } 11236 }
11204 if (context_->IsCatchContext()) { 11237 if (context_->IsCatchContext()) {
11205 return ScopeTypeCatch; 11238 return ScopeTypeCatch;
11206 } 11239 }
11207 if (context_->IsBlockContext()) { 11240 if (context_->IsBlockContext()) {
11208 return ScopeTypeBlock; 11241 return ScopeTypeBlock;
11209 } 11242 }
11210 ASSERT(context_->IsWithContext()); 11243 ASSERT(context_->IsWithContext());
11211 return ScopeTypeWith; 11244 return ScopeTypeWith;
11212 } 11245 }
11213 11246
11214 // Return the JavaScript object with the content of the current scope. 11247 // Return the JavaScript object with the content of the current scope.
11215 Handle<JSObject> ScopeObject() { 11248 Handle<JSObject> ScopeObject() {
11216 switch (Type()) { 11249 switch (Type()) {
11217 case ScopeIterator::ScopeTypeGlobal: 11250 case ScopeIterator::ScopeTypeGlobal:
11218 return Handle<JSObject>(CurrentContext()->global()); 11251 return Handle<JSObject>(CurrentContext()->global());
11219 case ScopeIterator::ScopeTypeLocal: 11252 case ScopeIterator::ScopeTypeLocal:
11220 // Materialize the content of the local scope into a JSObject. 11253 // Materialize the content of the local scope into a JSObject.
11254 ASSERT(nested_scope_chain_.length() == 1);
11221 return MaterializeLocalScope(isolate_, frame_, inlined_frame_index_); 11255 return MaterializeLocalScope(isolate_, frame_, inlined_frame_index_);
11222 case ScopeIterator::ScopeTypeWith: 11256 case ScopeIterator::ScopeTypeWith:
11223 // Return the with object. 11257 // Return the with object.
11224 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension())); 11258 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension()));
11225 case ScopeIterator::ScopeTypeCatch: 11259 case ScopeIterator::ScopeTypeCatch:
11226 return MaterializeCatchScope(isolate_, CurrentContext()); 11260 return MaterializeCatchScope(isolate_, CurrentContext());
11227 case ScopeIterator::ScopeTypeClosure: 11261 case ScopeIterator::ScopeTypeClosure:
11228 // Materialize the content of the closure scope into a JSObject. 11262 // Materialize the content of the closure scope into a JSObject.
11229 return MaterializeClosure(isolate_, CurrentContext()); 11263 return MaterializeClosure(isolate_, CurrentContext());
11230 case ScopeIterator::ScopeTypeBlock: 11264 case ScopeIterator::ScopeTypeBlock:
11231 return MaterializeBlockScope(isolate_, CurrentContext()); 11265 return MaterializeBlockScope(isolate_, CurrentContext());
11232 } 11266 }
11233 UNREACHABLE(); 11267 UNREACHABLE();
11234 return Handle<JSObject>(); 11268 return Handle<JSObject>();
11235 } 11269 }
11236 11270
11271 Handle<SerializedScopeInfo> CurrentScopeInfo() {
11272 if (!nested_scope_chain_.is_empty()) {
11273 return nested_scope_chain_.last();
11274 } else if (context_->IsBlockContext()) {
11275 return Handle<SerializedScopeInfo>(
11276 SerializedScopeInfo::cast(context_->extension()));
11277 } else if (context_->IsFunctionContext()) {
11278 return Handle<SerializedScopeInfo>(
11279 context_->closure()->shared()->scope_info());
11280 }
11281 return Handle<SerializedScopeInfo>::null();
11282 }
11283
11237 // Return the context for this scope. For the local context there might not 11284 // Return the context for this scope. For the local context there might not
11238 // be an actual context. 11285 // be an actual context.
11239 Handle<Context> CurrentContext() { 11286 Handle<Context> CurrentContext() {
11240 if (at_local_ && context_->closure() != *function_) { 11287 if (Type() == ScopeTypeGlobal ||
11288 nested_scope_chain_.is_empty()) {
11289 return context_;
11290 } else if (nested_scope_chain_.last()->HasContext()) {
11291 return context_;
11292 } else {
11241 return Handle<Context>(); 11293 return Handle<Context>();
11242 } 11294 }
11243 return context_;
11244 } 11295 }
11245 11296
11246 #ifdef DEBUG 11297 #ifdef DEBUG
11247 // Debug print of the content of the current scope. 11298 // Debug print of the content of the current scope.
11248 void DebugPrint() { 11299 void DebugPrint() {
11249 switch (Type()) { 11300 switch (Type()) {
11250 case ScopeIterator::ScopeTypeGlobal: 11301 case ScopeIterator::ScopeTypeGlobal:
11251 PrintF("Global:\n"); 11302 PrintF("Global:\n");
11252 CurrentContext()->Print(); 11303 CurrentContext()->Print();
11253 break; 11304 break;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
11296 PrintF("\n"); 11347 PrintF("\n");
11297 } 11348 }
11298 #endif 11349 #endif
11299 11350
11300 private: 11351 private:
11301 Isolate* isolate_; 11352 Isolate* isolate_;
11302 JavaScriptFrame* frame_; 11353 JavaScriptFrame* frame_;
11303 int inlined_frame_index_; 11354 int inlined_frame_index_;
11304 Handle<JSFunction> function_; 11355 Handle<JSFunction> function_;
11305 Handle<Context> context_; 11356 Handle<Context> context_;
11306 bool local_done_; 11357 List<Handle<SerializedScopeInfo> > nested_scope_chain_;
11307 bool at_local_;
11308 11358
11309 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator); 11359 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator);
11310 }; 11360 };
11311 11361
11312 11362
11313 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeCount) { 11363 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeCount) {
11314 HandleScope scope(isolate); 11364 HandleScope scope(isolate);
11315 ASSERT(args.length() == 2); 11365 ASSERT(args.length() == 2);
11316 11366
11317 // Check arguments. 11367 // Check arguments.
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
11760 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearStepping) { 11810 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearStepping) {
11761 HandleScope scope(isolate); 11811 HandleScope scope(isolate);
11762 ASSERT(args.length() == 0); 11812 ASSERT(args.length() == 0);
11763 isolate->debug()->ClearStepping(); 11813 isolate->debug()->ClearStepping();
11764 return isolate->heap()->undefined_value(); 11814 return isolate->heap()->undefined_value();
11765 } 11815 }
11766 11816
11767 11817
11768 // Creates a copy of the with context chain. The copy of the context chain is 11818 // Creates a copy of the with context chain. The copy of the context chain is
11769 // is linked to the function context supplied. 11819 // is linked to the function context supplied.
11770 static Handle<Context> CopyWithContextChain(Isolate* isolate, 11820 static Handle<Context> CopyNestedScopeContextChain(Isolate* isolate,
11771 Handle<JSFunction> function, 11821 Handle<JSFunction> function,
11772 Handle<Context> current, 11822 Handle<Context> base,
11773 Handle<Context> base) { 11823 JavaScriptFrame* frame,
11774 // At the end of the chain. Return the base context to link to. 11824 int inlined_frame_index) {
11775 if (current->IsFunctionContext() || current->IsGlobalContext()) { 11825 HandleScope scope(isolate);
11776 return base; 11826 List<Handle<SerializedScopeInfo> > scope_chain;
11827 List<Handle<Context> > context_chain;
11828
11829 ScopeIterator it(isolate, frame, inlined_frame_index);
11830 for (; it.Type() != ScopeIterator::ScopeTypeGlobal &&
11831 it.Type() != ScopeIterator::ScopeTypeLocal ; it.Next()) {
11832 ASSERT(!it.Done());
11833 scope_chain.Add(it.CurrentScopeInfo());
11834 context_chain.Add(it.CurrentContext());
11777 } 11835 }
11778 11836
11779 // Recursively copy the with and catch contexts. 11837 // At the end of the chain. Return the base context to link to.
11780 HandleScope scope(isolate); 11838 Handle<Context> context = base;
11781 Handle<Context> previous(current->previous()); 11839
11782 Handle<Context> new_previous = 11840 // Iteratively copy and or materialize the nested contexts.
11783 CopyWithContextChain(isolate, function, previous, base); 11841 while (!scope_chain.is_empty()) {
11784 Handle<Context> new_current; 11842 Handle<SerializedScopeInfo> scope_info = scope_chain.RemoveLast();
11785 if (current->IsCatchContext()) { 11843 Handle<Context> current = context_chain.RemoveLast();
11786 Handle<String> name(String::cast(current->extension())); 11844 ASSERT(!(scope_info->HasContext() & current.is_null()));
11787 Handle<Object> thrown_object(current->get(Context::THROWN_OBJECT_INDEX)); 11845
11788 new_current = 11846 if (scope_info->Type() == CATCH_SCOPE) {
11789 isolate->factory()->NewCatchContext(function, 11847 Handle<String> name(String::cast(current->extension()));
11790 new_previous, 11848 Handle<Object> thrown_object(current->get(Context::THROWN_OBJECT_INDEX));
11791 name, 11849 context =
11792 thrown_object); 11850 isolate->factory()->NewCatchContext(function,
11793 } else if (current->IsBlockContext()) { 11851 context,
11794 Handle<SerializedScopeInfo> scope_info( 11852 name,
11795 SerializedScopeInfo::cast(current->extension())); 11853 thrown_object);
11796 new_current = 11854 } else if (scope_info->Type() == BLOCK_SCOPE) {
11797 isolate->factory()->NewBlockContext(function, new_previous, scope_info); 11855 // Materialize the contents of the block scope into a JSObject.
11798 // Copy context slots. 11856 Handle<JSObject> block_scope_object =
11799 int num_context_slots = scope_info->NumberOfContextSlots(); 11857 MaterializeBlockScope(isolate, current);
11800 for (int i = Context::MIN_CONTEXT_SLOTS; i < num_context_slots; ++i) { 11858 if (block_scope_object.is_null()) {
11801 new_current->set(i, current->get(i)); 11859 return Handle<Context>::null();
11860 }
11861 // Allocate a new function context for the debug evaluation and set the
11862 // extension object.
11863 Handle<Context> new_context =
11864 isolate->factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS,
11865 function);
11866 new_context->set_extension(*block_scope_object);
11867 new_context->set_previous(*context);
11868 context = new_context;
11869 } else {
11870 ASSERT(scope_info->Type() == WITH_SCOPE);
11871 ASSERT(current->IsWithContext());
11872 Handle<JSObject> extension(JSObject::cast(current->extension()));
11873 context =
11874 isolate->factory()->NewWithContext(function, context, extension);
11802 } 11875 }
11803 } else {
11804 ASSERT(current->IsWithContext());
11805 Handle<JSObject> extension(JSObject::cast(current->extension()));
11806 new_current =
11807 isolate->factory()->NewWithContext(function, new_previous, extension);
11808 } 11876 }
11809 return scope.CloseAndEscape(new_current); 11877
11878 return scope.CloseAndEscape(context);
11810 } 11879 }
11811 11880
11812 11881
11813 // Helper function to find or create the arguments object for 11882 // Helper function to find or create the arguments object for
11814 // Runtime_DebugEvaluate. 11883 // Runtime_DebugEvaluate.
11815 static Handle<Object> GetArgumentsObject(Isolate* isolate, 11884 static Handle<Object> GetArgumentsObject(Isolate* isolate,
11816 JavaScriptFrame* frame, 11885 JavaScriptFrame* frame,
11817 int inlined_frame_index, 11886 int inlined_frame_index,
11818 Handle<JSFunction> function, 11887 Handle<JSFunction> function,
11819 Handle<SerializedScopeInfo> scope_info, 11888 Handle<SerializedScopeInfo> scope_info,
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
11937 isolate->factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, 12006 isolate->factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS,
11938 go_between); 12007 go_between);
11939 context->set_extension(*local_scope); 12008 context->set_extension(*local_scope);
11940 // Copy any with contexts present and chain them in front of this context. 12009 // Copy any with contexts present and chain them in front of this context.
11941 Handle<Context> frame_context(Context::cast(frame->context())); 12010 Handle<Context> frame_context(Context::cast(frame->context()));
11942 Handle<Context> function_context; 12011 Handle<Context> function_context;
11943 // Get the function's context if it has one. 12012 // Get the function's context if it has one.
11944 if (scope_info->HasHeapAllocatedLocals()) { 12013 if (scope_info->HasHeapAllocatedLocals()) {
11945 function_context = Handle<Context>(frame_context->declaration_context()); 12014 function_context = Handle<Context>(frame_context->declaration_context());
11946 } 12015 }
11947 context = CopyWithContextChain(isolate, go_between, frame_context, context); 12016 context = CopyNestedScopeContextChain(isolate,
12017 go_between,
12018 context,
12019 frame,
12020 inlined_frame_index);
11948 12021
11949 if (additional_context->IsJSObject()) { 12022 if (additional_context->IsJSObject()) {
11950 Handle<JSObject> extension = Handle<JSObject>::cast(additional_context); 12023 Handle<JSObject> extension = Handle<JSObject>::cast(additional_context);
11951 context = 12024 context =
11952 isolate->factory()->NewWithContext(go_between, context, extension); 12025 isolate->factory()->NewWithContext(go_between, context, extension);
11953 } 12026 }
11954 12027
11955 // Wrap the evaluation statement in a new function compiled in the newly 12028 // Wrap the evaluation statement in a new function compiled in the newly
11956 // created context. The function has one parameter which has to be called 12029 // created context. The function has one parameter which has to be called
11957 // 'arguments'. This it to have access to what would have been 'arguments' in 12030 // 'arguments'. This it to have access to what would have been 'arguments' in
(...skipping 1428 matching lines...) Expand 10 before | Expand all | Expand 10 after
13386 } else { 13459 } else {
13387 // Handle last resort GC and make sure to allow future allocations 13460 // Handle last resort GC and make sure to allow future allocations
13388 // to grow the heap without causing GCs (if possible). 13461 // to grow the heap without causing GCs (if possible).
13389 isolate->counters()->gc_last_resort_from_js()->Increment(); 13462 isolate->counters()->gc_last_resort_from_js()->Increment();
13390 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); 13463 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
13391 } 13464 }
13392 } 13465 }
13393 13466
13394 13467
13395 } } // namespace v8::internal 13468 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/parser.cc ('k') | src/scopeinfo.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698