OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 <utility> | 5 #include <utility> |
6 | 6 |
7 #include "src/compiler/pipeline.h" | 7 #include "src/compiler/pipeline.h" |
8 #include "src/execution.h" | 8 #include "src/execution.h" |
9 #include "src/handles.h" | 9 #include "src/handles.h" |
10 #include "src/interpreter/bytecode-array-builder.h" | 10 #include "src/interpreter/bytecode-array-builder.h" |
(...skipping 1661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1672 Zone* zone = scope.main_zone(); | 1672 Zone* zone = scope.main_zone(); |
1673 Factory* factory = isolate->factory(); | 1673 Factory* factory = isolate->factory(); |
1674 | 1674 |
1675 ExpectedSnippet<0> snippets[] = { | 1675 ExpectedSnippet<0> snippets[] = { |
1676 {"function f() {return arguments[0];}", {factory->undefined_value()}}, | 1676 {"function f() {return arguments[0];}", {factory->undefined_value()}}, |
1677 {"function f(a) {return arguments[0];}", {factory->undefined_value()}}, | 1677 {"function f(a) {return arguments[0];}", {factory->undefined_value()}}, |
1678 {"function f() {'use strict'; return arguments[0];}", | 1678 {"function f() {'use strict'; return arguments[0];}", |
1679 {factory->undefined_value()}}, | 1679 {factory->undefined_value()}}, |
1680 {"function f(a) {'use strict'; return arguments[0];}", | 1680 {"function f(a) {'use strict'; return arguments[0];}", |
1681 {factory->undefined_value()}}, | 1681 {factory->undefined_value()}}, |
| 1682 {"function f(...restArgs) {return restArgs[0];}", |
| 1683 {factory->undefined_value()}}, |
| 1684 {"function f(a, ...restArgs) {return restArgs[0];}", |
| 1685 {factory->undefined_value()}}, |
1682 }; | 1686 }; |
1683 | 1687 |
1684 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1688 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
1685 for (size_t i = 0; i < num_snippets; i++) { | 1689 for (size_t i = 0; i < num_snippets; i++) { |
1686 ScopedVector<char> script(1024); | 1690 ScopedVector<char> script(1024); |
1687 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); | 1691 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); |
1688 | 1692 |
1689 BytecodeGraphTester tester(isolate, zone, script.start()); | 1693 BytecodeGraphTester tester(isolate, zone, script.start()); |
1690 auto callable = tester.GetCallable<>(); | 1694 auto callable = tester.GetCallable<>(); |
1691 Handle<Object> return_value = callable().ToHandleChecked(); | 1695 Handle<Object> return_value = callable().ToHandleChecked(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1734 auto callable = | 1738 auto callable = |
1735 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); | 1739 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); |
1736 Handle<Object> return_value = | 1740 Handle<Object> return_value = |
1737 callable(snippets[i].parameter(0), snippets[i].parameter(1), | 1741 callable(snippets[i].parameter(0), snippets[i].parameter(1), |
1738 snippets[i].parameter(2)) | 1742 snippets[i].parameter(2)) |
1739 .ToHandleChecked(); | 1743 .ToHandleChecked(); |
1740 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1744 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1741 } | 1745 } |
1742 } | 1746 } |
1743 | 1747 |
| 1748 TEST(BytecodeGraphBuilderCreateRestArguments) { |
| 1749 HandleAndZoneScope scope; |
| 1750 Isolate* isolate = scope.main_isolate(); |
| 1751 Zone* zone = scope.main_zone(); |
| 1752 Factory* factory = isolate->factory(); |
| 1753 |
| 1754 ExpectedSnippet<3> snippets[] = { |
| 1755 {"function f(...restArgs) {return restArgs[0];}", |
| 1756 {factory->NewNumberFromInt(1), factory->NewNumberFromInt(1), |
| 1757 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
| 1758 {"function f(a, b, ...restArgs) {return restArgs[0];}", |
| 1759 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(1), |
| 1760 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
| 1761 {"function f(a, b, ...restArgs) {return arguments[2];}", |
| 1762 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(1), |
| 1763 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
| 1764 {"function f(a, ...restArgs) { return restArgs[2];}", |
| 1765 {factory->undefined_value(), factory->NewNumberFromInt(1), |
| 1766 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
| 1767 {"function f(a, ...restArgs) { return arguments[0] + restArgs[1];}", |
| 1768 {factory->NewNumberFromInt(4), factory->NewNumberFromInt(1), |
| 1769 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
| 1770 {"function inline_func(a, ...restArgs) { return restArgs[0] }" |
| 1771 "function f(a, b, c) {return inline_func(b, c) + arguments[0];}", |
| 1772 {factory->NewNumberFromInt(31), factory->NewNumberFromInt(1), |
| 1773 factory->NewNumberFromInt(2), factory->NewNumberFromInt(30)}}, |
| 1774 }; |
| 1775 |
| 1776 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
| 1777 for (size_t i = 0; i < num_snippets; i++) { |
| 1778 ScopedVector<char> script(1024); |
| 1779 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); |
| 1780 |
| 1781 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1782 auto callable = |
| 1783 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); |
| 1784 Handle<Object> return_value = |
| 1785 callable(snippets[i].parameter(0), snippets[i].parameter(1), |
| 1786 snippets[i].parameter(2)) |
| 1787 .ToHandleChecked(); |
| 1788 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1789 } |
| 1790 } |
1744 | 1791 |
1745 TEST(BytecodeGraphBuilderRegExpLiterals) { | 1792 TEST(BytecodeGraphBuilderRegExpLiterals) { |
1746 HandleAndZoneScope scope; | 1793 HandleAndZoneScope scope; |
1747 Isolate* isolate = scope.main_isolate(); | 1794 Isolate* isolate = scope.main_isolate(); |
1748 Zone* zone = scope.main_zone(); | 1795 Zone* zone = scope.main_zone(); |
1749 Factory* factory = isolate->factory(); | 1796 Factory* factory = isolate->factory(); |
1750 | 1797 |
1751 ExpectedSnippet<0> snippets[] = { | 1798 ExpectedSnippet<0> snippets[] = { |
1752 {"return /abd/.exec('cccabbdd');", {factory->null_value()}}, | 1799 {"return /abd/.exec('cccabbdd');", {factory->null_value()}}, |
1753 {"return /ab+d/.exec('cccabbdd')[0];", | 1800 {"return /ab+d/.exec('cccabbdd')[0];", |
(...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2627 Handle<Object> return_value = callable().ToHandleChecked(); | 2674 Handle<Object> return_value = callable().ToHandleChecked(); |
2628 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2675 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2629 } | 2676 } |
2630 | 2677 |
2631 FLAG_harmony_do_expressions = old_flag; | 2678 FLAG_harmony_do_expressions = old_flag; |
2632 } | 2679 } |
2633 | 2680 |
2634 } // namespace compiler | 2681 } // namespace compiler |
2635 } // namespace internal | 2682 } // namespace internal |
2636 } // namespace v8 | 2683 } // namespace v8 |
OLD | NEW |