OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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-stubs.h" | 5 #include "src/code-stubs.h" |
6 | 6 |
7 #include "src/bailout-reason.h" | 7 #include "src/bailout-reason.h" |
8 #include "src/crankshaft/hydrogen.h" | 8 #include "src/crankshaft/hydrogen.h" |
9 #include "src/crankshaft/lithium.h" | 9 #include "src/crankshaft/lithium.h" |
10 #include "src/field-index.h" | 10 #include "src/field-index.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 Representation representation, | 78 Representation representation, |
79 bool transition_to_field); | 79 bool transition_to_field); |
80 | 80 |
81 HValue* BuildPushElement(HValue* object, HValue* argc, | 81 HValue* BuildPushElement(HValue* object, HValue* argc, |
82 HValue* argument_elements, ElementsKind kind); | 82 HValue* argument_elements, ElementsKind kind); |
83 | 83 |
84 HValue* UnmappedCase(HValue* elements, HValue* key, HValue* value); | 84 HValue* UnmappedCase(HValue* elements, HValue* key, HValue* value); |
85 HValue* EmitKeyedSloppyArguments(HValue* receiver, HValue* key, | 85 HValue* EmitKeyedSloppyArguments(HValue* receiver, HValue* key, |
86 HValue* value); | 86 HValue* value); |
87 | 87 |
88 HValue* BuildArrayConstructor(ElementsKind kind, | |
89 AllocationSiteOverrideMode override_mode); | |
90 HValue* BuildInternalArrayConstructor(ElementsKind kind); | |
91 | |
92 HValue* BuildToString(HValue* input, bool convert); | 88 HValue* BuildToString(HValue* input, bool convert); |
93 HValue* BuildToPrimitive(HValue* input, HValue* input_map); | 89 HValue* BuildToPrimitive(HValue* input, HValue* input_map); |
94 | 90 |
95 private: | 91 private: |
96 HValue* BuildArraySingleArgumentConstructor(JSArrayBuilder* builder); | |
97 HValue* BuildArrayNArgumentsConstructor(JSArrayBuilder* builder, | |
98 ElementsKind kind); | |
99 | |
100 base::SmartArrayPointer<HParameter*> parameters_; | 92 base::SmartArrayPointer<HParameter*> parameters_; |
101 HValue* arguments_length_; | 93 HValue* arguments_length_; |
102 CompilationInfo* info_; | 94 CompilationInfo* info_; |
103 CodeStub* code_stub_; | 95 CodeStub* code_stub_; |
104 CodeStubDescriptor descriptor_; | 96 CodeStubDescriptor descriptor_; |
105 HContext* context_; | 97 HContext* context_; |
106 }; | 98 }; |
107 | 99 |
108 | 100 |
109 bool CodeStubGraphBuilderBase::BuildGraph() { | 101 bool CodeStubGraphBuilderBase::BuildGraph() { |
(...skipping 1339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1449 casted_stub()->is_js_array()); | 1441 casted_stub()->is_js_array()); |
1450 | 1442 |
1451 return GetParameter(0); | 1443 return GetParameter(0); |
1452 } | 1444 } |
1453 | 1445 |
1454 | 1446 |
1455 Handle<Code> TransitionElementsKindStub::GenerateCode() { | 1447 Handle<Code> TransitionElementsKindStub::GenerateCode() { |
1456 return DoGenerateCode(this); | 1448 return DoGenerateCode(this); |
1457 } | 1449 } |
1458 | 1450 |
1459 HValue* CodeStubGraphBuilderBase::BuildArrayConstructor( | |
1460 ElementsKind kind, AllocationSiteOverrideMode override_mode) { | |
1461 HValue* constructor = GetParameter(ArrayConstructorStubBase::kConstructor); | |
1462 HValue* alloc_site = GetParameter(ArrayConstructorStubBase::kAllocationSite); | |
1463 JSArrayBuilder array_builder(this, kind, alloc_site, constructor, | |
1464 override_mode); | |
1465 return BuildArrayNArgumentsConstructor(&array_builder, kind); | |
1466 } | |
1467 | |
1468 HValue* CodeStubGraphBuilderBase::BuildInternalArrayConstructor( | |
1469 ElementsKind kind) { | |
1470 HValue* constructor = GetParameter( | |
1471 InternalArrayConstructorStubBase::kConstructor); | |
1472 JSArrayBuilder array_builder(this, kind, constructor); | |
1473 return BuildArrayNArgumentsConstructor(&array_builder, kind); | |
1474 } | |
1475 | |
1476 | |
1477 HValue* CodeStubGraphBuilderBase::BuildArraySingleArgumentConstructor( | |
1478 JSArrayBuilder* array_builder) { | |
1479 // Smi check and range check on the input arg. | |
1480 HValue* constant_one = graph()->GetConstant1(); | |
1481 HValue* constant_zero = graph()->GetConstant0(); | |
1482 | |
1483 HInstruction* elements = Add<HArgumentsElements>(false); | |
1484 HInstruction* argument = Add<HAccessArgumentsAt>( | |
1485 elements, constant_one, constant_zero); | |
1486 | |
1487 return BuildAllocateArrayFromLength(array_builder, argument); | |
1488 } | |
1489 | |
1490 | |
1491 HValue* CodeStubGraphBuilderBase::BuildArrayNArgumentsConstructor( | |
1492 JSArrayBuilder* array_builder, ElementsKind kind) { | |
1493 // Insert a bounds check because the number of arguments might exceed | |
1494 // the kInitialMaxFastElementArray limit. This cannot happen for code | |
1495 // that was parsed, but calling via Array.apply(thisArg, [...]) might | |
1496 // trigger it. | |
1497 HValue* length = GetArgumentsLength(); | |
1498 HConstant* max_alloc_length = | |
1499 Add<HConstant>(JSArray::kInitialMaxFastElementArray); | |
1500 HValue* checked_length = Add<HBoundsCheck>(length, max_alloc_length); | |
1501 | |
1502 // We need to fill with the hole if it's a smi array in the multi-argument | |
1503 // case because we might have to bail out while copying arguments into | |
1504 // the array because they aren't compatible with a smi array. | |
1505 // If it's a double array, no problem, and if it's fast then no | |
1506 // problem either because doubles are boxed. | |
1507 // | |
1508 // TODO(mvstanton): consider an instruction to memset fill the array | |
1509 // with zero in this case instead. | |
1510 JSArrayBuilder::FillMode fill_mode = IsFastSmiElementsKind(kind) | |
1511 ? JSArrayBuilder::FILL_WITH_HOLE | |
1512 : JSArrayBuilder::DONT_FILL_WITH_HOLE; | |
1513 HValue* new_object = array_builder->AllocateArray(checked_length, | |
1514 checked_length, | |
1515 fill_mode); | |
1516 HValue* elements = array_builder->GetElementsLocation(); | |
1517 DCHECK(elements != NULL); | |
1518 | |
1519 // Now populate the elements correctly. | |
1520 LoopBuilder builder(this, | |
1521 context(), | |
1522 LoopBuilder::kPostIncrement); | |
1523 HValue* start = graph()->GetConstant0(); | |
1524 HValue* key = builder.BeginBody(start, checked_length, Token::LT); | |
1525 HInstruction* argument_elements = Add<HArgumentsElements>(false); | |
1526 HInstruction* argument = Add<HAccessArgumentsAt>( | |
1527 argument_elements, checked_length, key); | |
1528 | |
1529 Add<HStoreKeyed>(elements, key, argument, nullptr, kind); | |
1530 builder.EndBody(); | |
1531 return new_object; | |
1532 } | |
1533 | |
1534 | |
1535 template <> | |
1536 HValue* CodeStubGraphBuilder<ArrayNArgumentsConstructorStub>::BuildCodeStub() { | |
1537 ElementsKind kind = casted_stub()->elements_kind(); | |
1538 AllocationSiteOverrideMode override_mode = casted_stub()->override_mode(); | |
1539 return BuildArrayConstructor(kind, override_mode); | |
1540 } | |
1541 | |
1542 | |
1543 Handle<Code> ArrayNArgumentsConstructorStub::GenerateCode() { | |
1544 return DoGenerateCode(this); | |
1545 } | |
1546 | |
1547 | |
1548 template <> | |
1549 HValue* CodeStubGraphBuilder<InternalArrayNArgumentsConstructorStub>:: | |
1550 BuildCodeStub() { | |
1551 ElementsKind kind = casted_stub()->elements_kind(); | |
1552 return BuildInternalArrayConstructor(kind); | |
1553 } | |
1554 | |
1555 | |
1556 Handle<Code> InternalArrayNArgumentsConstructorStub::GenerateCode() { | |
1557 return DoGenerateCode(this); | |
1558 } | |
1559 | |
1560 | |
1561 template <> | 1451 template <> |
1562 HValue* CodeStubGraphBuilder<BinaryOpICStub>::BuildCodeInitializedStub() { | 1452 HValue* CodeStubGraphBuilder<BinaryOpICStub>::BuildCodeInitializedStub() { |
1563 BinaryOpICState state = casted_stub()->state(); | 1453 BinaryOpICState state = casted_stub()->state(); |
1564 | 1454 |
1565 HValue* left = GetParameter(BinaryOpICStub::kLeft); | 1455 HValue* left = GetParameter(BinaryOpICStub::kLeft); |
1566 HValue* right = GetParameter(BinaryOpICStub::kRight); | 1456 HValue* right = GetParameter(BinaryOpICStub::kRight); |
1567 | 1457 |
1568 Type* left_type = state.GetLeftType(); | 1458 Type* left_type = state.GetLeftType(); |
1569 Type* right_type = state.GetRightType(); | 1459 Type* right_type = state.GetRightType(); |
1570 Type* result_type = state.GetResultType(); | 1460 Type* result_type = state.GetResultType(); |
(...skipping 793 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2364 return Pop(); | 2254 return Pop(); |
2365 } | 2255 } |
2366 | 2256 |
2367 | 2257 |
2368 Handle<Code> KeyedLoadGenericStub::GenerateCode() { | 2258 Handle<Code> KeyedLoadGenericStub::GenerateCode() { |
2369 return DoGenerateCode(this); | 2259 return DoGenerateCode(this); |
2370 } | 2260 } |
2371 | 2261 |
2372 } // namespace internal | 2262 } // namespace internal |
2373 } // namespace v8 | 2263 } // namespace v8 |
OLD | NEW |