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 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 GetParameter(1), | 344 GetParameter(1), |
345 static_cast<HValue*>(NULL), | 345 static_cast<HValue*>(NULL), |
346 FAST_ELEMENTS); | 346 FAST_ELEMENTS); |
347 IfBuilder checker(this); | 347 IfBuilder checker(this); |
348 checker.IfNot<HCompareObjectEqAndBranch, HValue*>(allocation_site, | 348 checker.IfNot<HCompareObjectEqAndBranch, HValue*>(allocation_site, |
349 undefined); | 349 undefined); |
350 checker.Then(); | 350 checker.Then(); |
351 | 351 |
352 HObjectAccess access = HObjectAccess::ForAllocationSiteOffset( | 352 HObjectAccess access = HObjectAccess::ForAllocationSiteOffset( |
353 AllocationSite::kTransitionInfoOffset); | 353 AllocationSite::kTransitionInfoOffset); |
354 HInstruction* boilerplate = Add<HLoadNamedField>(allocation_site, access); | 354 HInstruction* boilerplate = Add<HLoadNamedField>( |
| 355 allocation_site, static_cast<HValue*>(NULL), access); |
355 HValue* push_value; | 356 HValue* push_value; |
356 if (mode == FastCloneShallowArrayStub::CLONE_ANY_ELEMENTS) { | 357 if (mode == FastCloneShallowArrayStub::CLONE_ANY_ELEMENTS) { |
357 HValue* elements = AddLoadElements(boilerplate); | 358 HValue* elements = AddLoadElements(boilerplate); |
358 | 359 |
359 IfBuilder if_fixed_cow(this); | 360 IfBuilder if_fixed_cow(this); |
360 if_fixed_cow.If<HCompareMap>(elements, factory->fixed_cow_array_map()); | 361 if_fixed_cow.If<HCompareMap>(elements, factory->fixed_cow_array_map()); |
361 if_fixed_cow.Then(); | 362 if_fixed_cow.Then(); |
362 push_value = BuildCloneShallowArray(boilerplate, | 363 push_value = BuildCloneShallowArray(boilerplate, |
363 allocation_site, | 364 allocation_site, |
364 alloc_site_mode, | 365 alloc_site_mode, |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 static_cast<HValue*>(NULL), | 415 static_cast<HValue*>(NULL), |
415 FAST_ELEMENTS); | 416 FAST_ELEMENTS); |
416 | 417 |
417 IfBuilder checker(this); | 418 IfBuilder checker(this); |
418 checker.IfNot<HCompareObjectEqAndBranch, HValue*>(allocation_site, | 419 checker.IfNot<HCompareObjectEqAndBranch, HValue*>(allocation_site, |
419 undefined); | 420 undefined); |
420 checker.And(); | 421 checker.And(); |
421 | 422 |
422 HObjectAccess access = HObjectAccess::ForAllocationSiteOffset( | 423 HObjectAccess access = HObjectAccess::ForAllocationSiteOffset( |
423 AllocationSite::kTransitionInfoOffset); | 424 AllocationSite::kTransitionInfoOffset); |
424 HInstruction* boilerplate = Add<HLoadNamedField>(allocation_site, access); | 425 HInstruction* boilerplate = Add<HLoadNamedField>( |
| 426 allocation_site, static_cast<HValue*>(NULL), access); |
425 | 427 |
426 int size = JSObject::kHeaderSize + casted_stub()->length() * kPointerSize; | 428 int size = JSObject::kHeaderSize + casted_stub()->length() * kPointerSize; |
427 int object_size = size; | 429 int object_size = size; |
428 if (FLAG_allocation_site_pretenuring) { | 430 if (FLAG_allocation_site_pretenuring) { |
429 size += AllocationMemento::kSize; | 431 size += AllocationMemento::kSize; |
430 } | 432 } |
431 | 433 |
432 HValue* boilerplate_map = Add<HLoadNamedField>( | 434 HValue* boilerplate_map = Add<HLoadNamedField>( |
433 boilerplate, HObjectAccess::ForMap()); | 435 boilerplate, static_cast<HValue*>(NULL), |
| 436 HObjectAccess::ForMap()); |
434 HValue* boilerplate_size = Add<HLoadNamedField>( | 437 HValue* boilerplate_size = Add<HLoadNamedField>( |
435 boilerplate_map, HObjectAccess::ForMapInstanceSize()); | 438 boilerplate_map, static_cast<HValue*>(NULL), |
| 439 HObjectAccess::ForMapInstanceSize()); |
436 HValue* size_in_words = Add<HConstant>(object_size >> kPointerSizeLog2); | 440 HValue* size_in_words = Add<HConstant>(object_size >> kPointerSizeLog2); |
437 checker.If<HCompareNumericAndBranch>(boilerplate_size, | 441 checker.If<HCompareNumericAndBranch>(boilerplate_size, |
438 size_in_words, Token::EQ); | 442 size_in_words, Token::EQ); |
439 checker.Then(); | 443 checker.Then(); |
440 | 444 |
441 HValue* size_in_bytes = Add<HConstant>(size); | 445 HValue* size_in_bytes = Add<HConstant>(size); |
442 | 446 |
443 HInstruction* object = Add<HAllocate>(size_in_bytes, HType::JSObject(), | 447 HInstruction* object = Add<HAllocate>(size_in_bytes, HType::JSObject(), |
444 NOT_TENURED, JS_OBJECT_TYPE); | 448 NOT_TENURED, JS_OBJECT_TYPE); |
445 | 449 |
446 for (int i = 0; i < object_size; i += kPointerSize) { | 450 for (int i = 0; i < object_size; i += kPointerSize) { |
447 HObjectAccess access = HObjectAccess::ForJSObjectOffset(i); | 451 HObjectAccess access = HObjectAccess::ForJSObjectOffset(i); |
448 Add<HStoreNamedField>(object, access, | 452 Add<HStoreNamedField>( |
449 Add<HLoadNamedField>(boilerplate, access), | 453 object, access, Add<HLoadNamedField>( |
450 INITIALIZING_STORE); | 454 boilerplate, static_cast<HValue*>(NULL), access), |
| 455 INITIALIZING_STORE); |
451 } | 456 } |
452 | 457 |
453 ASSERT(FLAG_allocation_site_pretenuring || (size == object_size)); | 458 ASSERT(FLAG_allocation_site_pretenuring || (size == object_size)); |
454 if (FLAG_allocation_site_pretenuring) { | 459 if (FLAG_allocation_site_pretenuring) { |
455 BuildCreateAllocationMemento( | 460 BuildCreateAllocationMemento( |
456 object, Add<HConstant>(object_size), allocation_site); | 461 object, Add<HConstant>(object_size), allocation_site); |
457 } | 462 } |
458 | 463 |
459 environment()->Push(object); | 464 environment()->Push(object); |
460 checker.ElseDeopt("Uninitialized boilerplate in fast clone"); | 465 checker.ElseDeopt("Uninitialized boilerplate in fast clone"); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 HStoreNamedField* store = Add<HStoreNamedField>( | 519 HStoreNamedField* store = Add<HStoreNamedField>( |
515 object, | 520 object, |
516 HObjectAccess::ForAllocationSiteOffset( | 521 HObjectAccess::ForAllocationSiteOffset( |
517 AllocationSite::kDependentCodeOffset), | 522 AllocationSite::kDependentCodeOffset), |
518 empty_fixed_array, | 523 empty_fixed_array, |
519 INITIALIZING_STORE); | 524 INITIALIZING_STORE); |
520 | 525 |
521 // Link the object to the allocation site list | 526 // Link the object to the allocation site list |
522 HValue* site_list = Add<HConstant>( | 527 HValue* site_list = Add<HConstant>( |
523 ExternalReference::allocation_sites_list_address(isolate())); | 528 ExternalReference::allocation_sites_list_address(isolate())); |
524 HValue* site = Add<HLoadNamedField>(site_list, | 529 HValue* site = Add<HLoadNamedField>( |
525 HObjectAccess::ForAllocationSiteList()); | 530 site_list, static_cast<HValue*>(NULL), |
| 531 HObjectAccess::ForAllocationSiteList()); |
526 store = Add<HStoreNamedField>(object, | 532 store = Add<HStoreNamedField>(object, |
527 HObjectAccess::ForAllocationSiteOffset(AllocationSite::kWeakNextOffset), | 533 HObjectAccess::ForAllocationSiteOffset(AllocationSite::kWeakNextOffset), |
528 site, INITIALIZING_STORE); | 534 site, INITIALIZING_STORE); |
529 store->SkipWriteBarrier(); | 535 store->SkipWriteBarrier(); |
530 Add<HStoreNamedField>(site_list, HObjectAccess::ForAllocationSiteList(), | 536 Add<HStoreNamedField>(site_list, HObjectAccess::ForAllocationSiteList(), |
531 object, INITIALIZING_STORE); | 537 object, INITIALIZING_STORE); |
532 | 538 |
533 // We use a hammer (SkipWriteBarrier()) to indicate that we know the input | 539 // We use a hammer (SkipWriteBarrier()) to indicate that we know the input |
534 // cell is really a Cell, and so no write barrier is needed. | 540 // cell is really a Cell, and so no write barrier is needed. |
535 // TODO(mvstanton): Add a debug_code check to verify the input cell is really | 541 // TODO(mvstanton): Add a debug_code check to verify the input cell is really |
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1062 HParameter* receiver = GetParameter(0); | 1068 HParameter* receiver = GetParameter(0); |
1063 HParameter* value = GetParameter(2); | 1069 HParameter* value = GetParameter(2); |
1064 | 1070 |
1065 // Check that the map of the global has not changed: use a placeholder map | 1071 // Check that the map of the global has not changed: use a placeholder map |
1066 // that will be replaced later with the global object's map. | 1072 // that will be replaced later with the global object's map. |
1067 Handle<Map> placeholder_map = isolate()->factory()->meta_map(); | 1073 Handle<Map> placeholder_map = isolate()->factory()->meta_map(); |
1068 Add<HCheckMaps>(receiver, placeholder_map, top_info()); | 1074 Add<HCheckMaps>(receiver, placeholder_map, top_info()); |
1069 | 1075 |
1070 HValue* cell = Add<HConstant>(placeholder_cell); | 1076 HValue* cell = Add<HConstant>(placeholder_cell); |
1071 HObjectAccess access(HObjectAccess::ForCellPayload(isolate())); | 1077 HObjectAccess access(HObjectAccess::ForCellPayload(isolate())); |
1072 HValue* cell_contents = Add<HLoadNamedField>(cell, access); | 1078 HValue* cell_contents = Add<HLoadNamedField>( |
| 1079 cell, static_cast<HValue*>(NULL), access); |
1073 | 1080 |
1074 if (stub->is_constant()) { | 1081 if (stub->is_constant()) { |
1075 IfBuilder builder(this); | 1082 IfBuilder builder(this); |
1076 builder.If<HCompareObjectEqAndBranch>(cell_contents, value); | 1083 builder.If<HCompareObjectEqAndBranch>(cell_contents, value); |
1077 builder.Then(); | 1084 builder.Then(); |
1078 builder.ElseDeopt("Unexpected cell contents in constant global store"); | 1085 builder.ElseDeopt("Unexpected cell contents in constant global store"); |
1079 builder.End(); | 1086 builder.End(); |
1080 } else { | 1087 } else { |
1081 // Load the payload of the global parameter cell. A hole indicates that the | 1088 // Load the payload of the global parameter cell. A hole indicates that the |
1082 // property has been deleted and that the store must be handled by the | 1089 // property has been deleted and that the store must be handled by the |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1140 HValue* code_object) { | 1147 HValue* code_object) { |
1141 Counters* counters = isolate()->counters(); | 1148 Counters* counters = isolate()->counters(); |
1142 AddIncrementCounter(counters->fast_new_closure_install_optimized()); | 1149 AddIncrementCounter(counters->fast_new_closure_install_optimized()); |
1143 | 1150 |
1144 // TODO(fschneider): Idea: store proper code pointers in the optimized code | 1151 // TODO(fschneider): Idea: store proper code pointers in the optimized code |
1145 // map and either unmangle them on marking or do nothing as the whole map is | 1152 // map and either unmangle them on marking or do nothing as the whole map is |
1146 // discarded on major GC anyway. | 1153 // discarded on major GC anyway. |
1147 Add<HStoreCodeEntry>(js_function, code_object); | 1154 Add<HStoreCodeEntry>(js_function, code_object); |
1148 | 1155 |
1149 // Now link a function into a list of optimized functions. | 1156 // Now link a function into a list of optimized functions. |
1150 HValue* optimized_functions_list = Add<HLoadNamedField>(native_context, | 1157 HValue* optimized_functions_list = Add<HLoadNamedField>( |
| 1158 native_context, static_cast<HValue*>(NULL), |
1151 HObjectAccess::ForContextSlot(Context::OPTIMIZED_FUNCTIONS_LIST)); | 1159 HObjectAccess::ForContextSlot(Context::OPTIMIZED_FUNCTIONS_LIST)); |
1152 Add<HStoreNamedField>(js_function, | 1160 Add<HStoreNamedField>(js_function, |
1153 HObjectAccess::ForNextFunctionLinkPointer(), | 1161 HObjectAccess::ForNextFunctionLinkPointer(), |
1154 optimized_functions_list, INITIALIZING_STORE); | 1162 optimized_functions_list, INITIALIZING_STORE); |
1155 | 1163 |
1156 // This store is the only one that should have a write barrier. | 1164 // This store is the only one that should have a write barrier. |
1157 Add<HStoreNamedField>(native_context, | 1165 Add<HStoreNamedField>(native_context, |
1158 HObjectAccess::ForContextSlot(Context::OPTIMIZED_FUNCTIONS_LIST), | 1166 HObjectAccess::ForContextSlot(Context::OPTIMIZED_FUNCTIONS_LIST), |
1159 js_function, INITIALIZING_STORE); | 1167 js_function, INITIALIZING_STORE); |
1160 } | 1168 } |
1161 | 1169 |
1162 | 1170 |
1163 void CodeStubGraphBuilderBase::BuildInstallCode(HValue* js_function, | 1171 void CodeStubGraphBuilderBase::BuildInstallCode(HValue* js_function, |
1164 HValue* shared_info) { | 1172 HValue* shared_info) { |
1165 Add<HStoreNamedField>(js_function, | 1173 Add<HStoreNamedField>(js_function, |
1166 HObjectAccess::ForNextFunctionLinkPointer(), | 1174 HObjectAccess::ForNextFunctionLinkPointer(), |
1167 graph()->GetConstantUndefined(), | 1175 graph()->GetConstantUndefined(), |
1168 INITIALIZING_STORE); | 1176 INITIALIZING_STORE); |
1169 HValue* code_object = Add<HLoadNamedField>(shared_info, | 1177 HValue* code_object = Add<HLoadNamedField>( |
1170 HObjectAccess::ForCodeOffset()); | 1178 shared_info, static_cast<HValue*>(NULL), HObjectAccess::ForCodeOffset()); |
1171 Add<HStoreCodeEntry>(js_function, code_object); | 1179 Add<HStoreCodeEntry>(js_function, code_object); |
1172 } | 1180 } |
1173 | 1181 |
1174 | 1182 |
1175 void CodeStubGraphBuilderBase::BuildInstallFromOptimizedCodeMap( | 1183 void CodeStubGraphBuilderBase::BuildInstallFromOptimizedCodeMap( |
1176 HValue* js_function, | 1184 HValue* js_function, |
1177 HValue* shared_info, | 1185 HValue* shared_info, |
1178 HValue* native_context) { | 1186 HValue* native_context) { |
1179 Counters* counters = isolate()->counters(); | 1187 Counters* counters = isolate()->counters(); |
1180 IfBuilder is_optimized(this); | 1188 IfBuilder is_optimized(this); |
1181 HInstruction* optimized_map = Add<HLoadNamedField>(shared_info, | 1189 HInstruction* optimized_map = Add<HLoadNamedField>( |
| 1190 shared_info, static_cast<HValue*>(NULL), |
1182 HObjectAccess::ForOptimizedCodeMap()); | 1191 HObjectAccess::ForOptimizedCodeMap()); |
1183 HValue* null_constant = Add<HConstant>(0); | 1192 HValue* null_constant = Add<HConstant>(0); |
1184 is_optimized.If<HCompareObjectEqAndBranch>(optimized_map, null_constant); | 1193 is_optimized.If<HCompareObjectEqAndBranch>(optimized_map, null_constant); |
1185 is_optimized.Then(); | 1194 is_optimized.Then(); |
1186 { | 1195 { |
1187 BuildInstallCode(js_function, shared_info); | 1196 BuildInstallCode(js_function, shared_info); |
1188 } | 1197 } |
1189 is_optimized.Else(); | 1198 is_optimized.Else(); |
1190 { | 1199 { |
1191 AddIncrementCounter(counters->fast_new_closure_try_optimized()); | 1200 AddIncrementCounter(counters->fast_new_closure_try_optimized()); |
1192 // optimized_map points to fixed array of 3-element entries | 1201 // optimized_map points to fixed array of 3-element entries |
1193 // (native context, optimized code, literals). | 1202 // (native context, optimized code, literals). |
1194 // Map must never be empty, so check the first elements. | 1203 // Map must never be empty, so check the first elements. |
1195 Label install_optimized; | 1204 Label install_optimized; |
1196 HValue* first_context_slot = Add<HLoadNamedField>(optimized_map, | 1205 HValue* first_context_slot = Add<HLoadNamedField>( |
| 1206 optimized_map, static_cast<HValue*>(NULL), |
1197 HObjectAccess::ForFirstContextSlot()); | 1207 HObjectAccess::ForFirstContextSlot()); |
1198 HValue* first_osr_ast_slot = Add<HLoadNamedField>(optimized_map, | 1208 HValue* first_osr_ast_slot = Add<HLoadNamedField>( |
| 1209 optimized_map, static_cast<HValue*>(NULL), |
1199 HObjectAccess::ForFirstOsrAstIdSlot()); | 1210 HObjectAccess::ForFirstOsrAstIdSlot()); |
1200 HValue* osr_ast_id_none = Add<HConstant>(BailoutId::None().ToInt()); | 1211 HValue* osr_ast_id_none = Add<HConstant>(BailoutId::None().ToInt()); |
1201 IfBuilder already_in(this); | 1212 IfBuilder already_in(this); |
1202 already_in.If<HCompareObjectEqAndBranch>(native_context, | 1213 already_in.If<HCompareObjectEqAndBranch>(native_context, |
1203 first_context_slot); | 1214 first_context_slot); |
1204 already_in.AndIf<HCompareObjectEqAndBranch>(first_osr_ast_slot, | 1215 already_in.AndIf<HCompareObjectEqAndBranch>(first_osr_ast_slot, |
1205 osr_ast_id_none); | 1216 osr_ast_id_none); |
1206 already_in.Then(); | 1217 already_in.Then(); |
1207 { | 1218 { |
1208 HValue* code_object = Add<HLoadNamedField>(optimized_map, | 1219 HValue* code_object = Add<HLoadNamedField>( |
1209 HObjectAccess::ForFirstCodeSlot()); | 1220 optimized_map, static_cast<HValue*>(NULL), |
| 1221 HObjectAccess::ForFirstCodeSlot()); |
1210 BuildInstallOptimizedCode(js_function, native_context, code_object); | 1222 BuildInstallOptimizedCode(js_function, native_context, code_object); |
1211 } | 1223 } |
1212 already_in.Else(); | 1224 already_in.Else(); |
1213 { | 1225 { |
1214 HValue* shared_function_entry_length = | 1226 HValue* shared_function_entry_length = |
1215 Add<HConstant>(SharedFunctionInfo::kEntryLength); | 1227 Add<HConstant>(SharedFunctionInfo::kEntryLength); |
1216 LoopBuilder loop_builder(this, | 1228 LoopBuilder loop_builder(this, |
1217 context(), | 1229 context(), |
1218 LoopBuilder::kPostDecrement, | 1230 LoopBuilder::kPostDecrement, |
1219 shared_function_entry_length); | 1231 shared_function_entry_length); |
1220 HValue* array_length = Add<HLoadNamedField>(optimized_map, | 1232 HValue* array_length = Add<HLoadNamedField>( |
| 1233 optimized_map, static_cast<HValue*>(NULL), |
1221 HObjectAccess::ForFixedArrayLength()); | 1234 HObjectAccess::ForFixedArrayLength()); |
1222 HValue* slot_iterator = loop_builder.BeginBody(array_length, | 1235 HValue* slot_iterator = loop_builder.BeginBody(array_length, |
1223 graph()->GetConstant0(), | 1236 graph()->GetConstant0(), |
1224 Token::GT); | 1237 Token::GT); |
1225 { | 1238 { |
1226 // Iterate through the rest of map backwards. | 1239 // Iterate through the rest of map backwards. |
1227 // Do not double check first entry. | 1240 // Do not double check first entry. |
1228 HValue* second_entry_index = | 1241 HValue* second_entry_index = |
1229 Add<HConstant>(SharedFunctionInfo::kSecondEntryIndex); | 1242 Add<HConstant>(SharedFunctionInfo::kSecondEntryIndex); |
1230 IfBuilder restore_check(this); | 1243 IfBuilder restore_check(this); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1293 HValue* size = Add<HConstant>(JSFunction::kSize); | 1306 HValue* size = Add<HConstant>(JSFunction::kSize); |
1294 HInstruction* js_function = Add<HAllocate>(size, HType::JSObject(), | 1307 HInstruction* js_function = Add<HAllocate>(size, HType::JSObject(), |
1295 NOT_TENURED, JS_FUNCTION_TYPE); | 1308 NOT_TENURED, JS_FUNCTION_TYPE); |
1296 | 1309 |
1297 int map_index = Context::FunctionMapIndex(casted_stub()->language_mode(), | 1310 int map_index = Context::FunctionMapIndex(casted_stub()->language_mode(), |
1298 casted_stub()->is_generator()); | 1311 casted_stub()->is_generator()); |
1299 | 1312 |
1300 // Compute the function map in the current native context and set that | 1313 // Compute the function map in the current native context and set that |
1301 // as the map of the allocated object. | 1314 // as the map of the allocated object. |
1302 HInstruction* native_context = BuildGetNativeContext(); | 1315 HInstruction* native_context = BuildGetNativeContext(); |
1303 HInstruction* map_slot_value = Add<HLoadNamedField>(native_context, | 1316 HInstruction* map_slot_value = Add<HLoadNamedField>( |
| 1317 native_context, static_cast<HValue*>(NULL), |
1304 HObjectAccess::ForContextSlot(map_index)); | 1318 HObjectAccess::ForContextSlot(map_index)); |
1305 Add<HStoreNamedField>(js_function, HObjectAccess::ForMap(), map_slot_value, | 1319 Add<HStoreNamedField>(js_function, HObjectAccess::ForMap(), map_slot_value, |
1306 INITIALIZING_STORE); | 1320 INITIALIZING_STORE); |
1307 | 1321 |
1308 // Initialize the rest of the function. | 1322 // Initialize the rest of the function. |
1309 Add<HStoreNamedField>(js_function, HObjectAccess::ForPropertiesPointer(), | 1323 Add<HStoreNamedField>(js_function, HObjectAccess::ForPropertiesPointer(), |
1310 empty_fixed_array, INITIALIZING_STORE); | 1324 empty_fixed_array, INITIALIZING_STORE); |
1311 Add<HStoreNamedField>(js_function, HObjectAccess::ForElementsPointer(), | 1325 Add<HStoreNamedField>(js_function, HObjectAccess::ForElementsPointer(), |
1312 empty_fixed_array, INITIALIZING_STORE); | 1326 empty_fixed_array, INITIALIZING_STORE); |
1313 Add<HStoreNamedField>(js_function, HObjectAccess::ForLiteralsPointer(), | 1327 Add<HStoreNamedField>(js_function, HObjectAccess::ForLiteralsPointer(), |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1363 function, INITIALIZING_STORE); | 1377 function, INITIALIZING_STORE); |
1364 Add<HStoreNamedField>(function_context, | 1378 Add<HStoreNamedField>(function_context, |
1365 HObjectAccess::ForContextSlot(Context::PREVIOUS_INDEX), | 1379 HObjectAccess::ForContextSlot(Context::PREVIOUS_INDEX), |
1366 context(), INITIALIZING_STORE); | 1380 context(), INITIALIZING_STORE); |
1367 Add<HStoreNamedField>(function_context, | 1381 Add<HStoreNamedField>(function_context, |
1368 HObjectAccess::ForContextSlot(Context::EXTENSION_INDEX), | 1382 HObjectAccess::ForContextSlot(Context::EXTENSION_INDEX), |
1369 graph()->GetConstant0(), INITIALIZING_STORE); | 1383 graph()->GetConstant0(), INITIALIZING_STORE); |
1370 | 1384 |
1371 // Copy the global object from the previous context. | 1385 // Copy the global object from the previous context. |
1372 HValue* global_object = Add<HLoadNamedField>( | 1386 HValue* global_object = Add<HLoadNamedField>( |
1373 context(), HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)); | 1387 context(), static_cast<HValue*>(NULL), |
| 1388 HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)); |
1374 Add<HStoreNamedField>(function_context, | 1389 Add<HStoreNamedField>(function_context, |
1375 HObjectAccess::ForContextSlot( | 1390 HObjectAccess::ForContextSlot( |
1376 Context::GLOBAL_OBJECT_INDEX), | 1391 Context::GLOBAL_OBJECT_INDEX), |
1377 global_object, | 1392 global_object, |
1378 INITIALIZING_STORE); | 1393 INITIALIZING_STORE); |
1379 | 1394 |
1380 // Initialize the rest of the slots to undefined. | 1395 // Initialize the rest of the slots to undefined. |
1381 for (int i = Context::MIN_CONTEXT_SLOTS; i < length; ++i) { | 1396 for (int i = Context::MIN_CONTEXT_SLOTS; i < length; ++i) { |
1382 Add<HStoreNamedField>(function_context, | 1397 Add<HStoreNamedField>(function_context, |
1383 HObjectAccess::ForContextSlot(i), | 1398 HObjectAccess::ForContextSlot(i), |
(...skipping 20 matching lines...) Expand all Loading... |
1404 return BuildUncheckedDictionaryElementLoad(receiver, key); | 1419 return BuildUncheckedDictionaryElementLoad(receiver, key); |
1405 } | 1420 } |
1406 | 1421 |
1407 | 1422 |
1408 Handle<Code> KeyedLoadDictionaryElementStub::GenerateCode(Isolate* isolate) { | 1423 Handle<Code> KeyedLoadDictionaryElementStub::GenerateCode(Isolate* isolate) { |
1409 return DoGenerateCode(isolate, this); | 1424 return DoGenerateCode(isolate, this); |
1410 } | 1425 } |
1411 | 1426 |
1412 | 1427 |
1413 } } // namespace v8::internal | 1428 } } // namespace v8::internal |
OLD | NEW |