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

Side by Side Diff: src/runtime.cc

Issue 11412310: Issue 2399 part 2: In debugger allow modifying local variable values (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: follow code review Created 8 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
« no previous file with comments | « src/frames.cc ('k') | test/mjsunit/debug-set-variable-value.js » ('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 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 10780 matching lines...) Expand 10 before | Expand all | Expand 10 after
10791 Isolate* isolate, 10791 Isolate* isolate,
10792 JavaScriptFrame* frame, 10792 JavaScriptFrame* frame,
10793 int inlined_jsframe_index) { 10793 int inlined_jsframe_index) {
10794 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate); 10794 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate);
10795 return MaterializeLocalScopeWithFrameInspector(isolate, 10795 return MaterializeLocalScopeWithFrameInspector(isolate,
10796 frame, 10796 frame,
10797 &frame_inspector); 10797 &frame_inspector);
10798 } 10798 }
10799 10799
10800 10800
10801 // Set the context local variable value.
10802 static bool SetContextLocalValue(Isolate* isolate,
10803 Handle<ScopeInfo> scope_info,
10804 Handle<Context> context,
10805 Handle<String> variable_name,
10806 Handle<Object> new_value) {
10807 for (int i = 0; i < scope_info->ContextLocalCount(); i++) {
10808 Handle<String> next_name(scope_info->ContextLocalName(i));
10809 if (variable_name->Equals(*next_name)) {
10810 VariableMode mode;
10811 InitializationFlag init_flag;
10812 int context_index =
10813 scope_info->ContextSlotIndex(*next_name, &mode, &init_flag);
10814 context->set(context_index, *new_value);
10815 return true;
10816 }
10817 }
10818
10819 return false;
10820 }
10821
10822
10823 static bool SetLocalVariableValue(Isolate* isolate,
10824 JavaScriptFrame* frame,
10825 int inlined_jsframe_index,
10826 Handle<String> variable_name,
10827 Handle<Object> new_value) {
10828 if (inlined_jsframe_index != 0 || frame->is_optimized()) {
10829 // Optimized frames are not supported.
10830 return false;
10831 }
10832
10833 Handle<JSFunction> function(JSFunction::cast(frame->function()));
10834 Handle<SharedFunctionInfo> shared(function->shared());
10835 Handle<ScopeInfo> scope_info(shared->scope_info());
10836
10837 // Parameters.
10838 for (int i = 0; i < scope_info->ParameterCount(); ++i) {
10839 if (scope_info->ParameterName(i)->Equals(*variable_name)) {
10840 frame->SetParameterValue(i, *new_value);
10841 return true;
10842 }
10843 }
10844
10845 // Stack locals.
10846 for (int i = 0; i < scope_info->StackLocalCount(); ++i) {
10847 if (scope_info->StackLocalName(i)->Equals(*variable_name)) {
10848 frame->SetExpression(i, *new_value);
10849 return true;
10850 }
10851 }
10852
10853 if (scope_info->HasContext()) {
10854 // Context locals.
10855 Handle<Context> frame_context(Context::cast(frame->context()));
10856 Handle<Context> function_context(frame_context->declaration_context());
10857 if (SetContextLocalValue(
10858 isolate, scope_info, function_context, variable_name, new_value)) {
10859 return true;
10860 }
10861
10862 // Function context extension. These are variables introduced by eval.
10863 if (function_context->closure() == *function) {
10864 if (function_context->has_extension() &&
10865 !function_context->IsNativeContext()) {
10866 Handle<JSObject> ext(JSObject::cast(function_context->extension()));
10867
10868 if (ext->HasProperty(*variable_name)) {
10869 // We don't expect this to do anything except replacing
10870 // property value.
10871 SetProperty(isolate,
10872 ext,
10873 variable_name,
10874 new_value,
10875 NONE,
10876 kNonStrictMode);
10877 return true;
10878 }
10879 }
10880 }
10881 }
10882
10883 return false;
10884 }
10885
10886
10801 // Create a plain JSObject which materializes the closure content for the 10887 // Create a plain JSObject which materializes the closure content for the
10802 // context. 10888 // context.
10803 static Handle<JSObject> MaterializeClosure(Isolate* isolate, 10889 static Handle<JSObject> MaterializeClosure(Isolate* isolate,
10804 Handle<Context> context) { 10890 Handle<Context> context) {
10805 ASSERT(context->IsFunctionContext()); 10891 ASSERT(context->IsFunctionContext());
10806 10892
10807 Handle<SharedFunctionInfo> shared(context->closure()->shared()); 10893 Handle<SharedFunctionInfo> shared(context->closure()->shared());
10808 Handle<ScopeInfo> scope_info(shared->scope_info()); 10894 Handle<ScopeInfo> scope_info(shared->scope_info());
10809 10895
10810 // Allocate and initialize a JSObject with all the content of this function 10896 // Allocate and initialize a JSObject with all the content of this function
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
10851 static bool SetClosureVariableValue(Isolate* isolate, 10937 static bool SetClosureVariableValue(Isolate* isolate,
10852 Handle<Context> context, 10938 Handle<Context> context,
10853 Handle<String> variable_name, 10939 Handle<String> variable_name,
10854 Handle<Object> new_value) { 10940 Handle<Object> new_value) {
10855 ASSERT(context->IsFunctionContext()); 10941 ASSERT(context->IsFunctionContext());
10856 10942
10857 Handle<SharedFunctionInfo> shared(context->closure()->shared()); 10943 Handle<SharedFunctionInfo> shared(context->closure()->shared());
10858 Handle<ScopeInfo> scope_info(shared->scope_info()); 10944 Handle<ScopeInfo> scope_info(shared->scope_info());
10859 10945
10860 // Context locals to the context extension. 10946 // Context locals to the context extension.
10861 for (int i = 0; i < scope_info->ContextLocalCount(); i++) { 10947 if (SetContextLocalValue(
10862 Handle<String> next_name(scope_info->ContextLocalName(i)); 10948 isolate, scope_info, context, variable_name, new_value)) {
10863 if (variable_name->Equals(*next_name)) { 10949 return true;
10864 VariableMode mode;
10865 InitializationFlag init_flag;
10866 int context_index =
10867 scope_info->ContextSlotIndex(*next_name, &mode, &init_flag);
10868 if (context_index < 0) {
10869 return false;
10870 }
10871 context->set(context_index, *new_value);
10872 return true;
10873 }
10874 } 10950 }
10875 10951
10876 // Properties from the function context extension. This will 10952 // Properties from the function context extension. This will
10877 // be variables introduced by eval. 10953 // be variables introduced by eval.
10878 if (context->has_extension()) { 10954 if (context->has_extension()) {
10879 Handle<JSObject> ext(JSObject::cast(context->extension())); 10955 Handle<JSObject> ext(JSObject::cast(context->extension()));
10880 if (ext->HasProperty(*variable_name)) { 10956 if (ext->HasProperty(*variable_name)) {
10881 // We don't expect this to do anything except replacing property value. 10957 // We don't expect this to do anything except replacing property value.
10882 SetProperty(isolate, 10958 SetProperty(isolate,
10883 ext, 10959 ext,
(...skipping 24 matching lines...) Expand all
10908 catch_scope, 10984 catch_scope,
10909 name, 10985 name,
10910 thrown_object, 10986 thrown_object,
10911 NONE, 10987 NONE,
10912 kNonStrictMode), 10988 kNonStrictMode),
10913 Handle<JSObject>()); 10989 Handle<JSObject>());
10914 return catch_scope; 10990 return catch_scope;
10915 } 10991 }
10916 10992
10917 10993
10994 static bool SetCatchVariableValue(Isolate* isolate,
10995 Handle<Context> context,
10996 Handle<String> variable_name,
10997 Handle<Object> new_value) {
10998 ASSERT(context->IsCatchContext());
10999 Handle<String> name(String::cast(context->extension()));
11000 if (!name->Equals(*variable_name)) {
11001 return false;
11002 }
11003 context->set(Context::THROWN_OBJECT_INDEX, *new_value);
11004 return true;
11005 }
11006
11007
10918 // Create a plain JSObject which materializes the block scope for the specified 11008 // Create a plain JSObject which materializes the block scope for the specified
10919 // block context. 11009 // block context.
10920 static Handle<JSObject> MaterializeBlockScope( 11010 static Handle<JSObject> MaterializeBlockScope(
10921 Isolate* isolate, 11011 Isolate* isolate,
10922 Handle<Context> context) { 11012 Handle<Context> context) {
10923 ASSERT(context->IsBlockContext()); 11013 ASSERT(context->IsBlockContext());
10924 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension())); 11014 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension()));
10925 11015
10926 // Allocate and initialize a JSObject with all the arguments, stack locals 11016 // Allocate and initialize a JSObject with all the arguments, stack locals
10927 // heap locals and extension properties of the debugged function. 11017 // heap locals and extension properties of the debugged function.
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
11173 return Handle<JSObject>(); 11263 return Handle<JSObject>();
11174 } 11264 }
11175 11265
11176 bool SetVariableValue(Handle<String> variable_name, 11266 bool SetVariableValue(Handle<String> variable_name,
11177 Handle<Object> new_value) { 11267 Handle<Object> new_value) {
11178 ASSERT(!failed_); 11268 ASSERT(!failed_);
11179 switch (Type()) { 11269 switch (Type()) {
11180 case ScopeIterator::ScopeTypeGlobal: 11270 case ScopeIterator::ScopeTypeGlobal:
11181 break; 11271 break;
11182 case ScopeIterator::ScopeTypeLocal: 11272 case ScopeIterator::ScopeTypeLocal:
11183 // TODO(2399): implement. 11273 return SetLocalVariableValue(isolate_, frame_, inlined_jsframe_index_,
11184 break; 11274 variable_name, new_value);
11185 case ScopeIterator::ScopeTypeWith: 11275 case ScopeIterator::ScopeTypeWith:
11186 break; 11276 break;
11187 case ScopeIterator::ScopeTypeCatch: 11277 case ScopeIterator::ScopeTypeCatch:
11188 // TODO(2399): implement. 11278 return SetCatchVariableValue(isolate_, CurrentContext(),
11189 break; 11279 variable_name, new_value);
11190 case ScopeIterator::ScopeTypeClosure: 11280 case ScopeIterator::ScopeTypeClosure:
11191 return SetClosureVariableValue(isolate_, CurrentContext(), 11281 return SetClosureVariableValue(isolate_, CurrentContext(),
11192 variable_name, new_value); 11282 variable_name, new_value);
11193 case ScopeIterator::ScopeTypeBlock: 11283 case ScopeIterator::ScopeTypeBlock:
11194 // TODO(2399): should we implement it? 11284 // TODO(2399): should we implement it?
11195 break; 11285 break;
11196 case ScopeIterator::ScopeTypeModule: 11286 case ScopeIterator::ScopeTypeModule:
11197 // TODO(2399): should we implement it? 11287 // TODO(2399): should we implement it?
11198 break; 11288 break;
11199 } 11289 }
(...skipping 2304 matching lines...) Expand 10 before | Expand all | Expand 10 after
13504 // Handle last resort GC and make sure to allow future allocations 13594 // Handle last resort GC and make sure to allow future allocations
13505 // to grow the heap without causing GCs (if possible). 13595 // to grow the heap without causing GCs (if possible).
13506 isolate->counters()->gc_last_resort_from_js()->Increment(); 13596 isolate->counters()->gc_last_resort_from_js()->Increment();
13507 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, 13597 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags,
13508 "Runtime::PerformGC"); 13598 "Runtime::PerformGC");
13509 } 13599 }
13510 } 13600 }
13511 13601
13512 13602
13513 } } // namespace v8::internal 13603 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/frames.cc ('k') | test/mjsunit/debug-set-variable-value.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698