| 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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 HValue* GetArgumentsLength() { | 75 HValue* GetArgumentsLength() { |
| 76 // This is initialized in BuildGraph() | 76 // This is initialized in BuildGraph() |
| 77 ASSERT(arguments_length_ != NULL); | 77 ASSERT(arguments_length_ != NULL); |
| 78 return arguments_length_; | 78 return arguments_length_; |
| 79 } | 79 } |
| 80 CompilationInfo* info() { return &info_; } | 80 CompilationInfo* info() { return &info_; } |
| 81 HydrogenCodeStub* stub() { return info_.code_stub(); } | 81 HydrogenCodeStub* stub() { return info_.code_stub(); } |
| 82 HContext* context() { return context_; } | 82 HContext* context() { return context_; } |
| 83 Isolate* isolate() { return info_.isolate(); } | 83 Isolate* isolate() { return info_.isolate(); } |
| 84 | 84 |
| 85 class ArrayContextChecker { |
| 86 public: |
| 87 ArrayContextChecker(HGraphBuilder* builder, HValue* constructor, |
| 88 HValue* array_function) |
| 89 : checker_(builder) { |
| 90 checker_.If<HCompareObjectEqAndBranch, HValue*>(constructor, |
| 91 array_function); |
| 92 checker_.Then(); |
| 93 } |
| 94 |
| 95 ~ArrayContextChecker() { |
| 96 checker_.ElseDeopt(); |
| 97 checker_.End(); |
| 98 } |
| 99 private: |
| 100 IfBuilder checker_; |
| 101 }; |
| 102 |
| 85 private: | 103 private: |
| 86 SmartArrayPointer<HParameter*> parameters_; | 104 SmartArrayPointer<HParameter*> parameters_; |
| 87 HValue* arguments_length_; | 105 HValue* arguments_length_; |
| 88 CompilationInfoWithZone info_; | 106 CompilationInfoWithZone info_; |
| 89 CodeStubInterfaceDescriptor* descriptor_; | 107 CodeStubInterfaceDescriptor* descriptor_; |
| 90 HContext* context_; | 108 HContext* context_; |
| 91 }; | 109 }; |
| 92 | 110 |
| 93 | 111 |
| 94 bool CodeStubGraphBuilderBase::BuildGraph() { | 112 bool CodeStubGraphBuilderBase::BuildGraph() { |
| (...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 return DoGenerateCode(this); | 535 return DoGenerateCode(this); |
| 518 } | 536 } |
| 519 | 537 |
| 520 | 538 |
| 521 template <> | 539 template <> |
| 522 HValue* CodeStubGraphBuilder<ArrayNoArgumentConstructorStub>::BuildCodeStub() { | 540 HValue* CodeStubGraphBuilder<ArrayNoArgumentConstructorStub>::BuildCodeStub() { |
| 523 // ----------- S t a t e ------------- | 541 // ----------- S t a t e ------------- |
| 524 // -- Parameter 1 : type info cell | 542 // -- Parameter 1 : type info cell |
| 525 // -- Parameter 0 : constructor | 543 // -- Parameter 0 : constructor |
| 526 // ----------------------------------- | 544 // ----------------------------------- |
| 545 HInstruction* array_function = BuildGetArrayFunction(context()); |
| 546 ArrayContextChecker(this, |
| 547 GetParameter(ArrayConstructorStubBase::kConstructor), |
| 548 array_function); |
| 527 // Get the right map | 549 // Get the right map |
| 528 // Should be a constant | 550 // Should be a constant |
| 529 JSArrayBuilder array_builder( | 551 JSArrayBuilder array_builder( |
| 530 this, | 552 this, |
| 531 casted_stub()->elements_kind(), | 553 casted_stub()->elements_kind(), |
| 532 GetParameter(ArrayConstructorStubBase::kPropertyCell), | 554 GetParameter(ArrayConstructorStubBase::kPropertyCell), |
| 533 casted_stub()->mode()); | 555 casted_stub()->mode()); |
| 534 return array_builder.AllocateEmptyArray(); | 556 return array_builder.AllocateEmptyArray(); |
| 535 } | 557 } |
| 536 | 558 |
| 537 | 559 |
| 538 Handle<Code> ArrayNoArgumentConstructorStub::GenerateCode() { | 560 Handle<Code> ArrayNoArgumentConstructorStub::GenerateCode() { |
| 539 return DoGenerateCode(this); | 561 return DoGenerateCode(this); |
| 540 } | 562 } |
| 541 | 563 |
| 542 | 564 |
| 543 template <> | 565 template <> |
| 544 HValue* CodeStubGraphBuilder<ArraySingleArgumentConstructorStub>:: | 566 HValue* CodeStubGraphBuilder<ArraySingleArgumentConstructorStub>:: |
| 545 BuildCodeStub() { | 567 BuildCodeStub() { |
| 568 HInstruction* array_function = BuildGetArrayFunction(context()); |
| 569 ArrayContextChecker(this, |
| 570 GetParameter(ArrayConstructorStubBase::kConstructor), |
| 571 array_function); |
| 546 // Smi check and range check on the input arg. | 572 // Smi check and range check on the input arg. |
| 547 HValue* constant_one = graph()->GetConstant1(); | 573 HValue* constant_one = graph()->GetConstant1(); |
| 548 HValue* constant_zero = graph()->GetConstant0(); | 574 HValue* constant_zero = graph()->GetConstant0(); |
| 549 | 575 |
| 550 HInstruction* elements = AddInstruction( | 576 HInstruction* elements = AddInstruction( |
| 551 new(zone()) HArgumentsElements(false)); | 577 new(zone()) HArgumentsElements(false)); |
| 552 HInstruction* argument = AddInstruction( | 578 HInstruction* argument = AddInstruction( |
| 553 new(zone()) HAccessArgumentsAt(elements, constant_one, constant_zero)); | 579 new(zone()) HAccessArgumentsAt(elements, constant_one, constant_zero)); |
| 554 | 580 |
| 555 HConstant* max_alloc_length = | 581 HConstant* max_alloc_length = |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 589 } | 615 } |
| 590 | 616 |
| 591 | 617 |
| 592 Handle<Code> ArraySingleArgumentConstructorStub::GenerateCode() { | 618 Handle<Code> ArraySingleArgumentConstructorStub::GenerateCode() { |
| 593 return DoGenerateCode(this); | 619 return DoGenerateCode(this); |
| 594 } | 620 } |
| 595 | 621 |
| 596 | 622 |
| 597 template <> | 623 template <> |
| 598 HValue* CodeStubGraphBuilder<ArrayNArgumentsConstructorStub>::BuildCodeStub() { | 624 HValue* CodeStubGraphBuilder<ArrayNArgumentsConstructorStub>::BuildCodeStub() { |
| 625 HInstruction* array_function = BuildGetArrayFunction(context()); |
| 626 ArrayContextChecker(this, |
| 627 GetParameter(ArrayConstructorStubBase::kConstructor), |
| 628 array_function); |
| 599 ElementsKind kind = casted_stub()->elements_kind(); | 629 ElementsKind kind = casted_stub()->elements_kind(); |
| 600 HValue* length = GetArgumentsLength(); | 630 HValue* length = GetArgumentsLength(); |
| 601 | 631 |
| 602 JSArrayBuilder array_builder( | 632 JSArrayBuilder array_builder( |
| 603 this, | 633 this, |
| 604 kind, | 634 kind, |
| 605 GetParameter(ArrayConstructorStubBase::kPropertyCell), | 635 GetParameter(ArrayConstructorStubBase::kPropertyCell), |
| 606 casted_stub()->mode()); | 636 casted_stub()->mode()); |
| 607 | 637 |
| 608 // We need to fill with the hole if it's a smi array in the multi-argument | 638 // We need to fill with the hole if it's a smi array in the multi-argument |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 663 ? graph()->GetConstantSmi1() | 693 ? graph()->GetConstantSmi1() |
| 664 : graph()->GetConstantUndefined(); | 694 : graph()->GetConstantUndefined(); |
| 665 } | 695 } |
| 666 | 696 |
| 667 | 697 |
| 668 Handle<Code> CompareNilICStub::GenerateCode() { | 698 Handle<Code> CompareNilICStub::GenerateCode() { |
| 669 return DoGenerateCode(this); | 699 return DoGenerateCode(this); |
| 670 } | 700 } |
| 671 | 701 |
| 672 } } // namespace v8::internal | 702 } } // namespace v8::internal |
| OLD | NEW |