OLD | NEW |
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/code-factory.h" | 5 #include "src/code-factory.h" |
6 #include "src/compiler/access-builder.h" | 6 #include "src/compiler/access-builder.h" |
7 #include "src/compiler/js-graph.h" | 7 #include "src/compiler/js-graph.h" |
8 #include "src/compiler/js-typed-lowering.h" | 8 #include "src/compiler/js-typed-lowering.h" |
9 #include "src/compiler/linkage.h" | 9 #include "src/compiler/linkage.h" |
10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
(...skipping 1233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1244 Handle<Context>::cast(context_type->AsConstant()->Value()) | 1244 Handle<Context>::cast(context_type->AsConstant()->Value()) |
1245 ->global_proxy(), | 1245 ->global_proxy(), |
1246 isolate()); | 1246 isolate()); |
1247 receiver = jsgraph()->Constant(global_proxy); | 1247 receiver = jsgraph()->Constant(global_proxy); |
1248 } else { | 1248 } else { |
1249 Node* global_object = effect = graph()->NewNode( | 1249 Node* global_object = effect = graph()->NewNode( |
1250 javascript()->LoadContext(0, Context::GLOBAL_OBJECT_INDEX, true), | 1250 javascript()->LoadContext(0, Context::GLOBAL_OBJECT_INDEX, true), |
1251 context, context, effect); | 1251 context, context, effect); |
1252 receiver = effect = | 1252 receiver = effect = |
1253 graph()->NewNode(simplified()->LoadField( | 1253 graph()->NewNode(simplified()->LoadField( |
1254 AccessBuilder::ForGlobalObjectGlobalProxy()), | 1254 AccessBuilder::ForJSGlobalObjectGlobalProxy()), |
1255 global_object, effect, control); | 1255 global_object, effect, control); |
1256 } | 1256 } |
1257 } else if (!receiver_type->Maybe(Type::NullOrUndefined()) || | 1257 } else if (!receiver_type->Maybe(Type::NullOrUndefined()) || |
1258 mode == ConvertReceiverMode::kNotNullOrUndefined) { | 1258 mode == ConvertReceiverMode::kNotNullOrUndefined) { |
1259 receiver = effect = | 1259 receiver = effect = |
1260 graph()->NewNode(javascript()->ToObject(), receiver, context, | 1260 graph()->NewNode(javascript()->ToObject(), receiver, context, |
1261 frame_state, effect, control); | 1261 frame_state, effect, control); |
1262 } else { | 1262 } else { |
1263 // Check {receiver} for undefined. | 1263 // Check {receiver} for undefined. |
1264 Node* check0 = | 1264 Node* check0 = |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1297 if (context_type->IsConstant()) { | 1297 if (context_type->IsConstant()) { |
1298 Handle<JSObject> global_proxy( | 1298 Handle<JSObject> global_proxy( |
1299 Handle<Context>::cast(context_type->AsConstant()->Value()) | 1299 Handle<Context>::cast(context_type->AsConstant()->Value()) |
1300 ->global_proxy(), | 1300 ->global_proxy(), |
1301 isolate()); | 1301 isolate()); |
1302 rglobal = jsgraph()->Constant(global_proxy); | 1302 rglobal = jsgraph()->Constant(global_proxy); |
1303 } else { | 1303 } else { |
1304 Node* global_object = eglobal = graph()->NewNode( | 1304 Node* global_object = eglobal = graph()->NewNode( |
1305 javascript()->LoadContext(0, Context::GLOBAL_OBJECT_INDEX, true), | 1305 javascript()->LoadContext(0, Context::GLOBAL_OBJECT_INDEX, true), |
1306 context, context, eglobal); | 1306 context, context, eglobal); |
1307 rglobal = eglobal = | 1307 rglobal = eglobal = graph()->NewNode( |
1308 graph()->NewNode(simplified()->LoadField( | 1308 simplified()->LoadField( |
1309 AccessBuilder::ForGlobalObjectGlobalProxy()), | 1309 AccessBuilder::ForJSGlobalObjectGlobalProxy()), |
1310 global_object, eglobal, if_global); | 1310 global_object, eglobal, if_global); |
1311 } | 1311 } |
1312 } | 1312 } |
1313 | 1313 |
1314 control = graph()->NewNode(common()->Merge(2), if_convert, if_global); | 1314 control = graph()->NewNode(common()->Merge(2), if_convert, if_global); |
1315 effect = | 1315 effect = |
1316 graph()->NewNode(common()->EffectPhi(2), econvert, eglobal, control); | 1316 graph()->NewNode(common()->EffectPhi(2), econvert, eglobal, control); |
1317 receiver = graph()->NewNode(common()->Phi(kMachAnyTagged, 2), rconvert, | 1317 receiver = graph()->NewNode(common()->Phi(kMachAnyTagged, 2), rconvert, |
1318 rglobal, control); | 1318 rglobal, control); |
1319 } | 1319 } |
1320 } | 1320 } |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1390 FrameStateInfo args_state_info = OpParameter<FrameStateInfo>(args_state); | 1390 FrameStateInfo args_state_info = OpParameter<FrameStateInfo>(args_state); |
1391 // Prepare element backing store to be used by arguments object. | 1391 // Prepare element backing store to be used by arguments object. |
1392 bool has_aliased_arguments = false; | 1392 bool has_aliased_arguments = false; |
1393 Node* const elements = AllocateAliasedArguments( | 1393 Node* const elements = AllocateAliasedArguments( |
1394 effect, control, args_state, context, shared, &has_aliased_arguments); | 1394 effect, control, args_state, context, shared, &has_aliased_arguments); |
1395 // Load the arguments object map from the current native context. | 1395 // Load the arguments object map from the current native context. |
1396 Node* const load_global_object = graph()->NewNode( | 1396 Node* const load_global_object = graph()->NewNode( |
1397 simplified()->LoadField( | 1397 simplified()->LoadField( |
1398 AccessBuilder::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)), | 1398 AccessBuilder::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)), |
1399 context, effect, control); | 1399 context, effect, control); |
1400 Node* const load_native_context = graph()->NewNode( | 1400 Node* const load_native_context = |
1401 simplified()->LoadField(AccessBuilder::ForGlobalObjectNativeContext()), | 1401 graph()->NewNode(simplified()->LoadField( |
1402 load_global_object, effect, control); | 1402 AccessBuilder::ForJSGlobalObjectNativeContext()), |
| 1403 load_global_object, effect, control); |
1403 Node* const load_arguments_map = graph()->NewNode( | 1404 Node* const load_arguments_map = graph()->NewNode( |
1404 simplified()->LoadField(AccessBuilder::ForContextSlot( | 1405 simplified()->LoadField(AccessBuilder::ForContextSlot( |
1405 has_aliased_arguments ? Context::FAST_ALIASED_ARGUMENTS_MAP_INDEX | 1406 has_aliased_arguments ? Context::FAST_ALIASED_ARGUMENTS_MAP_INDEX |
1406 : Context::SLOPPY_ARGUMENTS_MAP_INDEX)), | 1407 : Context::SLOPPY_ARGUMENTS_MAP_INDEX)), |
1407 load_native_context, effect, control); | 1408 load_native_context, effect, control); |
1408 // Actually allocate and initialize the arguments object. | 1409 // Actually allocate and initialize the arguments object. |
1409 AllocationBuilder a(jsgraph(), effect, control); | 1410 AllocationBuilder a(jsgraph(), effect, control); |
1410 Node* properties = jsgraph()->EmptyFixedArrayConstant(); | 1411 Node* properties = jsgraph()->EmptyFixedArrayConstant(); |
1411 int length = args_state_info.parameter_count() - 1; // Minus receiver. | 1412 int length = args_state_info.parameter_count() - 1; // Minus receiver. |
1412 STATIC_ASSERT(Heap::kSloppyArgumentsObjectSize == 5 * kPointerSize); | 1413 STATIC_ASSERT(Heap::kSloppyArgumentsObjectSize == 5 * kPointerSize); |
(...skipping 19 matching lines...) Expand all Loading... |
1432 // there conceptually is an arguments adaptor frame in the call chain. | 1433 // there conceptually is an arguments adaptor frame in the call chain. |
1433 Node* const args_state = GetArgumentsFrameState(frame_state); | 1434 Node* const args_state = GetArgumentsFrameState(frame_state); |
1434 FrameStateInfo args_state_info = OpParameter<FrameStateInfo>(args_state); | 1435 FrameStateInfo args_state_info = OpParameter<FrameStateInfo>(args_state); |
1435 // Prepare element backing store to be used by arguments object. | 1436 // Prepare element backing store to be used by arguments object. |
1436 Node* const elements = AllocateArguments(effect, control, args_state); | 1437 Node* const elements = AllocateArguments(effect, control, args_state); |
1437 // Load the arguments object map from the current native context. | 1438 // Load the arguments object map from the current native context. |
1438 Node* const load_global_object = graph()->NewNode( | 1439 Node* const load_global_object = graph()->NewNode( |
1439 simplified()->LoadField( | 1440 simplified()->LoadField( |
1440 AccessBuilder::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)), | 1441 AccessBuilder::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)), |
1441 context, effect, control); | 1442 context, effect, control); |
1442 Node* const load_native_context = graph()->NewNode( | 1443 Node* const load_native_context = |
1443 simplified()->LoadField(AccessBuilder::ForGlobalObjectNativeContext()), | 1444 graph()->NewNode(simplified()->LoadField( |
1444 load_global_object, effect, control); | 1445 AccessBuilder::ForJSGlobalObjectNativeContext()), |
| 1446 load_global_object, effect, control); |
1445 Node* const load_arguments_map = graph()->NewNode( | 1447 Node* const load_arguments_map = graph()->NewNode( |
1446 simplified()->LoadField( | 1448 simplified()->LoadField( |
1447 AccessBuilder::ForContextSlot(Context::STRICT_ARGUMENTS_MAP_INDEX)), | 1449 AccessBuilder::ForContextSlot(Context::STRICT_ARGUMENTS_MAP_INDEX)), |
1448 load_native_context, effect, control); | 1450 load_native_context, effect, control); |
1449 // Actually allocate and initialize the arguments object. | 1451 // Actually allocate and initialize the arguments object. |
1450 AllocationBuilder a(jsgraph(), effect, control); | 1452 AllocationBuilder a(jsgraph(), effect, control); |
1451 Node* properties = jsgraph()->EmptyFixedArrayConstant(); | 1453 Node* properties = jsgraph()->EmptyFixedArrayConstant(); |
1452 int length = args_state_info.parameter_count() - 1; // Minus receiver. | 1454 int length = args_state_info.parameter_count() - 1; // Minus receiver. |
1453 STATIC_ASSERT(Heap::kStrictArgumentsObjectSize == 4 * kPointerSize); | 1455 STATIC_ASSERT(Heap::kStrictArgumentsObjectSize == 4 * kPointerSize); |
1454 a.Allocate(Heap::kStrictArgumentsObjectSize); | 1456 a.Allocate(Heap::kStrictArgumentsObjectSize); |
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2235 } | 2237 } |
2236 | 2238 |
2237 | 2239 |
2238 MachineOperatorBuilder* JSTypedLowering::machine() const { | 2240 MachineOperatorBuilder* JSTypedLowering::machine() const { |
2239 return jsgraph()->machine(); | 2241 return jsgraph()->machine(); |
2240 } | 2242 } |
2241 | 2243 |
2242 } // namespace compiler | 2244 } // namespace compiler |
2243 } // namespace internal | 2245 } // namespace internal |
2244 } // namespace v8 | 2246 } // namespace v8 |
OLD | NEW |