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 11265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11276 // Fill all context locals. | 11276 // Fill all context locals. |
11277 if (!CopyContextLocalsToScopeObject( | 11277 if (!CopyContextLocalsToScopeObject( |
11278 isolate, scope_info, context, block_scope)) { | 11278 isolate, scope_info, context, block_scope)) { |
11279 return Handle<JSObject>(); | 11279 return Handle<JSObject>(); |
11280 } | 11280 } |
11281 | 11281 |
11282 return block_scope; | 11282 return block_scope; |
11283 } | 11283 } |
11284 | 11284 |
11285 | 11285 |
| 11286 // Create a plain JSObject which materializes the module scope for the specified |
| 11287 // module context. |
| 11288 static Handle<JSObject> MaterializeModuleScope( |
| 11289 Isolate* isolate, |
| 11290 Handle<Context> context) { |
| 11291 ASSERT(context->IsModuleContext()); |
| 11292 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension())); |
| 11293 |
| 11294 // Allocate and initialize a JSObject with all the members of the debugged |
| 11295 // module. |
| 11296 Handle<JSObject> module_scope = |
| 11297 isolate->factory()->NewJSObject(isolate->object_function()); |
| 11298 |
| 11299 // Fill all context locals. |
| 11300 if (!CopyContextLocalsToScopeObject( |
| 11301 isolate, scope_info, context, module_scope)) { |
| 11302 return Handle<JSObject>(); |
| 11303 } |
| 11304 |
| 11305 return module_scope; |
| 11306 } |
| 11307 |
| 11308 |
11286 // Iterate over the actual scopes visible from a stack frame. The iteration | 11309 // Iterate over the actual scopes visible from a stack frame. The iteration |
11287 // proceeds from the innermost visible nested scope outwards. All scopes are | 11310 // proceeds from the innermost visible nested scope outwards. All scopes are |
11288 // backed by an actual context except the local scope, which is inserted | 11311 // backed by an actual context except the local scope, which is inserted |
11289 // "artificially" in the context chain. | 11312 // "artificially" in the context chain. |
11290 class ScopeIterator { | 11313 class ScopeIterator { |
11291 public: | 11314 public: |
11292 enum ScopeType { | 11315 enum ScopeType { |
11293 ScopeTypeGlobal = 0, | 11316 ScopeTypeGlobal = 0, |
11294 ScopeTypeLocal, | 11317 ScopeTypeLocal, |
11295 ScopeTypeWith, | 11318 ScopeTypeWith, |
11296 ScopeTypeClosure, | 11319 ScopeTypeClosure, |
11297 ScopeTypeCatch, | 11320 ScopeTypeCatch, |
11298 ScopeTypeBlock | 11321 ScopeTypeBlock, |
| 11322 ScopeTypeModule |
11299 }; | 11323 }; |
11300 | 11324 |
11301 ScopeIterator(Isolate* isolate, | 11325 ScopeIterator(Isolate* isolate, |
11302 JavaScriptFrame* frame, | 11326 JavaScriptFrame* frame, |
11303 int inlined_jsframe_index) | 11327 int inlined_jsframe_index) |
11304 : isolate_(isolate), | 11328 : isolate_(isolate), |
11305 frame_(frame), | 11329 frame_(frame), |
11306 inlined_jsframe_index_(inlined_jsframe_index), | 11330 inlined_jsframe_index_(inlined_jsframe_index), |
11307 function_(JSFunction::cast(frame->function())), | 11331 function_(JSFunction::cast(frame->function())), |
11308 context_(Context::cast(frame->context())), | 11332 context_(Context::cast(frame->context())), |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11411 | 11435 |
11412 // Return the type of the current scope. | 11436 // Return the type of the current scope. |
11413 ScopeType Type() { | 11437 ScopeType Type() { |
11414 if (!nested_scope_chain_.is_empty()) { | 11438 if (!nested_scope_chain_.is_empty()) { |
11415 Handle<ScopeInfo> scope_info = nested_scope_chain_.last(); | 11439 Handle<ScopeInfo> scope_info = nested_scope_chain_.last(); |
11416 switch (scope_info->Type()) { | 11440 switch (scope_info->Type()) { |
11417 case FUNCTION_SCOPE: | 11441 case FUNCTION_SCOPE: |
11418 ASSERT(context_->IsFunctionContext() || | 11442 ASSERT(context_->IsFunctionContext() || |
11419 !scope_info->HasContext()); | 11443 !scope_info->HasContext()); |
11420 return ScopeTypeLocal; | 11444 return ScopeTypeLocal; |
| 11445 case MODULE_SCOPE: |
| 11446 ASSERT(context_->IsModuleContext()); |
| 11447 return ScopeTypeModule; |
11421 case GLOBAL_SCOPE: | 11448 case GLOBAL_SCOPE: |
11422 ASSERT(context_->IsGlobalContext()); | 11449 ASSERT(context_->IsGlobalContext()); |
11423 return ScopeTypeGlobal; | 11450 return ScopeTypeGlobal; |
11424 case WITH_SCOPE: | 11451 case WITH_SCOPE: |
11425 ASSERT(context_->IsWithContext()); | 11452 ASSERT(context_->IsWithContext()); |
11426 return ScopeTypeWith; | 11453 return ScopeTypeWith; |
11427 case CATCH_SCOPE: | 11454 case CATCH_SCOPE: |
11428 ASSERT(context_->IsCatchContext()); | 11455 ASSERT(context_->IsCatchContext()); |
11429 return ScopeTypeCatch; | 11456 return ScopeTypeCatch; |
11430 case BLOCK_SCOPE: | 11457 case BLOCK_SCOPE: |
(...skipping 10 matching lines...) Expand all Loading... |
11441 } | 11468 } |
11442 if (context_->IsFunctionContext()) { | 11469 if (context_->IsFunctionContext()) { |
11443 return ScopeTypeClosure; | 11470 return ScopeTypeClosure; |
11444 } | 11471 } |
11445 if (context_->IsCatchContext()) { | 11472 if (context_->IsCatchContext()) { |
11446 return ScopeTypeCatch; | 11473 return ScopeTypeCatch; |
11447 } | 11474 } |
11448 if (context_->IsBlockContext()) { | 11475 if (context_->IsBlockContext()) { |
11449 return ScopeTypeBlock; | 11476 return ScopeTypeBlock; |
11450 } | 11477 } |
| 11478 if (context_->IsModuleContext()) { |
| 11479 return ScopeTypeModule; |
| 11480 } |
11451 ASSERT(context_->IsWithContext()); | 11481 ASSERT(context_->IsWithContext()); |
11452 return ScopeTypeWith; | 11482 return ScopeTypeWith; |
11453 } | 11483 } |
11454 | 11484 |
11455 // Return the JavaScript object with the content of the current scope. | 11485 // Return the JavaScript object with the content of the current scope. |
11456 Handle<JSObject> ScopeObject() { | 11486 Handle<JSObject> ScopeObject() { |
11457 switch (Type()) { | 11487 switch (Type()) { |
11458 case ScopeIterator::ScopeTypeGlobal: | 11488 case ScopeIterator::ScopeTypeGlobal: |
11459 return Handle<JSObject>(CurrentContext()->global()); | 11489 return Handle<JSObject>(CurrentContext()->global()); |
11460 case ScopeIterator::ScopeTypeLocal: | 11490 case ScopeIterator::ScopeTypeLocal: |
11461 // Materialize the content of the local scope into a JSObject. | 11491 // Materialize the content of the local scope into a JSObject. |
11462 ASSERT(nested_scope_chain_.length() == 1); | 11492 ASSERT(nested_scope_chain_.length() == 1); |
11463 return MaterializeLocalScope(isolate_, frame_, inlined_jsframe_index_); | 11493 return MaterializeLocalScope(isolate_, frame_, inlined_jsframe_index_); |
11464 case ScopeIterator::ScopeTypeWith: | 11494 case ScopeIterator::ScopeTypeWith: |
11465 // Return the with object. | 11495 // Return the with object. |
11466 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension())); | 11496 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension())); |
11467 case ScopeIterator::ScopeTypeCatch: | 11497 case ScopeIterator::ScopeTypeCatch: |
11468 return MaterializeCatchScope(isolate_, CurrentContext()); | 11498 return MaterializeCatchScope(isolate_, CurrentContext()); |
11469 case ScopeIterator::ScopeTypeClosure: | 11499 case ScopeIterator::ScopeTypeClosure: |
11470 // Materialize the content of the closure scope into a JSObject. | 11500 // Materialize the content of the closure scope into a JSObject. |
11471 return MaterializeClosure(isolate_, CurrentContext()); | 11501 return MaterializeClosure(isolate_, CurrentContext()); |
11472 case ScopeIterator::ScopeTypeBlock: | 11502 case ScopeIterator::ScopeTypeBlock: |
11473 return MaterializeBlockScope(isolate_, CurrentContext()); | 11503 return MaterializeBlockScope(isolate_, CurrentContext()); |
| 11504 case ScopeIterator::ScopeTypeModule: |
| 11505 return MaterializeModuleScope(isolate_, CurrentContext()); |
11474 } | 11506 } |
11475 UNREACHABLE(); | 11507 UNREACHABLE(); |
11476 return Handle<JSObject>(); | 11508 return Handle<JSObject>(); |
11477 } | 11509 } |
11478 | 11510 |
11479 Handle<ScopeInfo> CurrentScopeInfo() { | 11511 Handle<ScopeInfo> CurrentScopeInfo() { |
11480 if (!nested_scope_chain_.is_empty()) { | 11512 if (!nested_scope_chain_.is_empty()) { |
11481 return nested_scope_chain_.last(); | 11513 return nested_scope_chain_.last(); |
11482 } else if (context_->IsBlockContext()) { | 11514 } else if (context_->IsBlockContext()) { |
11483 return Handle<ScopeInfo>(ScopeInfo::cast(context_->extension())); | 11515 return Handle<ScopeInfo>(ScopeInfo::cast(context_->extension())); |
(...skipping 2188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13672 // Handle last resort GC and make sure to allow future allocations | 13704 // Handle last resort GC and make sure to allow future allocations |
13673 // to grow the heap without causing GCs (if possible). | 13705 // to grow the heap without causing GCs (if possible). |
13674 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13706 isolate->counters()->gc_last_resort_from_js()->Increment(); |
13675 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 13707 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
13676 "Runtime::PerformGC"); | 13708 "Runtime::PerformGC"); |
13677 } | 13709 } |
13678 } | 13710 } |
13679 | 13711 |
13680 | 13712 |
13681 } } // namespace v8::internal | 13713 } } // namespace v8::internal |
OLD | NEW |