| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/debug/debug-scopes.h" | 5 #include "src/debug/debug-scopes.h" |
| 6 | 6 |
| 7 #include "src/debug/debug.h" | 7 #include "src/debug/debug.h" |
| 8 #include "src/frames-inl.h" | 8 #include "src/frames-inl.h" |
| 9 #include "src/globals.h" | 9 #include "src/globals.h" |
| 10 #include "src/parser.h" | 10 #include "src/parser.h" |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 case ScopeIterator::ScopeTypeGlobal: | 230 case ScopeIterator::ScopeTypeGlobal: |
| 231 return Handle<JSObject>(CurrentContext()->global_proxy()); | 231 return Handle<JSObject>(CurrentContext()->global_proxy()); |
| 232 case ScopeIterator::ScopeTypeScript: | 232 case ScopeIterator::ScopeTypeScript: |
| 233 return MaterializeScriptScope(); | 233 return MaterializeScriptScope(); |
| 234 case ScopeIterator::ScopeTypeLocal: | 234 case ScopeIterator::ScopeTypeLocal: |
| 235 // Materialize the content of the local scope into a JSObject. | 235 // Materialize the content of the local scope into a JSObject. |
| 236 DCHECK(nested_scope_chain_.length() == 1); | 236 DCHECK(nested_scope_chain_.length() == 1); |
| 237 return MaterializeLocalScope(); | 237 return MaterializeLocalScope(); |
| 238 case ScopeIterator::ScopeTypeWith: | 238 case ScopeIterator::ScopeTypeWith: |
| 239 // Return the with object. | 239 // Return the with object. |
| 240 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension())); | 240 // TODO(neis): This breaks for proxies. |
| 241 return handle(JSObject::cast(CurrentContext()->extension_receiver())); |
| 241 case ScopeIterator::ScopeTypeCatch: | 242 case ScopeIterator::ScopeTypeCatch: |
| 242 return MaterializeCatchScope(); | 243 return MaterializeCatchScope(); |
| 243 case ScopeIterator::ScopeTypeClosure: | 244 case ScopeIterator::ScopeTypeClosure: |
| 244 // Materialize the content of the closure scope into a JSObject. | 245 // Materialize the content of the closure scope into a JSObject. |
| 245 return MaterializeClosure(); | 246 return MaterializeClosure(); |
| 246 case ScopeIterator::ScopeTypeBlock: | 247 case ScopeIterator::ScopeTypeBlock: |
| 247 return MaterializeBlockScope(); | 248 return MaterializeBlockScope(); |
| 248 case ScopeIterator::ScopeTypeModule: | 249 case ScopeIterator::ScopeTypeModule: |
| 249 return MaterializeModuleScope(); | 250 return MaterializeModuleScope(); |
| 250 } | 251 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 } | 289 } |
| 289 return false; | 290 return false; |
| 290 } | 291 } |
| 291 | 292 |
| 292 | 293 |
| 293 Handle<ScopeInfo> ScopeIterator::CurrentScopeInfo() { | 294 Handle<ScopeInfo> ScopeIterator::CurrentScopeInfo() { |
| 294 DCHECK(!failed_); | 295 DCHECK(!failed_); |
| 295 if (!nested_scope_chain_.is_empty()) { | 296 if (!nested_scope_chain_.is_empty()) { |
| 296 return nested_scope_chain_.last(); | 297 return nested_scope_chain_.last(); |
| 297 } else if (context_->IsBlockContext()) { | 298 } else if (context_->IsBlockContext()) { |
| 298 return Handle<ScopeInfo>(ScopeInfo::cast(context_->extension())); | 299 return Handle<ScopeInfo>(context_->scope_info()); |
| 299 } else if (context_->IsFunctionContext()) { | 300 } else if (context_->IsFunctionContext()) { |
| 300 return Handle<ScopeInfo>(context_->closure()->shared()->scope_info()); | 301 return Handle<ScopeInfo>(context_->closure()->shared()->scope_info()); |
| 301 } | 302 } |
| 302 return Handle<ScopeInfo>::null(); | 303 return Handle<ScopeInfo>::null(); |
| 303 } | 304 } |
| 304 | 305 |
| 305 | 306 |
| 306 Handle<Context> ScopeIterator::CurrentContext() { | 307 Handle<Context> ScopeIterator::CurrentContext() { |
| 307 DCHECK(!failed_); | 308 DCHECK(!failed_); |
| 308 if (Type() == ScopeTypeGlobal || Type() == ScopeTypeScript || | 309 if (Type() == ScopeTypeGlobal || Type() == ScopeTypeScript || |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 Handle<ScriptContextTable> script_contexts( | 404 Handle<ScriptContextTable> script_contexts( |
| 404 global->native_context()->script_context_table()); | 405 global->native_context()->script_context_table()); |
| 405 | 406 |
| 406 Handle<JSObject> script_scope = | 407 Handle<JSObject> script_scope = |
| 407 isolate_->factory()->NewJSObject(isolate_->object_function()); | 408 isolate_->factory()->NewJSObject(isolate_->object_function()); |
| 408 | 409 |
| 409 for (int context_index = 0; context_index < script_contexts->used(); | 410 for (int context_index = 0; context_index < script_contexts->used(); |
| 410 context_index++) { | 411 context_index++) { |
| 411 Handle<Context> context = | 412 Handle<Context> context = |
| 412 ScriptContextTable::GetContext(script_contexts, context_index); | 413 ScriptContextTable::GetContext(script_contexts, context_index); |
| 413 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension())); | 414 Handle<ScopeInfo> scope_info(context->scope_info()); |
| 414 CopyContextLocalsToScopeObject(scope_info, context, script_scope); | 415 CopyContextLocalsToScopeObject(scope_info, context, script_scope); |
| 415 } | 416 } |
| 416 return script_scope; | 417 return script_scope; |
| 417 } | 418 } |
| 418 | 419 |
| 419 | 420 |
| 420 MaybeHandle<JSObject> ScopeIterator::MaterializeLocalScope() { | 421 MaybeHandle<JSObject> ScopeIterator::MaterializeLocalScope() { |
| 421 Handle<JSFunction> function = GetFunction(); | 422 Handle<JSFunction> function = GetFunction(); |
| 422 | 423 |
| 423 Handle<JSObject> local_scope = | 424 Handle<JSObject> local_scope = |
| 424 isolate_->factory()->NewJSObject(isolate_->object_function()); | 425 isolate_->factory()->NewJSObject(isolate_->object_function()); |
| 425 frame_inspector_->MaterializeStackLocals(local_scope, function); | 426 frame_inspector_->MaterializeStackLocals(local_scope, function); |
| 426 | 427 |
| 427 Handle<Context> frame_context(Context::cast(frame_inspector_->GetContext())); | 428 Handle<Context> frame_context(Context::cast(frame_inspector_->GetContext())); |
| 428 | 429 |
| 429 HandleScope scope(isolate_); | 430 HandleScope scope(isolate_); |
| 430 Handle<SharedFunctionInfo> shared(function->shared()); | 431 Handle<SharedFunctionInfo> shared(function->shared()); |
| 431 Handle<ScopeInfo> scope_info(shared->scope_info()); | 432 Handle<ScopeInfo> scope_info(shared->scope_info()); |
| 432 | 433 |
| 433 if (!scope_info->HasContext()) return local_scope; | 434 if (!scope_info->HasContext()) return local_scope; |
| 434 | 435 |
| 435 // Third fill all context locals. | 436 // Third fill all context locals. |
| 436 Handle<Context> function_context(frame_context->declaration_context()); | 437 Handle<Context> function_context(frame_context->declaration_context()); |
| 437 CopyContextLocalsToScopeObject(scope_info, function_context, local_scope); | 438 CopyContextLocalsToScopeObject(scope_info, function_context, local_scope); |
| 438 | 439 |
| 439 // Finally copy any properties from the function context extension. | 440 // Finally copy any properties from the function context extension. |
| 440 // These will be variables introduced by eval. | 441 // These will be variables introduced by eval. |
| 441 if (function_context->closure() == *function) { | 442 if (function_context->closure() == *function && |
| 442 if (function_context->has_extension() && | 443 function_context->has_extension() && |
| 443 !function_context->IsNativeContext()) { | 444 !function_context->IsNativeContext()) { |
| 444 Handle<JSObject> ext(JSObject::cast(function_context->extension())); | 445 bool success = CopyContextExtensionToScopeObject( |
| 445 Handle<FixedArray> keys; | 446 handle(function_context->extension_object(), isolate_), |
| 446 ASSIGN_RETURN_ON_EXCEPTION( | 447 local_scope, JSReceiver::INCLUDE_PROTOS); |
| 447 isolate_, keys, JSReceiver::GetKeys(ext, JSReceiver::INCLUDE_PROTOS), | 448 if (!success) return MaybeHandle<JSObject>(); |
| 448 JSObject); | |
| 449 | |
| 450 for (int i = 0; i < keys->length(); i++) { | |
| 451 // Names of variables introduced by eval are strings. | |
| 452 DCHECK(keys->get(i)->IsString()); | |
| 453 Handle<String> key(String::cast(keys->get(i))); | |
| 454 Handle<Object> value; | |
| 455 ASSIGN_RETURN_ON_EXCEPTION( | |
| 456 isolate_, value, Object::GetPropertyOrElement(ext, key), JSObject); | |
| 457 RETURN_ON_EXCEPTION(isolate_, | |
| 458 Runtime::SetObjectProperty(isolate_, local_scope, | |
| 459 key, value, SLOPPY), | |
| 460 JSObject); | |
| 461 } | |
| 462 } | |
| 463 } | 449 } |
| 464 | 450 |
| 465 return local_scope; | 451 return local_scope; |
| 466 } | 452 } |
| 467 | 453 |
| 468 | 454 |
| 469 // Create a plain JSObject which materializes the closure content for the | 455 // Create a plain JSObject which materializes the closure content for the |
| 470 // context. | 456 // context. |
| 471 Handle<JSObject> ScopeIterator::MaterializeClosure() { | 457 Handle<JSObject> ScopeIterator::MaterializeClosure() { |
| 472 Handle<Context> context = CurrentContext(); | 458 Handle<Context> context = CurrentContext(); |
| 473 DCHECK(context->IsFunctionContext()); | 459 DCHECK(context->IsFunctionContext()); |
| 474 | 460 |
| 475 Handle<SharedFunctionInfo> shared(context->closure()->shared()); | 461 Handle<SharedFunctionInfo> shared(context->closure()->shared()); |
| 476 Handle<ScopeInfo> scope_info(shared->scope_info()); | 462 Handle<ScopeInfo> scope_info(shared->scope_info()); |
| 477 | 463 |
| 478 // Allocate and initialize a JSObject with all the content of this function | 464 // Allocate and initialize a JSObject with all the content of this function |
| 479 // closure. | 465 // closure. |
| 480 Handle<JSObject> closure_scope = | 466 Handle<JSObject> closure_scope = |
| 481 isolate_->factory()->NewJSObject(isolate_->object_function()); | 467 isolate_->factory()->NewJSObject(isolate_->object_function()); |
| 482 | 468 |
| 483 // Fill all context locals to the context extension. | 469 // Fill all context locals to the context extension. |
| 484 CopyContextLocalsToScopeObject(scope_info, context, closure_scope); | 470 CopyContextLocalsToScopeObject(scope_info, context, closure_scope); |
| 485 | 471 |
| 486 // Finally copy any properties from the function context extension. This will | 472 // Finally copy any properties from the function context extension. This will |
| 487 // be variables introduced by eval. | 473 // be variables introduced by eval. |
| 488 if (context->has_extension()) { | 474 if (context->has_extension()) { |
| 489 Handle<JSObject> ext(JSObject::cast(context->extension())); | 475 bool success = CopyContextExtensionToScopeObject( |
| 490 DCHECK(ext->IsJSContextExtensionObject()); | 476 handle(context->extension_object(), isolate_), closure_scope, |
| 491 Handle<FixedArray> keys = | 477 JSReceiver::OWN_ONLY); |
| 492 JSReceiver::GetKeys(ext, JSReceiver::OWN_ONLY).ToHandleChecked(); | 478 DCHECK(success); |
| 493 | 479 USE(success); |
| 494 for (int i = 0; i < keys->length(); i++) { | |
| 495 HandleScope scope(isolate_); | |
| 496 // Names of variables introduced by eval are strings. | |
| 497 DCHECK(keys->get(i)->IsString()); | |
| 498 Handle<String> key(String::cast(keys->get(i))); | |
| 499 Handle<Object> value = Object::GetProperty(ext, key).ToHandleChecked(); | |
| 500 JSObject::SetOwnPropertyIgnoreAttributes(closure_scope, key, value, NONE) | |
| 501 .Check(); | |
| 502 } | |
| 503 } | 480 } |
| 504 | 481 |
| 505 return closure_scope; | 482 return closure_scope; |
| 506 } | 483 } |
| 507 | 484 |
| 508 | 485 |
| 509 // Create a plain JSObject which materializes the scope for the specified | 486 // Create a plain JSObject which materializes the scope for the specified |
| 510 // catch context. | 487 // catch context. |
| 511 Handle<JSObject> ScopeIterator::MaterializeCatchScope() { | 488 Handle<JSObject> ScopeIterator::MaterializeCatchScope() { |
| 512 Handle<Context> context = CurrentContext(); | 489 Handle<Context> context = CurrentContext(); |
| 513 DCHECK(context->IsCatchContext()); | 490 DCHECK(context->IsCatchContext()); |
| 514 Handle<String> name(String::cast(context->extension())); | 491 Handle<String> name(context->catch_name()); |
| 515 Handle<Object> thrown_object(context->get(Context::THROWN_OBJECT_INDEX), | 492 Handle<Object> thrown_object(context->get(Context::THROWN_OBJECT_INDEX), |
| 516 isolate_); | 493 isolate_); |
| 517 Handle<JSObject> catch_scope = | 494 Handle<JSObject> catch_scope = |
| 518 isolate_->factory()->NewJSObject(isolate_->object_function()); | 495 isolate_->factory()->NewJSObject(isolate_->object_function()); |
| 519 JSObject::SetOwnPropertyIgnoreAttributes(catch_scope, name, thrown_object, | 496 JSObject::SetOwnPropertyIgnoreAttributes(catch_scope, name, thrown_object, |
| 520 NONE) | 497 NONE) |
| 521 .Check(); | 498 .Check(); |
| 522 return catch_scope; | 499 return catch_scope; |
| 523 } | 500 } |
| 524 | 501 |
| 525 | 502 |
| 526 // Create a plain JSObject which materializes the block scope for the specified | 503 // Create a plain JSObject which materializes the block scope for the specified |
| 527 // block context. | 504 // block context. |
| 528 Handle<JSObject> ScopeIterator::MaterializeBlockScope() { | 505 Handle<JSObject> ScopeIterator::MaterializeBlockScope() { |
| 529 Handle<JSObject> block_scope = | 506 Handle<JSObject> block_scope = |
| 530 isolate_->factory()->NewJSObject(isolate_->object_function()); | 507 isolate_->factory()->NewJSObject(isolate_->object_function()); |
| 531 | 508 |
| 532 Handle<Context> context = Handle<Context>::null(); | 509 Handle<Context> context = Handle<Context>::null(); |
| 533 if (!nested_scope_chain_.is_empty()) { | 510 if (!nested_scope_chain_.is_empty()) { |
| 534 Handle<ScopeInfo> scope_info = nested_scope_chain_.last(); | 511 Handle<ScopeInfo> scope_info = nested_scope_chain_.last(); |
| 535 frame_inspector_->MaterializeStackLocals(block_scope, scope_info); | 512 frame_inspector_->MaterializeStackLocals(block_scope, scope_info); |
| 536 if (scope_info->HasContext()) context = CurrentContext(); | 513 if (scope_info->HasContext()) context = CurrentContext(); |
| 537 } else { | 514 } else { |
| 538 context = CurrentContext(); | 515 context = CurrentContext(); |
| 539 } | 516 } |
| 540 | 517 |
| 541 if (!context.is_null()) { | 518 if (!context.is_null()) { |
| 542 Handle<ScopeInfo> scope_info_from_context( | |
| 543 ScopeInfo::cast(context->extension())); | |
| 544 // Fill all context locals. | 519 // Fill all context locals. |
| 545 CopyContextLocalsToScopeObject(scope_info_from_context, context, | 520 CopyContextLocalsToScopeObject(handle(context->scope_info()), |
| 546 block_scope); | 521 context, block_scope); |
| 522 // Fill all extension variables. |
| 523 if (context->extension_object() != nullptr) { |
| 524 bool success = CopyContextExtensionToScopeObject( |
| 525 handle(context->extension_object()), block_scope, |
| 526 JSReceiver::OWN_ONLY); |
| 527 DCHECK(success); |
| 528 USE(success); |
| 529 } |
| 547 } | 530 } |
| 548 return block_scope; | 531 return block_scope; |
| 549 } | 532 } |
| 550 | 533 |
| 551 | 534 |
| 552 // Create a plain JSObject which materializes the module scope for the specified | 535 // Create a plain JSObject which materializes the module scope for the specified |
| 553 // module context. | 536 // module context. |
| 554 MaybeHandle<JSObject> ScopeIterator::MaterializeModuleScope() { | 537 MaybeHandle<JSObject> ScopeIterator::MaterializeModuleScope() { |
| 555 Handle<Context> context = CurrentContext(); | 538 Handle<Context> context = CurrentContext(); |
| 556 DCHECK(context->IsModuleContext()); | 539 DCHECK(context->IsModuleContext()); |
| 557 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension())); | 540 Handle<ScopeInfo> scope_info(context->scope_info()); |
| 558 | 541 |
| 559 // Allocate and initialize a JSObject with all the members of the debugged | 542 // Allocate and initialize a JSObject with all the members of the debugged |
| 560 // module. | 543 // module. |
| 561 Handle<JSObject> module_scope = | 544 Handle<JSObject> module_scope = |
| 562 isolate_->factory()->NewJSObject(isolate_->object_function()); | 545 isolate_->factory()->NewJSObject(isolate_->object_function()); |
| 563 | 546 |
| 564 // Fill all context locals. | 547 // Fill all context locals. |
| 565 CopyContextLocalsToScopeObject(scope_info, context, module_scope); | 548 CopyContextLocalsToScopeObject(scope_info, context, module_scope); |
| 566 | 549 |
| 567 return module_scope; | 550 return module_scope; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 629 Handle<Context> function_context(frame_context->declaration_context()); | 612 Handle<Context> function_context(frame_context->declaration_context()); |
| 630 if (SetContextLocalValue(scope_info, function_context, variable_name, | 613 if (SetContextLocalValue(scope_info, function_context, variable_name, |
| 631 new_value)) { | 614 new_value)) { |
| 632 return true; | 615 return true; |
| 633 } | 616 } |
| 634 | 617 |
| 635 // Function context extension. These are variables introduced by eval. | 618 // Function context extension. These are variables introduced by eval. |
| 636 if (function_context->closure() == *function) { | 619 if (function_context->closure() == *function) { |
| 637 if (function_context->has_extension() && | 620 if (function_context->has_extension() && |
| 638 !function_context->IsNativeContext()) { | 621 !function_context->IsNativeContext()) { |
| 639 Handle<JSObject> ext(JSObject::cast(function_context->extension())); | 622 Handle<JSObject> ext(function_context->extension_object()); |
| 640 | 623 |
| 641 Maybe<bool> maybe = JSReceiver::HasProperty(ext, variable_name); | 624 Maybe<bool> maybe = JSReceiver::HasProperty(ext, variable_name); |
| 642 DCHECK(maybe.IsJust()); | 625 DCHECK(maybe.IsJust()); |
| 643 if (maybe.FromJust()) { | 626 if (maybe.FromJust()) { |
| 644 // We don't expect this to do anything except replacing | 627 // We don't expect this to do anything except replacing |
| 645 // property value. | 628 // property value. |
| 646 Runtime::SetObjectProperty(isolate_, ext, variable_name, new_value, | 629 Runtime::SetObjectProperty(isolate_, ext, variable_name, new_value, |
| 647 SLOPPY) | 630 SLOPPY) |
| 648 .Assert(); | 631 .Assert(); |
| 649 return true; | 632 return true; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 663 | 646 |
| 664 for (int i = 0; i < scope_info->StackLocalCount(); ++i) { | 647 for (int i = 0; i < scope_info->StackLocalCount(); ++i) { |
| 665 HandleScope scope(isolate_); | 648 HandleScope scope(isolate_); |
| 666 if (String::Equals(handle(scope_info->StackLocalName(i)), variable_name)) { | 649 if (String::Equals(handle(scope_info->StackLocalName(i)), variable_name)) { |
| 667 frame->SetExpression(scope_info->StackLocalIndex(i), *new_value); | 650 frame->SetExpression(scope_info->StackLocalIndex(i), *new_value); |
| 668 return true; | 651 return true; |
| 669 } | 652 } |
| 670 } | 653 } |
| 671 | 654 |
| 672 if (HasContext()) { | 655 if (HasContext()) { |
| 673 return SetContextLocalValue(scope_info, CurrentContext(), variable_name, | 656 Handle<Context> context = CurrentContext(); |
| 674 new_value); | 657 if (SetContextLocalValue(scope_info, context, variable_name, new_value)) { |
| 658 return true; |
| 659 } |
| 660 |
| 661 Handle<JSObject> ext(context->extension_object(), isolate_); |
| 662 if (!ext.is_null()) { |
| 663 Maybe<bool> maybe = JSReceiver::HasOwnProperty(ext, variable_name); |
| 664 DCHECK(maybe.IsJust()); |
| 665 if (maybe.FromJust()) { |
| 666 // We don't expect this to do anything except replacing property value. |
| 667 JSObject::SetOwnPropertyIgnoreAttributes(ext, variable_name, new_value, |
| 668 NONE) |
| 669 .Check(); |
| 670 return true; |
| 671 } |
| 672 } |
| 675 } | 673 } |
| 674 |
| 676 return false; | 675 return false; |
| 677 } | 676 } |
| 678 | 677 |
| 679 | 678 |
| 680 // This method copies structure of MaterializeClosure method above. | 679 // This method copies structure of MaterializeClosure method above. |
| 681 bool ScopeIterator::SetClosureVariableValue(Handle<String> variable_name, | 680 bool ScopeIterator::SetClosureVariableValue(Handle<String> variable_name, |
| 682 Handle<Object> new_value) { | 681 Handle<Object> new_value) { |
| 683 Handle<Context> context = CurrentContext(); | 682 Handle<Context> context = CurrentContext(); |
| 684 DCHECK(context->IsFunctionContext()); | 683 DCHECK(context->IsFunctionContext()); |
| 685 | 684 |
| 686 // Context locals to the context extension. | 685 // Context locals to the context extension. |
| 687 Handle<SharedFunctionInfo> shared(context->closure()->shared()); | 686 Handle<SharedFunctionInfo> shared(context->closure()->shared()); |
| 688 Handle<ScopeInfo> scope_info(shared->scope_info()); | 687 Handle<ScopeInfo> scope_info(shared->scope_info()); |
| 689 if (SetContextLocalValue(scope_info, context, variable_name, new_value)) { | 688 if (SetContextLocalValue(scope_info, context, variable_name, new_value)) { |
| 690 return true; | 689 return true; |
| 691 } | 690 } |
| 692 | 691 |
| 693 // Properties from the function context extension. This will | 692 // Properties from the function context extension. This will |
| 694 // be variables introduced by eval. | 693 // be variables introduced by eval. |
| 695 if (context->has_extension()) { | 694 if (context->has_extension()) { |
| 696 Handle<JSObject> ext(JSObject::cast(context->extension())); | 695 Handle<JSObject> ext(JSObject::cast(context->extension_object())); |
| 697 DCHECK(ext->IsJSContextExtensionObject()); | |
| 698 Maybe<bool> maybe = JSReceiver::HasOwnProperty(ext, variable_name); | 696 Maybe<bool> maybe = JSReceiver::HasOwnProperty(ext, variable_name); |
| 699 DCHECK(maybe.IsJust()); | 697 DCHECK(maybe.IsJust()); |
| 700 if (maybe.FromJust()) { | 698 if (maybe.FromJust()) { |
| 701 // We don't expect this to do anything except replacing property value. | 699 // We don't expect this to do anything except replacing property value. |
| 702 JSObject::SetOwnPropertyIgnoreAttributes(ext, variable_name, new_value, | 700 JSObject::SetOwnPropertyIgnoreAttributes(ext, variable_name, new_value, |
| 703 NONE) | 701 NONE) |
| 704 .Check(); | 702 .Check(); |
| 705 return true; | 703 return true; |
| 706 } | 704 } |
| 707 } | 705 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 725 } | 723 } |
| 726 | 724 |
| 727 return false; | 725 return false; |
| 728 } | 726 } |
| 729 | 727 |
| 730 | 728 |
| 731 bool ScopeIterator::SetCatchVariableValue(Handle<String> variable_name, | 729 bool ScopeIterator::SetCatchVariableValue(Handle<String> variable_name, |
| 732 Handle<Object> new_value) { | 730 Handle<Object> new_value) { |
| 733 Handle<Context> context = CurrentContext(); | 731 Handle<Context> context = CurrentContext(); |
| 734 DCHECK(context->IsCatchContext()); | 732 DCHECK(context->IsCatchContext()); |
| 735 Handle<String> name(String::cast(context->extension())); | 733 Handle<String> name(context->catch_name()); |
| 736 if (!String::Equals(name, variable_name)) { | 734 if (!String::Equals(name, variable_name)) { |
| 737 return false; | 735 return false; |
| 738 } | 736 } |
| 739 context->set(Context::THROWN_OBJECT_INDEX, *new_value); | 737 context->set(Context::THROWN_OBJECT_INDEX, *new_value); |
| 740 return true; | 738 return true; |
| 741 } | 739 } |
| 742 | 740 |
| 743 | 741 |
| 744 void ScopeIterator::CopyContextLocalsToScopeObject( | 742 void ScopeIterator::CopyContextLocalsToScopeObject( |
| 745 Handle<ScopeInfo> scope_info, Handle<Context> context, | 743 Handle<ScopeInfo> scope_info, Handle<Context> context, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 758 if (value->IsTheHole()) continue; | 756 if (value->IsTheHole()) continue; |
| 759 // This should always succeed. | 757 // This should always succeed. |
| 760 // TODO(verwaest): Use AddDataProperty instead. | 758 // TODO(verwaest): Use AddDataProperty instead. |
| 761 JSObject::SetOwnPropertyIgnoreAttributes( | 759 JSObject::SetOwnPropertyIgnoreAttributes( |
| 762 scope_object, handle(String::cast(scope_info->get(i + start))), value, | 760 scope_object, handle(String::cast(scope_info->get(i + start))), value, |
| 763 ::NONE) | 761 ::NONE) |
| 764 .Check(); | 762 .Check(); |
| 765 } | 763 } |
| 766 } | 764 } |
| 767 | 765 |
| 766 |
| 767 bool ScopeIterator::CopyContextExtensionToScopeObject( |
| 768 Handle<JSObject> extension, Handle<JSObject> scope_object, |
| 769 JSReceiver::KeyCollectionType type) { |
| 770 Handle<FixedArray> keys; |
| 771 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
| 772 isolate_, keys, JSReceiver::GetKeys(extension, type), false); |
| 773 |
| 774 for (int i = 0; i < keys->length(); i++) { |
| 775 // Names of variables introduced by eval are strings. |
| 776 DCHECK(keys->get(i)->IsString()); |
| 777 Handle<String> key(String::cast(keys->get(i))); |
| 778 Handle<Object> value; |
| 779 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
| 780 isolate_, value, Object::GetPropertyOrElement(extension, key), false); |
| 781 RETURN_ON_EXCEPTION_VALUE( |
| 782 isolate_, JSObject::SetOwnPropertyIgnoreAttributes( |
| 783 scope_object, key, value, NONE), false); |
| 784 } |
| 785 return true; |
| 786 } |
| 787 |
| 768 } // namespace internal | 788 } // namespace internal |
| 769 } // namespace v8 | 789 } // namespace v8 |
| OLD | NEW |