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

Side by Side Diff: src/runtime.cc

Issue 8590027: Fix the ScopeIterator reimplemantation. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: ScopeIterator fix and test cases. Created 9 years 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
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 11164 matching lines...) Expand 10 before | Expand all | Expand 10 after
11175 }; 11175 };
11176 11176
11177 ScopeIterator(Isolate* isolate, 11177 ScopeIterator(Isolate* isolate,
11178 JavaScriptFrame* frame, 11178 JavaScriptFrame* frame,
11179 int inlined_frame_index) 11179 int inlined_frame_index)
11180 : isolate_(isolate), 11180 : isolate_(isolate),
11181 frame_(frame), 11181 frame_(frame),
11182 inlined_frame_index_(inlined_frame_index), 11182 inlined_frame_index_(inlined_frame_index),
11183 function_(JSFunction::cast(frame->function())), 11183 function_(JSFunction::cast(frame->function())),
11184 context_(Context::cast(frame->context())), 11184 context_(Context::cast(frame->context())),
11185 local_done_(false), 11185 nested_scope_chain_(4) {
11186 at_local_(false) {
11187 11186
11188 // Check whether the first scope is actually a local scope. 11187 // Catch the case when the debugger stops in an internal function.
11189 // If there is a stack slot for .result then this local scope has been 11188 Handle<SharedFunctionInfo> shared_info(function_->shared());
11190 // created for evaluating top level code and it is not a real local scope. 11189 Handle<ScopeInfo> scope_info(shared_info->scope_info());
11191 // Checking for the existence of .result seems fragile, but the scope info 11190 if (shared_info->script() == isolate->heap()->undefined_value()) {
11192 // saved with the code object does not otherwise have that information. 11191 while (context_->closure() == *function_) {
11193 int index = function_->shared()->scope_info()-> 11192 context_ = Handle<Context>(context_->previous(), isolate_);
11194 StackSlotIndex(isolate_->heap()->result_symbol()); 11193 }
11195 if (index >= 0) { 11194 return;
11196 local_done_ = true; 11195 }
11197 } else if (context_->IsGlobalContext() || 11196
11198 context_->IsFunctionContext()) { 11197 // Get the start of the frame exit code.
11199 at_local_ = true; 11198 Handle<Code> code(shared_info->code());
11200 } else if (context_->closure() != *function_) { 11199 RelocIterator it(*code, RelocInfo::ModeMask(RelocInfo::JS_RETURN));
11201 // The context_ is a block or with or catch block from the outer function. 11200 RelocInfo* info = it.rinfo();
11202 ASSERT(context_->IsWithContext() || 11201 Address frame_exit_code = info->pc();
11203 context_->IsCatchContext() || 11202 it.next();
11204 context_->IsBlockContext()); 11203 ASSERT(it.done());
11205 at_local_ = true; 11204
11205 Address frame_exit_return =
11206 frame_exit_code + Assembler::kCallInstructionLength;
11207 if (frame_->pc() == frame_exit_return) {
11208 // We are within the return sequence. At the momemt it is not possible to
11209 // get a source position which is consistent with the current scope chain.
11210 // Thus all nested with, catch and block contexts are skipped and we only
11211 // provide the function scope.
11212 if (scope_info->HasContext()) {
11213 context_ = Handle<Context>(context_->declaration_context(), isolate_);
11214 } else {
11215 while (context_->closure() == *function_) {
11216 context_ = Handle<Context>(context_->previous(), isolate_);
11217 }
11218 }
11219 if (scope_info->Type() != EVAL_SCOPE) nested_scope_chain_.Add(scope_info);
11220 } else {
11221 // Reparse the code and analyze the scopes.
11222 ZoneScope zone_scope(isolate, DELETE_ON_EXIT);
11223 Handle<Script> script(Script::cast(shared_info->script()));
11224 Scope* scope = NULL;
11225
11226 // Check whether we are in global, eval or function code.
11227 Handle<ScopeInfo> scope_info(shared_info->scope_info());
11228 if (scope_info->Type() != FUNCTION_SCOPE) {
11229 // Global or eval code.
11230 CompilationInfo info(script);
11231 ScriptDataImpl* pre_data = NULL;
11232 if (scope_info->Type() == GLOBAL_SCOPE) {
11233 int flags = kNoParsingFlags;
11234 if (info.is_native() || FLAG_allow_natives_syntax) {
11235 flags |= kAllowNativesSyntax;
11236 }
11237 if (!info.is_native() && FLAG_harmony_scoping) {
11238 flags |= kHarmonyScoping;
11239 }
11240 Handle<String> source(String::cast(script->source()));
11241 if (source->length() >= FLAG_min_preparse_length) {
11242 pre_data = ParserApi::PartialPreParse(source, NULL, flags);
11243 info.SetPreParseData(pre_data);
11244 }
11245 info.MarkAsGlobal();
11246 } else {
11247 ASSERT(scope_info->Type() == EVAL_SCOPE);
11248 info.MarkAsEval();
11249 info.SetCallingContext(Handle<Context>(function_->context()));
11250 }
11251 if (ParserApi::Parse(&info) && Scope::Analyze(&info)) {
11252 scope = info.function()->scope();
11253 }
11254 // Delete preparse data again.
11255 if (pre_data != NULL) {
11256 delete pre_data;
11257 }
11258 } else {
11259 // Function code
11260 CompilationInfo info(shared_info);
11261 if (ParserApi::Parse(&info) && Scope::Analyze(&info)) {
11262 scope = info.function()->scope();
11263 }
11264 }
11265
11266 // Retrieve the scope chain for the current position.
11267 if (scope != NULL) {
11268 int source_position = shared_info->code()->SourcePosition(frame_->pc());
11269 scope->GetNestedScopeChain(&nested_scope_chain_, source_position);
11270 } else {
11271 // A failed reparse indicates that the preparser has diverged from the
11272 // parser or that the preparse data given to the initial parse has been
11273 // faulty. We fail in debug mode but in release mode we only provide the
11274 // information we get from the context chain but nothing about
11275 // completely stack allocated scopes or stack allocated locals.
11276 UNREACHABLE();
11277 }
11206 } 11278 }
11207 } 11279 }
11208 11280
11209 // More scopes? 11281 // More scopes?
11210 bool Done() { return context_.is_null(); } 11282 bool Done() { return context_.is_null(); }
11211 11283
11212 // Move to the next scope. 11284 // Move to the next scope.
11213 void Next() { 11285 void Next() {
11214 // If at a local scope mark the local scope as passed. 11286 ScopeType scope_type = Type();
11215 if (at_local_) { 11287 if (scope_type == ScopeTypeGlobal) {
11216 at_local_ = false; 11288 // The global scope is always the last in the chain.
11217 local_done_ = true; 11289 ASSERT(context_->IsGlobalContext());
11218
11219 // If the current context is not associated with the local scope the
11220 // current context is the next real scope, so don't move to the next
11221 // context in this case.
11222 if (context_->closure() != *function_) {
11223 return;
11224 }
11225 }
11226
11227 // The global scope is always the last in the chain.
11228 if (context_->IsGlobalContext()) {
11229 context_ = Handle<Context>(); 11290 context_ = Handle<Context>();
11230 return; 11291 return;
11231 } 11292 }
11232 11293 if (nested_scope_chain_.is_empty()) {
11233 // Move to the next context. 11294 context_ = Handle<Context>(context_->previous(), isolate_);
11234 context_ = Handle<Context>(context_->previous(), isolate_); 11295 } else {
11235 11296 if (nested_scope_chain_.last()->HasContext()) {
11236 // If passing the local scope indicate that the current scope is now the 11297 ASSERT(context_->previous() != NULL);
11237 // local scope. 11298 context_ = Handle<Context>(context_->previous(), isolate_);
11238 if (!local_done_ && 11299 }
11239 (context_->IsGlobalContext() || context_->IsFunctionContext())) { 11300 nested_scope_chain_.RemoveLast();
11240 at_local_ = true;
11241 } 11301 }
11242 } 11302 }
11243 11303
11244 // Return the type of the current scope. 11304 // Return the type of the current scope.
11245 ScopeType Type() { 11305 ScopeType Type() {
11246 if (at_local_) { 11306 if (!nested_scope_chain_.is_empty()) {
11247 return ScopeTypeLocal; 11307 Handle<ScopeInfo> scope_info = nested_scope_chain_.last();
11308 switch (scope_info->Type()) {
11309 case FUNCTION_SCOPE:
11310 ASSERT(context_->IsFunctionContext() ||
11311 !scope_info->HasContext());
11312 return ScopeTypeLocal;
11313 case GLOBAL_SCOPE:
11314 ASSERT(context_->IsGlobalContext());
11315 return ScopeTypeGlobal;
11316 case WITH_SCOPE:
11317 ASSERT(context_->IsWithContext());
11318 return ScopeTypeWith;
11319 case CATCH_SCOPE:
11320 ASSERT(context_->IsCatchContext());
11321 return ScopeTypeCatch;
11322 case BLOCK_SCOPE:
11323 ASSERT(!scope_info->HasContext() ||
11324 context_->IsBlockContext());
11325 return ScopeTypeBlock;
11326 case EVAL_SCOPE:
11327 UNREACHABLE();
11328 }
11248 } 11329 }
11249 if (context_->IsGlobalContext()) { 11330 if (context_->IsGlobalContext()) {
11250 ASSERT(context_->global()->IsGlobalObject()); 11331 ASSERT(context_->global()->IsGlobalObject());
11251 return ScopeTypeGlobal; 11332 return ScopeTypeGlobal;
11252 } 11333 }
11253 if (context_->IsFunctionContext()) { 11334 if (context_->IsFunctionContext()) {
11254 return ScopeTypeClosure; 11335 return ScopeTypeClosure;
11255 } 11336 }
11256 if (context_->IsCatchContext()) { 11337 if (context_->IsCatchContext()) {
11257 return ScopeTypeCatch; 11338 return ScopeTypeCatch;
11258 } 11339 }
11259 if (context_->IsBlockContext()) { 11340 if (context_->IsBlockContext()) {
11260 return ScopeTypeBlock; 11341 return ScopeTypeBlock;
11261 } 11342 }
11262 ASSERT(context_->IsWithContext()); 11343 ASSERT(context_->IsWithContext());
11263 return ScopeTypeWith; 11344 return ScopeTypeWith;
11264 } 11345 }
11265 11346
11266 // Return the JavaScript object with the content of the current scope. 11347 // Return the JavaScript object with the content of the current scope.
11267 Handle<JSObject> ScopeObject() { 11348 Handle<JSObject> ScopeObject() {
11268 switch (Type()) { 11349 switch (Type()) {
11269 case ScopeIterator::ScopeTypeGlobal: 11350 case ScopeIterator::ScopeTypeGlobal:
11270 return Handle<JSObject>(CurrentContext()->global()); 11351 return Handle<JSObject>(CurrentContext()->global());
11271 case ScopeIterator::ScopeTypeLocal: 11352 case ScopeIterator::ScopeTypeLocal:
11272 // Materialize the content of the local scope into a JSObject. 11353 // Materialize the content of the local scope into a JSObject.
11354 ASSERT(nested_scope_chain_.length() == 1);
11273 return MaterializeLocalScope(isolate_, frame_, inlined_frame_index_); 11355 return MaterializeLocalScope(isolate_, frame_, inlined_frame_index_);
11274 case ScopeIterator::ScopeTypeWith: 11356 case ScopeIterator::ScopeTypeWith:
11275 // Return the with object. 11357 // Return the with object.
11276 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension())); 11358 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension()));
11277 case ScopeIterator::ScopeTypeCatch: 11359 case ScopeIterator::ScopeTypeCatch:
11278 return MaterializeCatchScope(isolate_, CurrentContext()); 11360 return MaterializeCatchScope(isolate_, CurrentContext());
11279 case ScopeIterator::ScopeTypeClosure: 11361 case ScopeIterator::ScopeTypeClosure:
11280 // Materialize the content of the closure scope into a JSObject. 11362 // Materialize the content of the closure scope into a JSObject.
11281 return MaterializeClosure(isolate_, CurrentContext()); 11363 return MaterializeClosure(isolate_, CurrentContext());
11282 case ScopeIterator::ScopeTypeBlock: 11364 case ScopeIterator::ScopeTypeBlock:
11283 return MaterializeBlockScope(isolate_, CurrentContext()); 11365 return MaterializeBlockScope(isolate_, CurrentContext());
11284 } 11366 }
11285 UNREACHABLE(); 11367 UNREACHABLE();
11286 return Handle<JSObject>(); 11368 return Handle<JSObject>();
11287 } 11369 }
11288 11370
11371 Handle<ScopeInfo> CurrentScopeInfo() {
11372 if (!nested_scope_chain_.is_empty()) {
11373 return nested_scope_chain_.last();
11374 } else if (context_->IsBlockContext()) {
11375 return Handle<ScopeInfo>(ScopeInfo::cast(context_->extension()));
11376 } else if (context_->IsFunctionContext()) {
11377 return Handle<ScopeInfo>(context_->closure()->shared()->scope_info());
11378 }
11379 return Handle<ScopeInfo>::null();
11380 }
11381
11289 // Return the context for this scope. For the local context there might not 11382 // Return the context for this scope. For the local context there might not
11290 // be an actual context. 11383 // be an actual context.
11291 Handle<Context> CurrentContext() { 11384 Handle<Context> CurrentContext() {
11292 if (at_local_ && context_->closure() != *function_) { 11385 if (Type() == ScopeTypeGlobal ||
11386 nested_scope_chain_.is_empty()) {
11387 return context_;
11388 } else if (nested_scope_chain_.last()->HasContext()) {
11389 return context_;
11390 } else {
11293 return Handle<Context>(); 11391 return Handle<Context>();
11294 } 11392 }
11295 return context_;
11296 } 11393 }
11297 11394
11298 #ifdef DEBUG 11395 #ifdef DEBUG
11299 // Debug print of the content of the current scope. 11396 // Debug print of the content of the current scope.
11300 void DebugPrint() { 11397 void DebugPrint() {
11301 switch (Type()) { 11398 switch (Type()) {
11302 case ScopeIterator::ScopeTypeGlobal: 11399 case ScopeIterator::ScopeTypeGlobal:
11303 PrintF("Global:\n"); 11400 PrintF("Global:\n");
11304 CurrentContext()->Print(); 11401 CurrentContext()->Print();
11305 break; 11402 break;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
11347 PrintF("\n"); 11444 PrintF("\n");
11348 } 11445 }
11349 #endif 11446 #endif
11350 11447
11351 private: 11448 private:
11352 Isolate* isolate_; 11449 Isolate* isolate_;
11353 JavaScriptFrame* frame_; 11450 JavaScriptFrame* frame_;
11354 int inlined_frame_index_; 11451 int inlined_frame_index_;
11355 Handle<JSFunction> function_; 11452 Handle<JSFunction> function_;
11356 Handle<Context> context_; 11453 Handle<Context> context_;
11357 bool local_done_; 11454 List<Handle<ScopeInfo> > nested_scope_chain_;
11358 bool at_local_;
11359 11455
11360 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator); 11456 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator);
11361 }; 11457 };
11362 11458
11363 11459
11364 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeCount) { 11460 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeCount) {
11365 HandleScope scope(isolate); 11461 HandleScope scope(isolate);
11366 ASSERT(args.length() == 2); 11462 ASSERT(args.length() == 2);
11367 11463
11368 // Check arguments. 11464 // Check arguments.
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
11811 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearStepping) { 11907 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearStepping) {
11812 HandleScope scope(isolate); 11908 HandleScope scope(isolate);
11813 ASSERT(args.length() == 0); 11909 ASSERT(args.length() == 0);
11814 isolate->debug()->ClearStepping(); 11910 isolate->debug()->ClearStepping();
11815 return isolate->heap()->undefined_value(); 11911 return isolate->heap()->undefined_value();
11816 } 11912 }
11817 11913
11818 11914
11819 // Creates a copy of the with context chain. The copy of the context chain is 11915 // Creates a copy of the with context chain. The copy of the context chain is
11820 // is linked to the function context supplied. 11916 // is linked to the function context supplied.
11821 static Handle<Context> CopyWithContextChain(Isolate* isolate, 11917 static Handle<Context> CopyNestedScopeContextChain(Isolate* isolate,
11822 Handle<JSFunction> function, 11918 Handle<JSFunction> function,
11823 Handle<Context> current, 11919 Handle<Context> base,
11824 Handle<Context> base) { 11920 JavaScriptFrame* frame,
11825 // At the end of the chain. Return the base context to link to. 11921 int inlined_frame_index) {
11826 if (current->IsFunctionContext() || current->IsGlobalContext()) { 11922 HandleScope scope(isolate);
11827 return base; 11923 List<Handle<ScopeInfo> > scope_chain;
11924 List<Handle<Context> > context_chain;
11925
11926 ScopeIterator it(isolate, frame, inlined_frame_index);
11927 for (; it.Type() != ScopeIterator::ScopeTypeGlobal &&
11928 it.Type() != ScopeIterator::ScopeTypeLocal ; it.Next()) {
11929 ASSERT(!it.Done());
11930 scope_chain.Add(it.CurrentScopeInfo());
11931 context_chain.Add(it.CurrentContext());
11828 } 11932 }
11829 11933
11830 // Recursively copy the with and catch contexts. 11934 // At the end of the chain. Return the base context to link to.
11831 HandleScope scope(isolate); 11935 Handle<Context> context = base;
11832 Handle<Context> previous(current->previous()); 11936
11833 Handle<Context> new_previous = 11937 // Iteratively copy and or materialize the nested contexts.
11834 CopyWithContextChain(isolate, function, previous, base); 11938 while (!scope_chain.is_empty()) {
11835 Handle<Context> new_current; 11939 Handle<ScopeInfo> scope_info = scope_chain.RemoveLast();
11836 if (current->IsCatchContext()) { 11940 Handle<Context> current = context_chain.RemoveLast();
11837 Handle<String> name(String::cast(current->extension())); 11941 ASSERT(!(scope_info->HasContext() & current.is_null()));
11838 Handle<Object> thrown_object(current->get(Context::THROWN_OBJECT_INDEX)); 11942
11839 new_current = 11943 if (scope_info->Type() == CATCH_SCOPE) {
11840 isolate->factory()->NewCatchContext(function, 11944 Handle<String> name(String::cast(current->extension()));
11841 new_previous, 11945 Handle<Object> thrown_object(current->get(Context::THROWN_OBJECT_INDEX));
11842 name, 11946 context =
11843 thrown_object); 11947 isolate->factory()->NewCatchContext(function,
11844 } else if (current->IsBlockContext()) { 11948 context,
11845 Handle<ScopeInfo> scope_info(ScopeInfo::cast(current->extension())); 11949 name,
11846 new_current = 11950 thrown_object);
11847 isolate->factory()->NewBlockContext(function, new_previous, scope_info); 11951 } else if (scope_info->Type() == BLOCK_SCOPE) {
11848 // Copy context slots. 11952 // Materialize the contents of the block scope into a JSObject.
11849 int num_context_slots = scope_info->ContextLength(); 11953 Handle<JSObject> block_scope_object =
11850 for (int i = Context::MIN_CONTEXT_SLOTS; i < num_context_slots; ++i) { 11954 MaterializeBlockScope(isolate, current);
11851 new_current->set(i, current->get(i)); 11955 if (block_scope_object.is_null()) {
11956 return Handle<Context>::null();
11957 }
11958 // Allocate a new function context for the debug evaluation and set the
11959 // extension object.
11960 Handle<Context> new_context =
11961 isolate->factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS,
11962 function);
11963 new_context->set_extension(*block_scope_object);
11964 new_context->set_previous(*context);
11965 context = new_context;
11966 } else {
11967 ASSERT(scope_info->Type() == WITH_SCOPE);
11968 ASSERT(current->IsWithContext());
11969 Handle<JSObject> extension(JSObject::cast(current->extension()));
11970 context =
11971 isolate->factory()->NewWithContext(function, context, extension);
11852 } 11972 }
11853 } else {
11854 ASSERT(current->IsWithContext());
11855 Handle<JSObject> extension(JSObject::cast(current->extension()));
11856 new_current =
11857 isolate->factory()->NewWithContext(function, new_previous, extension);
11858 } 11973 }
11859 return scope.CloseAndEscape(new_current); 11974
11975 return scope.CloseAndEscape(context);
11860 } 11976 }
11861 11977
11862 11978
11863 // Helper function to find or create the arguments object for 11979 // Helper function to find or create the arguments object for
11864 // Runtime_DebugEvaluate. 11980 // Runtime_DebugEvaluate.
11865 static Handle<Object> GetArgumentsObject(Isolate* isolate, 11981 static Handle<Object> GetArgumentsObject(Isolate* isolate,
11866 JavaScriptFrame* frame, 11982 JavaScriptFrame* frame,
11867 int inlined_frame_index, 11983 int inlined_frame_index,
11868 Handle<JSFunction> function, 11984 Handle<JSFunction> function,
11869 Handle<ScopeInfo> scope_info, 11985 Handle<ScopeInfo> scope_info,
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
11984 isolate->factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, 12100 isolate->factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS,
11985 go_between); 12101 go_between);
11986 context->set_extension(*local_scope); 12102 context->set_extension(*local_scope);
11987 // Copy any with contexts present and chain them in front of this context. 12103 // Copy any with contexts present and chain them in front of this context.
11988 Handle<Context> frame_context(Context::cast(frame->context())); 12104 Handle<Context> frame_context(Context::cast(frame->context()));
11989 Handle<Context> function_context; 12105 Handle<Context> function_context;
11990 // Get the function's context if it has one. 12106 // Get the function's context if it has one.
11991 if (scope_info->HasContext()) { 12107 if (scope_info->HasContext()) {
11992 function_context = Handle<Context>(frame_context->declaration_context()); 12108 function_context = Handle<Context>(frame_context->declaration_context());
11993 } 12109 }
11994 context = CopyWithContextChain(isolate, go_between, frame_context, context); 12110 context = CopyNestedScopeContextChain(isolate,
12111 go_between,
12112 context,
12113 frame,
12114 inlined_frame_index);
11995 12115
11996 if (additional_context->IsJSObject()) { 12116 if (additional_context->IsJSObject()) {
11997 Handle<JSObject> extension = Handle<JSObject>::cast(additional_context); 12117 Handle<JSObject> extension = Handle<JSObject>::cast(additional_context);
11998 context = 12118 context =
11999 isolate->factory()->NewWithContext(go_between, context, extension); 12119 isolate->factory()->NewWithContext(go_between, context, extension);
12000 } 12120 }
12001 12121
12002 // Wrap the evaluation statement in a new function compiled in the newly 12122 // Wrap the evaluation statement in a new function compiled in the newly
12003 // created context. The function has one parameter which has to be called 12123 // created context. The function has one parameter which has to be called
12004 // 'arguments'. This it to have access to what would have been 'arguments' in 12124 // 'arguments'. This it to have access to what would have been 'arguments' in
(...skipping 1434 matching lines...) Expand 10 before | Expand all | Expand 10 after
13439 } else { 13559 } else {
13440 // Handle last resort GC and make sure to allow future allocations 13560 // Handle last resort GC and make sure to allow future allocations
13441 // to grow the heap without causing GCs (if possible). 13561 // to grow the heap without causing GCs (if possible).
13442 isolate->counters()->gc_last_resort_from_js()->Increment(); 13562 isolate->counters()->gc_last_resort_from_js()->Increment();
13443 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); 13563 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
13444 } 13564 }
13445 } 13565 }
13446 13566
13447 13567
13448 } } // namespace v8::internal 13568 } } // namespace v8::internal
OLDNEW
« src/compiler.cc ('K') | « src/rewriter.cc ('k') | src/scopes.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698