Chromium Code Reviews| 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 10835 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10846 Isolate* isolate, | 10846 Isolate* isolate, |
| 10847 JavaScriptFrame* frame, | 10847 JavaScriptFrame* frame, |
| 10848 int inlined_jsframe_index) { | 10848 int inlined_jsframe_index) { |
| 10849 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate); | 10849 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate); |
| 10850 return MaterializeLocalScopeWithFrameInspector(isolate, | 10850 return MaterializeLocalScopeWithFrameInspector(isolate, |
| 10851 frame, | 10851 frame, |
| 10852 &frame_inspector); | 10852 &frame_inspector); |
| 10853 } | 10853 } |
| 10854 | 10854 |
| 10855 | 10855 |
| 10856 // Set the context local variable value. | |
| 10857 static bool SetContextLocalValue( | |
| 10858 Isolate* isolate, | |
|
Yang
2012/12/10 14:15:11
I'd prefer having the first argument in the same l
Peter Rybin
2012/12/11 23:20:44
Done.
| |
| 10859 Handle<ScopeInfo> scope_info, | |
| 10860 Handle<Context> context, | |
| 10861 Handle<String> variable_name, | |
| 10862 Handle<Object> new_value) { | |
| 10863 for (int i = 0; i < scope_info->ContextLocalCount(); i++) { | |
| 10864 Handle<String> next_name(scope_info->ContextLocalName(i)); | |
| 10865 if (variable_name->Equals(*next_name)) { | |
| 10866 VariableMode mode; | |
| 10867 InitializationFlag init_flag; | |
| 10868 int context_index = | |
| 10869 scope_info->ContextSlotIndex(*next_name, &mode, &init_flag); | |
| 10870 context->set(context_index, *new_value); | |
| 10871 return true; | |
| 10872 } | |
| 10873 } | |
| 10874 | |
| 10875 return false; | |
| 10876 } | |
| 10877 | |
| 10878 | |
| 10879 static bool SetLocalVariableValue( | |
| 10880 Isolate* isolate, | |
|
Yang
2012/12/10 14:15:11
Ditto about argument formatting.
Peter Rybin
2012/12/11 23:20:44
Done.
| |
| 10881 JavaScriptFrame* frame, | |
| 10882 int inlined_jsframe_index, | |
| 10883 Handle<String> variable_name, | |
| 10884 Handle<Object> new_value) { | |
| 10885 if (inlined_jsframe_index != 0 || frame->is_optimized()) { | |
| 10886 // Optimized frames are not supported. | |
| 10887 return false; | |
| 10888 } | |
| 10889 | |
| 10890 Handle<JSFunction> function(JSFunction::cast(frame->function())); | |
| 10891 Handle<SharedFunctionInfo> shared(function->shared()); | |
| 10892 Handle<ScopeInfo> scope_info(shared->scope_info()); | |
| 10893 | |
| 10894 // Parameters. | |
| 10895 for (int i = 0; i < scope_info->ParameterCount(); ++i) { | |
| 10896 if (scope_info->ParameterName(i)->Equals(*variable_name)) { | |
| 10897 frame->SetParameterValue(i, *new_value); | |
| 10898 return true; | |
| 10899 } | |
| 10900 } | |
| 10901 | |
| 10902 // Stack locals. | |
| 10903 for (int i = 0; i < scope_info->StackLocalCount(); ++i) { | |
| 10904 if (scope_info->StackLocalName(i)->Equals(*variable_name)) { | |
| 10905 frame->SetExpression(i, *new_value); | |
| 10906 return true; | |
| 10907 } | |
| 10908 } | |
| 10909 | |
| 10910 if (scope_info->HasContext()) { | |
| 10911 // Context locals. | |
| 10912 Handle<Context> frame_context(Context::cast(frame->context())); | |
| 10913 Handle<Context> function_context(frame_context->declaration_context()); | |
| 10914 if (SetContextLocalValue(isolate, scope_info, function_context, | |
|
Yang
2012/12/10 14:15:11
could you put all arguments on the second line?
Peter Rybin
2012/12/11 23:20:44
Done.
| |
| 10915 variable_name, new_value)) { | |
| 10916 return true; | |
| 10917 } | |
| 10918 | |
| 10919 // Function context extension. These are variables introduced by eval. | |
| 10920 if (function_context->closure() == *function) { | |
| 10921 if (function_context->has_extension() && | |
| 10922 !function_context->IsNativeContext()) { | |
| 10923 Handle<JSObject> ext(JSObject::cast(function_context->extension())); | |
| 10924 | |
| 10925 if (ext->HasProperty(*variable_name)) { | |
| 10926 // We don't expect this to do anything except replacing | |
| 10927 // property value. | |
| 10928 SetProperty(isolate, | |
| 10929 ext, | |
| 10930 variable_name, | |
| 10931 new_value, | |
| 10932 NONE, | |
| 10933 kNonStrictMode); | |
| 10934 return true; | |
| 10935 } | |
| 10936 } | |
| 10937 } | |
| 10938 } | |
| 10939 | |
| 10940 return false; | |
| 10941 } | |
| 10942 | |
| 10943 | |
| 10856 // Create a plain JSObject which materializes the closure content for the | 10944 // Create a plain JSObject which materializes the closure content for the |
| 10857 // context. | 10945 // context. |
| 10858 static Handle<JSObject> MaterializeClosure(Isolate* isolate, | 10946 static Handle<JSObject> MaterializeClosure(Isolate* isolate, |
| 10859 Handle<Context> context) { | 10947 Handle<Context> context) { |
| 10860 ASSERT(context->IsFunctionContext()); | 10948 ASSERT(context->IsFunctionContext()); |
| 10861 | 10949 |
| 10862 Handle<SharedFunctionInfo> shared(context->closure()->shared()); | 10950 Handle<SharedFunctionInfo> shared(context->closure()->shared()); |
| 10863 Handle<ScopeInfo> scope_info(shared->scope_info()); | 10951 Handle<ScopeInfo> scope_info(shared->scope_info()); |
| 10864 | 10952 |
| 10865 // Allocate and initialize a JSObject with all the content of this function | 10953 // Allocate and initialize a JSObject with all the content of this function |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10906 static bool SetClosureVariableValue(Isolate* isolate, | 10994 static bool SetClosureVariableValue(Isolate* isolate, |
| 10907 Handle<Context> context, | 10995 Handle<Context> context, |
| 10908 Handle<String> variable_name, | 10996 Handle<String> variable_name, |
| 10909 Handle<Object> new_value) { | 10997 Handle<Object> new_value) { |
| 10910 ASSERT(context->IsFunctionContext()); | 10998 ASSERT(context->IsFunctionContext()); |
| 10911 | 10999 |
| 10912 Handle<SharedFunctionInfo> shared(context->closure()->shared()); | 11000 Handle<SharedFunctionInfo> shared(context->closure()->shared()); |
| 10913 Handle<ScopeInfo> scope_info(shared->scope_info()); | 11001 Handle<ScopeInfo> scope_info(shared->scope_info()); |
| 10914 | 11002 |
| 10915 // Context locals to the context extension. | 11003 // Context locals to the context extension. |
| 10916 for (int i = 0; i < scope_info->ContextLocalCount(); i++) { | 11004 if (SetContextLocalValue( |
| 10917 Handle<String> next_name(scope_info->ContextLocalName(i)); | 11005 isolate, scope_info, context, variable_name, new_value)) { |
| 10918 if (variable_name->Equals(*next_name)) { | 11006 return true; |
| 10919 VariableMode mode; | |
| 10920 InitializationFlag init_flag; | |
| 10921 int context_index = | |
| 10922 scope_info->ContextSlotIndex(*next_name, &mode, &init_flag); | |
| 10923 if (context_index < 0) { | |
| 10924 return false; | |
| 10925 } | |
| 10926 context->set(context_index, *new_value); | |
| 10927 return true; | |
| 10928 } | |
| 10929 } | 11007 } |
| 10930 | 11008 |
| 10931 // Properties from the function context extension. This will | 11009 // Properties from the function context extension. This will |
| 10932 // be variables introduced by eval. | 11010 // be variables introduced by eval. |
| 10933 if (context->has_extension()) { | 11011 if (context->has_extension()) { |
| 10934 Handle<JSObject> ext(JSObject::cast(context->extension())); | 11012 Handle<JSObject> ext(JSObject::cast(context->extension())); |
| 10935 if (ext->HasProperty(*variable_name)) { | 11013 if (ext->HasProperty(*variable_name)) { |
| 10936 // We don't expect this to do anything except replacing property value. | 11014 // We don't expect this to do anything except replacing property value. |
| 10937 SetProperty(isolate, | 11015 SetProperty(isolate, |
| 10938 ext, | 11016 ext, |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 10963 catch_scope, | 11041 catch_scope, |
| 10964 name, | 11042 name, |
| 10965 thrown_object, | 11043 thrown_object, |
| 10966 NONE, | 11044 NONE, |
| 10967 kNonStrictMode), | 11045 kNonStrictMode), |
| 10968 Handle<JSObject>()); | 11046 Handle<JSObject>()); |
| 10969 return catch_scope; | 11047 return catch_scope; |
| 10970 } | 11048 } |
| 10971 | 11049 |
| 10972 | 11050 |
| 11051 static bool SetCatchVariableValue(Isolate* isolate, | |
| 11052 Handle<Context> context, | |
| 11053 Handle<String> variable_name, | |
| 11054 Handle<Object> new_value) { | |
| 11055 ASSERT(context->IsCatchContext()); | |
| 11056 Handle<String> name(String::cast(context->extension())); | |
| 11057 if (!name->Equals(*variable_name)) { | |
| 11058 return false; | |
| 11059 } | |
| 11060 context->set(Context::THROWN_OBJECT_INDEX, *new_value); | |
| 11061 return true; | |
| 11062 } | |
| 11063 | |
| 11064 | |
| 10973 // Create a plain JSObject which materializes the block scope for the specified | 11065 // Create a plain JSObject which materializes the block scope for the specified |
| 10974 // block context. | 11066 // block context. |
| 10975 static Handle<JSObject> MaterializeBlockScope( | 11067 static Handle<JSObject> MaterializeBlockScope( |
| 10976 Isolate* isolate, | 11068 Isolate* isolate, |
| 10977 Handle<Context> context) { | 11069 Handle<Context> context) { |
| 10978 ASSERT(context->IsBlockContext()); | 11070 ASSERT(context->IsBlockContext()); |
| 10979 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension())); | 11071 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension())); |
| 10980 | 11072 |
| 10981 // Allocate and initialize a JSObject with all the arguments, stack locals | 11073 // Allocate and initialize a JSObject with all the arguments, stack locals |
| 10982 // heap locals and extension properties of the debugged function. | 11074 // heap locals and extension properties of the debugged function. |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11228 return Handle<JSObject>(); | 11320 return Handle<JSObject>(); |
| 11229 } | 11321 } |
| 11230 | 11322 |
| 11231 bool SetVariableValue(Handle<String> variable_name, | 11323 bool SetVariableValue(Handle<String> variable_name, |
| 11232 Handle<Object> new_value) { | 11324 Handle<Object> new_value) { |
| 11233 ASSERT(!failed_); | 11325 ASSERT(!failed_); |
| 11234 switch (Type()) { | 11326 switch (Type()) { |
| 11235 case ScopeIterator::ScopeTypeGlobal: | 11327 case ScopeIterator::ScopeTypeGlobal: |
| 11236 break; | 11328 break; |
| 11237 case ScopeIterator::ScopeTypeLocal: | 11329 case ScopeIterator::ScopeTypeLocal: |
| 11238 // TODO(2399): implement. | 11330 return SetLocalVariableValue(isolate_, frame_, inlined_jsframe_index_, |
| 11239 break; | 11331 variable_name, new_value); |
| 11240 case ScopeIterator::ScopeTypeWith: | 11332 case ScopeIterator::ScopeTypeWith: |
| 11241 break; | 11333 break; |
| 11242 case ScopeIterator::ScopeTypeCatch: | 11334 case ScopeIterator::ScopeTypeCatch: |
| 11243 // TODO(2399): implement. | 11335 return SetCatchVariableValue(isolate_, CurrentContext(), |
| 11244 break; | 11336 variable_name, new_value); |
| 11245 case ScopeIterator::ScopeTypeClosure: | 11337 case ScopeIterator::ScopeTypeClosure: |
| 11246 return SetClosureVariableValue(isolate_, CurrentContext(), | 11338 return SetClosureVariableValue(isolate_, CurrentContext(), |
| 11247 variable_name, new_value); | 11339 variable_name, new_value); |
| 11248 case ScopeIterator::ScopeTypeBlock: | 11340 case ScopeIterator::ScopeTypeBlock: |
| 11249 // TODO(2399): should we implement it? | 11341 // TODO(2399): should we implement it? |
| 11250 break; | 11342 break; |
| 11251 case ScopeIterator::ScopeTypeModule: | 11343 case ScopeIterator::ScopeTypeModule: |
| 11252 // TODO(2399): should we implement it? | 11344 // TODO(2399): should we implement it? |
| 11253 break; | 11345 break; |
| 11254 } | 11346 } |
| (...skipping 2294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13549 // Handle last resort GC and make sure to allow future allocations | 13641 // Handle last resort GC and make sure to allow future allocations |
| 13550 // to grow the heap without causing GCs (if possible). | 13642 // to grow the heap without causing GCs (if possible). |
| 13551 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13643 isolate->counters()->gc_last_resort_from_js()->Increment(); |
| 13552 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 13644 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
| 13553 "Runtime::PerformGC"); | 13645 "Runtime::PerformGC"); |
| 13554 } | 13646 } |
| 13555 } | 13647 } |
| 13556 | 13648 |
| 13557 | 13649 |
| 13558 } } // namespace v8::internal | 13650 } } // namespace v8::internal |
| OLD | NEW |