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

Side by Side Diff: src/runtime/runtime-debug.cc

Issue 726643002: harmony-scoping: Implement debugger support for script scope. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Minor nits Created 6 years, 1 month 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
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/arguments.h" 8 #include "src/arguments.h"
9 #include "src/debug.h" 9 #include "src/debug.h"
10 #include "src/deoptimizer.h" 10 #include "src/deoptimizer.h"
(...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 isolate, target, key, value, SLOPPY), 794 isolate, target, key, value, SLOPPY),
795 JSObject); 795 JSObject);
796 } 796 }
797 } 797 }
798 } 798 }
799 799
800 return target; 800 return target;
801 } 801 }
802 802
803 803
804 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeScriptScope(
805 Handle<GlobalObject> global) {
806 Isolate* isolate = global->GetIsolate();
807 Handle<ScriptContextTable> script_contexts(
808 global->native_context()->script_context_table());
809
810 Handle<JSObject> script_scope =
811 isolate->factory()->NewJSObject(isolate->object_function());
812
813 for (int context_index = 0; context_index < script_contexts->used();
814 context_index++) {
815 Handle<Context> context =
816 ScriptContextTable::GetContext(script_contexts, context_index);
817 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension()));
818 if (!ScopeInfo::CopyContextLocalsToScopeObject(scope_info, context,
819 script_scope)) {
820 return MaybeHandle<JSObject>();
821 }
822 }
823 return script_scope;
824 }
825
826
804 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeLocalScope( 827 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeLocalScope(
805 Isolate* isolate, JavaScriptFrame* frame, int inlined_jsframe_index) { 828 Isolate* isolate, JavaScriptFrame* frame, int inlined_jsframe_index) {
806 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate); 829 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate);
807 Handle<JSFunction> function(JSFunction::cast(frame_inspector.GetFunction())); 830 Handle<JSFunction> function(JSFunction::cast(frame_inspector.GetFunction()));
808 831
809 Handle<JSObject> local_scope = 832 Handle<JSObject> local_scope =
810 isolate->factory()->NewJSObject(isolate->object_function()); 833 isolate->factory()->NewJSObject(isolate->object_function());
811 ASSIGN_RETURN_ON_EXCEPTION( 834 ASSIGN_RETURN_ON_EXCEPTION(
812 isolate, local_scope, 835 isolate, local_scope,
813 MaterializeStackLocalsWithFrameInspector(isolate, local_scope, function, 836 MaterializeStackLocalsWithFrameInspector(isolate, local_scope, function,
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
979 Runtime::DefineObjectProperty(ext, variable_name, new_value, NONE) 1002 Runtime::DefineObjectProperty(ext, variable_name, new_value, NONE)
980 .Assert(); 1003 .Assert();
981 return true; 1004 return true;
982 } 1005 }
983 } 1006 }
984 1007
985 return false; 1008 return false;
986 } 1009 }
987 1010
988 1011
1012 static bool SetScriptVariableValue(Handle<Context> context,
1013 Handle<String> variable_name,
1014 Handle<Object> new_value) {
1015 Handle<ScriptContextTable> script_contexts(
1016 context->global_object()->native_context()->script_context_table());
1017 ScriptContextTable::LookupResult lookup_result;
1018 if (ScriptContextTable::Lookup(script_contexts, variable_name,
1019 &lookup_result)) {
1020 Handle<Context> script_context = ScriptContextTable::GetContext(
1021 script_contexts, lookup_result.context_index);
1022 script_context->set(lookup_result.slot_index, *new_value);
1023 return true;
1024 }
1025
1026 return false;
1027 }
1028
1029
989 // Create a plain JSObject which materializes the scope for the specified 1030 // Create a plain JSObject which materializes the scope for the specified
990 // catch context. 1031 // catch context.
991 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeCatchScope( 1032 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeCatchScope(
992 Isolate* isolate, Handle<Context> context) { 1033 Isolate* isolate, Handle<Context> context) {
993 DCHECK(context->IsCatchContext()); 1034 DCHECK(context->IsCatchContext());
994 Handle<String> name(String::cast(context->extension())); 1035 Handle<String> name(String::cast(context->extension()));
995 Handle<Object> thrown_object(context->get(Context::THROWN_OBJECT_INDEX), 1036 Handle<Object> thrown_object(context->get(Context::THROWN_OBJECT_INDEX),
996 isolate); 1037 isolate);
997 Handle<JSObject> catch_scope = 1038 Handle<JSObject> catch_scope =
998 isolate->factory()->NewJSObject(isolate->object_function()); 1039 isolate->factory()->NewJSObject(isolate->object_function());
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1061 1102
1062 1103
1063 // Iterate over the actual scopes visible from a stack frame or from a closure. 1104 // Iterate over the actual scopes visible from a stack frame or from a closure.
1064 // The iteration proceeds from the innermost visible nested scope outwards. 1105 // The iteration proceeds from the innermost visible nested scope outwards.
1065 // All scopes are backed by an actual context except the local scope, 1106 // All scopes are backed by an actual context except the local scope,
1066 // which is inserted "artificially" in the context chain. 1107 // which is inserted "artificially" in the context chain.
1067 class ScopeIterator { 1108 class ScopeIterator {
1068 public: 1109 public:
1069 enum ScopeType { 1110 enum ScopeType {
1070 ScopeTypeGlobal = 0, 1111 ScopeTypeGlobal = 0,
1112 ScopeTypeScript,
1071 ScopeTypeLocal, 1113 ScopeTypeLocal,
1072 ScopeTypeWith, 1114 ScopeTypeWith,
1073 ScopeTypeClosure, 1115 ScopeTypeClosure,
1074 ScopeTypeCatch, 1116 ScopeTypeCatch,
1075 ScopeTypeBlock, 1117 ScopeTypeBlock,
1076 ScopeTypeModule 1118 ScopeTypeModule
1077 }; 1119 };
1078 1120
1079 ScopeIterator(Isolate* isolate, JavaScriptFrame* frame, 1121 ScopeIterator(Isolate* isolate, JavaScriptFrame* frame,
1080 int inlined_jsframe_index, bool ignore_nested_scopes = false) 1122 int inlined_jsframe_index, bool ignore_nested_scopes = false)
1081 : isolate_(isolate), 1123 : isolate_(isolate),
1082 frame_(frame), 1124 frame_(frame),
1083 inlined_jsframe_index_(inlined_jsframe_index), 1125 inlined_jsframe_index_(inlined_jsframe_index),
1084 function_(frame->function()), 1126 function_(frame->function()),
1085 context_(Context::cast(frame->context())), 1127 context_(Context::cast(frame->context())),
1086 nested_scope_chain_(4), 1128 nested_scope_chain_(4),
1129 seen_script_scope_(false),
1087 failed_(false) { 1130 failed_(false) {
1088 // Catch the case when the debugger stops in an internal function. 1131 // Catch the case when the debugger stops in an internal function.
1089 Handle<SharedFunctionInfo> shared_info(function_->shared()); 1132 Handle<SharedFunctionInfo> shared_info(function_->shared());
1090 Handle<ScopeInfo> scope_info(shared_info->scope_info()); 1133 Handle<ScopeInfo> scope_info(shared_info->scope_info());
1091 if (shared_info->script() == isolate->heap()->undefined_value()) { 1134 if (shared_info->script() == isolate->heap()->undefined_value()) {
1092 while (context_->closure() == *function_) { 1135 while (context_->closure() == *function_) {
1093 context_ = Handle<Context>(context_->previous(), isolate_); 1136 context_ = Handle<Context>(context_->previous(), isolate_);
1094 } 1137 }
1095 return; 1138 return;
1096 } 1139 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1168 } 1211 }
1169 } 1212 }
1170 } 1213 }
1171 1214
1172 ScopeIterator(Isolate* isolate, Handle<JSFunction> function) 1215 ScopeIterator(Isolate* isolate, Handle<JSFunction> function)
1173 : isolate_(isolate), 1216 : isolate_(isolate),
1174 frame_(NULL), 1217 frame_(NULL),
1175 inlined_jsframe_index_(0), 1218 inlined_jsframe_index_(0),
1176 function_(function), 1219 function_(function),
1177 context_(function->context()), 1220 context_(function->context()),
1221 seen_script_scope_(false),
1178 failed_(false) { 1222 failed_(false) {
1179 if (function->IsBuiltin()) { 1223 if (function->IsBuiltin()) {
1180 context_ = Handle<Context>(); 1224 context_ = Handle<Context>();
1181 } 1225 }
1182 } 1226 }
1183 1227
1184 // More scopes? 1228 // More scopes?
1185 bool Done() { 1229 bool Done() {
1186 DCHECK(!failed_); 1230 DCHECK(!failed_);
1187 return context_.is_null(); 1231 return context_.is_null();
1188 } 1232 }
1189 1233
1190 bool Failed() { return failed_; } 1234 bool Failed() { return failed_; }
1191 1235
1192 // Move to the next scope. 1236 // Move to the next scope.
1193 void Next() { 1237 void Next() {
1194 DCHECK(!failed_); 1238 DCHECK(!failed_);
1195 ScopeType scope_type = Type(); 1239 ScopeType scope_type = Type();
1196 if (scope_type == ScopeTypeGlobal) { 1240 if (scope_type == ScopeTypeGlobal) {
1197 // The global scope is always the last in the chain. 1241 // The global scope is always the last in the chain.
1198 DCHECK(context_->IsNativeContext()); 1242 DCHECK(context_->IsNativeContext());
1199 context_ = Handle<Context>(); 1243 context_ = Handle<Context>();
1200 return; 1244 return;
1201 } 1245 }
1202 if (nested_scope_chain_.is_empty()) { 1246 if (nested_scope_chain_.is_empty()) {
1203 context_ = Handle<Context>(context_->previous(), isolate_); 1247 if (scope_type == ScopeTypeScript) {
1248 seen_script_scope_ = true; // Our current context was script context.
1249 if (context_->IsScriptContext()) {
1250 context_ = Handle<Context>(context_->previous(), isolate_);
1251 }
1252 CHECK(context_->IsNativeContext());
1253 } else {
1254 context_ = Handle<Context>(context_->previous(), isolate_);
1255 }
1204 } else { 1256 } else {
1257 seen_script_scope_ = scope_type == ScopeTypeScript;
1205 if (nested_scope_chain_.last()->HasContext()) { 1258 if (nested_scope_chain_.last()->HasContext()) {
1206 DCHECK(context_->previous() != NULL); 1259 DCHECK(context_->previous() != NULL);
1207 context_ = Handle<Context>(context_->previous(), isolate_); 1260 context_ = Handle<Context>(context_->previous(), isolate_);
1208 } 1261 }
1209 nested_scope_chain_.RemoveLast(); 1262 nested_scope_chain_.RemoveLast();
1210 } 1263 }
1211 } 1264 }
1212 1265
1213 // Return the type of the current scope. 1266 // Return the type of the current scope.
1214 ScopeType Type() { 1267 ScopeType Type() {
1215 DCHECK(!failed_); 1268 DCHECK(!failed_);
1216 if (!nested_scope_chain_.is_empty()) { 1269 if (!nested_scope_chain_.is_empty()) {
1217 Handle<ScopeInfo> scope_info = nested_scope_chain_.last(); 1270 Handle<ScopeInfo> scope_info = nested_scope_chain_.last();
1218 switch (scope_info->scope_type()) { 1271 switch (scope_info->scope_type()) {
1219 case FUNCTION_SCOPE: 1272 case FUNCTION_SCOPE:
1220 case ARROW_SCOPE: 1273 case ARROW_SCOPE:
1221 DCHECK(context_->IsFunctionContext() || !scope_info->HasContext()); 1274 DCHECK(context_->IsFunctionContext() || !scope_info->HasContext());
1222 return ScopeTypeLocal; 1275 return ScopeTypeLocal;
1223 case MODULE_SCOPE: 1276 case MODULE_SCOPE:
1224 DCHECK(context_->IsModuleContext()); 1277 DCHECK(context_->IsModuleContext());
1225 return ScopeTypeModule; 1278 return ScopeTypeModule;
1226 case SCRIPT_SCOPE: 1279 case SCRIPT_SCOPE:
1227 DCHECK(context_->IsNativeContext()); 1280 DCHECK(context_->IsScriptContext() || context_->IsNativeContext());
yurys 2014/11/14 12:25:32 Why not return ScopeTypeScript only in case contex
1228 return ScopeTypeGlobal; 1281 return ScopeTypeScript;
1229 case WITH_SCOPE: 1282 case WITH_SCOPE:
1230 DCHECK(context_->IsWithContext()); 1283 DCHECK(context_->IsWithContext());
1231 return ScopeTypeWith; 1284 return ScopeTypeWith;
1232 case CATCH_SCOPE: 1285 case CATCH_SCOPE:
1233 DCHECK(context_->IsCatchContext()); 1286 DCHECK(context_->IsCatchContext());
1234 return ScopeTypeCatch; 1287 return ScopeTypeCatch;
1235 case BLOCK_SCOPE: 1288 case BLOCK_SCOPE:
1236 DCHECK(!scope_info->HasContext() || context_->IsBlockContext()); 1289 DCHECK(!scope_info->HasContext() || context_->IsBlockContext());
1237 return ScopeTypeBlock; 1290 return ScopeTypeBlock;
1238 case EVAL_SCOPE: 1291 case EVAL_SCOPE:
1239 UNREACHABLE(); 1292 UNREACHABLE();
1240 } 1293 }
1241 } 1294 }
1242 if (context_->IsNativeContext()) { 1295 if (context_->IsNativeContext()) {
1243 DCHECK(context_->global_object()->IsGlobalObject()); 1296 DCHECK(context_->global_object()->IsGlobalObject());
1244 return ScopeTypeGlobal; 1297 // If we are at the native context and have not yet seen script scope,
yurys 2014/11/14 12:25:32 Can you educate me on how this works, I thought th
Dmitry Lomov (no reviews) 2014/11/14 13:56:51 No. I tried to explain this in CL description but
yurys 2014/11/14 15:02:02 Gotcha, thanks for explaining!
1298 // fake it.
1299 return seen_script_scope_ ? ScopeTypeGlobal : ScopeTypeScript;
1245 } 1300 }
1246 if (context_->IsFunctionContext()) { 1301 if (context_->IsFunctionContext()) {
1247 return ScopeTypeClosure; 1302 return ScopeTypeClosure;
1248 } 1303 }
1249 if (context_->IsCatchContext()) { 1304 if (context_->IsCatchContext()) {
1250 return ScopeTypeCatch; 1305 return ScopeTypeCatch;
1251 } 1306 }
1252 if (context_->IsBlockContext()) { 1307 if (context_->IsBlockContext()) {
1253 return ScopeTypeBlock; 1308 return ScopeTypeBlock;
1254 } 1309 }
1255 if (context_->IsModuleContext()) { 1310 if (context_->IsModuleContext()) {
1256 return ScopeTypeModule; 1311 return ScopeTypeModule;
1257 } 1312 }
1313 if (context_->IsScriptContext()) {
1314 return ScopeTypeScript;
1315 }
1258 DCHECK(context_->IsWithContext()); 1316 DCHECK(context_->IsWithContext());
1259 return ScopeTypeWith; 1317 return ScopeTypeWith;
1260 } 1318 }
1261 1319
1262 // Return the JavaScript object with the content of the current scope. 1320 // Return the JavaScript object with the content of the current scope.
1263 MaybeHandle<JSObject> ScopeObject() { 1321 MaybeHandle<JSObject> ScopeObject() {
1264 DCHECK(!failed_); 1322 DCHECK(!failed_);
1265 switch (Type()) { 1323 switch (Type()) {
1266 case ScopeIterator::ScopeTypeGlobal: 1324 case ScopeIterator::ScopeTypeGlobal:
1267 return Handle<JSObject>(CurrentContext()->global_object()); 1325 return Handle<JSObject>(CurrentContext()->global_object());
1326 case ScopeIterator::ScopeTypeScript:
1327 return MaterializeScriptScope(
1328 Handle<GlobalObject>(CurrentContext()->global_object()));
1268 case ScopeIterator::ScopeTypeLocal: 1329 case ScopeIterator::ScopeTypeLocal:
1269 // Materialize the content of the local scope into a JSObject. 1330 // Materialize the content of the local scope into a JSObject.
1270 DCHECK(nested_scope_chain_.length() == 1); 1331 DCHECK(nested_scope_chain_.length() == 1);
1271 return MaterializeLocalScope(isolate_, frame_, inlined_jsframe_index_); 1332 return MaterializeLocalScope(isolate_, frame_, inlined_jsframe_index_);
1272 case ScopeIterator::ScopeTypeWith: 1333 case ScopeIterator::ScopeTypeWith:
1273 // Return the with object. 1334 // Return the with object.
1274 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension())); 1335 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension()));
1275 case ScopeIterator::ScopeTypeCatch: 1336 case ScopeIterator::ScopeTypeCatch:
1276 return MaterializeCatchScope(isolate_, CurrentContext()); 1337 return MaterializeCatchScope(isolate_, CurrentContext());
1277 case ScopeIterator::ScopeTypeClosure: 1338 case ScopeIterator::ScopeTypeClosure:
(...skipping 18 matching lines...) Expand all
1296 return SetLocalVariableValue(isolate_, frame_, inlined_jsframe_index_, 1357 return SetLocalVariableValue(isolate_, frame_, inlined_jsframe_index_,
1297 variable_name, new_value); 1358 variable_name, new_value);
1298 case ScopeIterator::ScopeTypeWith: 1359 case ScopeIterator::ScopeTypeWith:
1299 break; 1360 break;
1300 case ScopeIterator::ScopeTypeCatch: 1361 case ScopeIterator::ScopeTypeCatch:
1301 return SetCatchVariableValue(isolate_, CurrentContext(), variable_name, 1362 return SetCatchVariableValue(isolate_, CurrentContext(), variable_name,
1302 new_value); 1363 new_value);
1303 case ScopeIterator::ScopeTypeClosure: 1364 case ScopeIterator::ScopeTypeClosure:
1304 return SetClosureVariableValue(isolate_, CurrentContext(), 1365 return SetClosureVariableValue(isolate_, CurrentContext(),
1305 variable_name, new_value); 1366 variable_name, new_value);
1367 case ScopeIterator::ScopeTypeScript:
1368 return SetScriptVariableValue(CurrentContext(), variable_name,
1369 new_value);
1306 case ScopeIterator::ScopeTypeBlock: 1370 case ScopeIterator::ScopeTypeBlock:
1307 // TODO(2399): should we implement it? 1371 // TODO(2399): should we implement it?
1308 break; 1372 break;
1309 case ScopeIterator::ScopeTypeModule: 1373 case ScopeIterator::ScopeTypeModule:
1310 // TODO(2399): should we implement it? 1374 // TODO(2399): should we implement it?
1311 break; 1375 break;
1312 } 1376 }
1313 return false; 1377 return false;
1314 } 1378 }
1315 1379
1316 Handle<ScopeInfo> CurrentScopeInfo() { 1380 Handle<ScopeInfo> CurrentScopeInfo() {
1317 DCHECK(!failed_); 1381 DCHECK(!failed_);
1318 if (!nested_scope_chain_.is_empty()) { 1382 if (!nested_scope_chain_.is_empty()) {
1319 return nested_scope_chain_.last(); 1383 return nested_scope_chain_.last();
1320 } else if (context_->IsBlockContext()) { 1384 } else if (context_->IsBlockContext()) {
1321 return Handle<ScopeInfo>(ScopeInfo::cast(context_->extension())); 1385 return Handle<ScopeInfo>(ScopeInfo::cast(context_->extension()));
1322 } else if (context_->IsFunctionContext()) { 1386 } else if (context_->IsFunctionContext()) {
1323 return Handle<ScopeInfo>(context_->closure()->shared()->scope_info()); 1387 return Handle<ScopeInfo>(context_->closure()->shared()->scope_info());
1324 } 1388 }
1325 return Handle<ScopeInfo>::null(); 1389 return Handle<ScopeInfo>::null();
1326 } 1390 }
1327 1391
1328 // Return the context for this scope. For the local context there might not 1392 // Return the context for this scope. For the local context there might not
1329 // be an actual context. 1393 // be an actual context.
1330 Handle<Context> CurrentContext() { 1394 Handle<Context> CurrentContext() {
1331 DCHECK(!failed_); 1395 DCHECK(!failed_);
1332 if (Type() == ScopeTypeGlobal || nested_scope_chain_.is_empty()) { 1396 if (Type() == ScopeTypeGlobal || Type() == ScopeTypeScript ||
1397 nested_scope_chain_.is_empty()) {
1333 return context_; 1398 return context_;
1334 } else if (nested_scope_chain_.last()->HasContext()) { 1399 } else if (nested_scope_chain_.last()->HasContext()) {
1335 return context_; 1400 return context_;
1336 } else { 1401 } else {
1337 return Handle<Context>(); 1402 return Handle<Context>();
1338 } 1403 }
1339 } 1404 }
1340 1405
1341 #ifdef DEBUG 1406 #ifdef DEBUG
1342 // Debug print of the content of the current scope. 1407 // Debug print of the content of the current scope.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1379 os << "Closure:\n"; 1444 os << "Closure:\n";
1380 CurrentContext()->Print(os); 1445 CurrentContext()->Print(os);
1381 if (CurrentContext()->has_extension()) { 1446 if (CurrentContext()->has_extension()) {
1382 Handle<Object> extension(CurrentContext()->extension(), isolate_); 1447 Handle<Object> extension(CurrentContext()->extension(), isolate_);
1383 if (extension->IsJSContextExtensionObject()) { 1448 if (extension->IsJSContextExtensionObject()) {
1384 extension->Print(os); 1449 extension->Print(os);
1385 } 1450 }
1386 } 1451 }
1387 break; 1452 break;
1388 1453
1454 case ScopeIterator::ScopeTypeScript:
1455 os << "Script:\n";
1456 CurrentContext()
1457 ->global_object()
1458 ->native_context()
1459 ->script_context_table()
1460 ->Print(os);
1461 break;
1462
1389 default: 1463 default:
1390 UNREACHABLE(); 1464 UNREACHABLE();
1391 } 1465 }
1392 PrintF("\n"); 1466 PrintF("\n");
1393 } 1467 }
1394 #endif 1468 #endif
1395 1469
1396 private: 1470 private:
1397 Isolate* isolate_; 1471 Isolate* isolate_;
1398 JavaScriptFrame* frame_; 1472 JavaScriptFrame* frame_;
1399 int inlined_jsframe_index_; 1473 int inlined_jsframe_index_;
1400 Handle<JSFunction> function_; 1474 Handle<JSFunction> function_;
1401 Handle<Context> context_; 1475 Handle<Context> context_;
1402 List<Handle<ScopeInfo> > nested_scope_chain_; 1476 List<Handle<ScopeInfo> > nested_scope_chain_;
1477 bool seen_script_scope_;
1403 bool failed_; 1478 bool failed_;
1404 1479
1405 void RetrieveScopeChain(Scope* scope, 1480 void RetrieveScopeChain(Scope* scope,
1406 Handle<SharedFunctionInfo> shared_info) { 1481 Handle<SharedFunctionInfo> shared_info) {
1407 if (scope != NULL) { 1482 if (scope != NULL) {
1408 int source_position = shared_info->code()->SourcePosition(frame_->pc()); 1483 int source_position = shared_info->code()->SourcePosition(frame_->pc());
1409 scope->GetNestedScopeChain(&nested_scope_chain_, source_position); 1484 scope->GetNestedScopeChain(&nested_scope_chain_, source_position);
1410 } else { 1485 } else {
1411 // A failed reparse indicates that the preparser has diverged from the 1486 // A failed reparse indicates that the preparser has diverged from the
1412 // parser or that the preparse data given to the initial parse has been 1487 // parser or that the preparse data given to the initial parse has been
(...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after
2157 // uses this temporary context chain. 2232 // uses this temporary context chain.
2158 2233
2159 Handle<Context> eval_context(Context::cast(frame_inspector.GetContext())); 2234 Handle<Context> eval_context(Context::cast(frame_inspector.GetContext()));
2160 DCHECK(!eval_context.is_null()); 2235 DCHECK(!eval_context.is_null());
2161 Handle<Context> function_context = eval_context; 2236 Handle<Context> function_context = eval_context;
2162 Handle<Context> outer_context(function->context(), isolate); 2237 Handle<Context> outer_context(function->context(), isolate);
2163 Handle<Context> inner_context; 2238 Handle<Context> inner_context;
2164 // We iterate to find the function's context. If the function has no 2239 // We iterate to find the function's context. If the function has no
2165 // context-allocated variables, we iterate until we hit the outer context. 2240 // context-allocated variables, we iterate until we hit the outer context.
2166 while (!function_context->IsFunctionContext() && 2241 while (!function_context->IsFunctionContext() &&
2242 !function_context->IsScriptContext() &&
2167 !function_context.is_identical_to(outer_context)) { 2243 !function_context.is_identical_to(outer_context)) {
2168 inner_context = function_context; 2244 inner_context = function_context;
2169 function_context = Handle<Context>(function_context->previous(), isolate); 2245 function_context = Handle<Context>(function_context->previous(), isolate);
2170 } 2246 }
2171 2247
2172 Handle<Context> materialized_context = isolate->factory()->NewWithContext( 2248 Handle<Context> materialized_context = isolate->factory()->NewWithContext(
2173 function, function_context, materialized); 2249 function, function_context, materialized);
2174 2250
2175 if (inner_context.is_null()) { 2251 if (inner_context.is_null()) {
2176 // No inner context. The with-context is now inner-most. 2252 // No inner context. The with-context is now inner-most.
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after
2722 return Smi::FromInt(isolate->debug()->is_active()); 2798 return Smi::FromInt(isolate->debug()->is_active());
2723 } 2799 }
2724 2800
2725 2801
2726 RUNTIME_FUNCTION(RuntimeReference_DebugBreakInOptimizedCode) { 2802 RUNTIME_FUNCTION(RuntimeReference_DebugBreakInOptimizedCode) {
2727 UNIMPLEMENTED(); 2803 UNIMPLEMENTED();
2728 return NULL; 2804 return NULL;
2729 } 2805 }
2730 } 2806 }
2731 } // namespace v8::internal 2807 } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698