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 "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/execution.h" | 7 #include "src/execution.h" |
8 #include "src/handles.h" | 8 #include "src/handles.h" |
9 #include "src/interpreter/bytecode-array-builder.h" | 9 #include "src/interpreter/bytecode-array-builder.h" |
10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
(...skipping 1713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1724 Handle<Smi>(Smi::FromInt(3), handles.main_isolate())).ToHandleChecked(); | 1724 Handle<Smi>(Smi::FromInt(3), handles.main_isolate())).ToHandleChecked(); |
1725 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5)); | 1725 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5)); |
1726 } | 1726 } |
1727 | 1727 |
1728 | 1728 |
1729 TEST(InterpreterRegExpLiterals) { | 1729 TEST(InterpreterRegExpLiterals) { |
1730 HandleAndZoneScope handles; | 1730 HandleAndZoneScope handles; |
1731 i::Isolate* isolate = handles.main_isolate(); | 1731 i::Isolate* isolate = handles.main_isolate(); |
1732 i::Factory* factory = isolate->factory(); | 1732 i::Factory* factory = isolate->factory(); |
1733 | 1733 |
1734 std::pair<const char*, Handle<Object>> literals[5] = { | 1734 std::pair<const char*, Handle<Object>> literals[] = { |
1735 std::make_pair("return /abd/.exec('cccabbdd');\n", | 1735 std::make_pair("return /abd/.exec('cccabbdd');\n", |
1736 factory->null_value()), | 1736 factory->null_value()), |
1737 std::make_pair("return /ab+d/.exec('cccabbdd')[0];\n", | 1737 std::make_pair("return /ab+d/.exec('cccabbdd')[0];\n", |
1738 factory->NewStringFromStaticChars("abbd")), | 1738 factory->NewStringFromStaticChars("abbd")), |
1739 std::make_pair("return /AbC/i.exec('ssaBC')[0];\n", | 1739 std::make_pair("return /AbC/i.exec('ssaBC')[0];\n", |
1740 factory->NewStringFromStaticChars("aBC")), | 1740 factory->NewStringFromStaticChars("aBC")), |
1741 std::make_pair("return 'ssaBC'.match(/AbC/i)[0];\n", | 1741 std::make_pair("return 'ssaBC'.match(/AbC/i)[0];\n", |
1742 factory->NewStringFromStaticChars("aBC")), | 1742 factory->NewStringFromStaticChars("aBC")), |
1743 std::make_pair("return 'ssaBCtAbC'.match(/(AbC)/gi)[1];\n", | 1743 std::make_pair("return 'ssaBCtAbC'.match(/(AbC)/gi)[1];\n", |
1744 factory->NewStringFromStaticChars("AbC")), | 1744 factory->NewStringFromStaticChars("AbC")), |
1745 }; | 1745 }; |
1746 | 1746 |
1747 for (size_t i = 0; i < arraysize(literals); i++) { | 1747 for (size_t i = 0; i < arraysize(literals); i++) { |
1748 std::string source(InterpreterTester::SourceForBody(literals[i].first)); | 1748 std::string source(InterpreterTester::SourceForBody(literals[i].first)); |
1749 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 1749 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
1750 auto callable = tester.GetCallable<>(); | 1750 auto callable = tester.GetCallable<>(); |
1751 | 1751 |
1752 Handle<i::Object> return_value = callable().ToHandleChecked(); | 1752 Handle<i::Object> return_value = callable().ToHandleChecked(); |
1753 CHECK(return_value->SameValue(*literals[i].second)); | 1753 CHECK(return_value->SameValue(*literals[i].second)); |
1754 } | 1754 } |
1755 } | 1755 } |
1756 | 1756 |
1757 | 1757 |
1758 TEST(InterpreterArrayLiterals) { | 1758 TEST(InterpreterArrayLiterals) { |
1759 HandleAndZoneScope handles; | 1759 HandleAndZoneScope handles; |
1760 i::Isolate* isolate = handles.main_isolate(); | 1760 i::Isolate* isolate = handles.main_isolate(); |
1761 i::Factory* factory = isolate->factory(); | 1761 i::Factory* factory = isolate->factory(); |
1762 | 1762 |
1763 std::pair<const char*, Handle<Object>> literals[6] = { | 1763 std::pair<const char*, Handle<Object>> literals[] = { |
1764 std::make_pair("return [][0];\n", | 1764 std::make_pair("return [][0];\n", |
1765 factory->undefined_value()), | 1765 factory->undefined_value()), |
1766 std::make_pair("return [1, 3, 2][1];\n", | 1766 std::make_pair("return [1, 3, 2][1];\n", |
1767 handle(Smi::FromInt(3), isolate)), | 1767 handle(Smi::FromInt(3), isolate)), |
1768 std::make_pair("return ['a', 'b', 'c'][2];\n", | 1768 std::make_pair("return ['a', 'b', 'c'][2];\n", |
1769 factory->NewStringFromStaticChars("c")), | 1769 factory->NewStringFromStaticChars("c")), |
1770 std::make_pair("var a = 100; return [a, a + 1, a + 2, a + 3][2];\n", | 1770 std::make_pair("var a = 100; return [a, a + 1, a + 2, a + 3][2];\n", |
1771 handle(Smi::FromInt(102), isolate)), | 1771 handle(Smi::FromInt(102), isolate)), |
1772 std::make_pair("return [[1, 2, 3], ['a', 'b', 'c']][1][0];\n", | 1772 std::make_pair("return [[1, 2, 3], ['a', 'b', 'c']][1][0];\n", |
1773 factory->NewStringFromStaticChars("a")), | 1773 factory->NewStringFromStaticChars("a")), |
(...skipping 10 matching lines...) Expand all Loading... |
1784 CHECK(return_value->SameValue(*literals[i].second)); | 1784 CHECK(return_value->SameValue(*literals[i].second)); |
1785 } | 1785 } |
1786 } | 1786 } |
1787 | 1787 |
1788 | 1788 |
1789 TEST(InterpreterObjectLiterals) { | 1789 TEST(InterpreterObjectLiterals) { |
1790 HandleAndZoneScope handles; | 1790 HandleAndZoneScope handles; |
1791 i::Isolate* isolate = handles.main_isolate(); | 1791 i::Isolate* isolate = handles.main_isolate(); |
1792 i::Factory* factory = isolate->factory(); | 1792 i::Factory* factory = isolate->factory(); |
1793 | 1793 |
1794 std::pair<const char*, Handle<Object>> literals[14] = { | 1794 std::pair<const char*, Handle<Object>> literals[] = { |
1795 std::make_pair("return { }.name;", | 1795 std::make_pair("return { }.name;", |
1796 factory->undefined_value()), | 1796 factory->undefined_value()), |
1797 std::make_pair("return { name: 'string', val: 9.2 }.name;", | 1797 std::make_pair("return { name: 'string', val: 9.2 }.name;", |
1798 factory->NewStringFromStaticChars("string")), | 1798 factory->NewStringFromStaticChars("string")), |
1799 std::make_pair("var a = 15; return { name: 'string', val: a }.val;", | 1799 std::make_pair("var a = 15; return { name: 'string', val: a }.val;", |
1800 handle(Smi::FromInt(15), isolate)), | 1800 handle(Smi::FromInt(15), isolate)), |
1801 std::make_pair("var a = 5; return { val: a, val: a + 1 }.val;", | 1801 std::make_pair("var a = 5; return { val: a, val: a + 1 }.val;", |
1802 handle(Smi::FromInt(6), isolate)), | 1802 handle(Smi::FromInt(6), isolate)), |
1803 std::make_pair("return { func: function() { return 'test' } }.func();", | 1803 std::make_pair("return { func: function() { return 'test' } }.func();", |
1804 factory->NewStringFromStaticChars("test")), | 1804 factory->NewStringFromStaticChars("test")), |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1895 | 1895 |
1896 Handle<Object> return_val = callable().ToHandleChecked(); | 1896 Handle<Object> return_val = callable().ToHandleChecked(); |
1897 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(15)); | 1897 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(15)); |
1898 } | 1898 } |
1899 | 1899 |
1900 | 1900 |
1901 TEST(InterpreterContextVariables) { | 1901 TEST(InterpreterContextVariables) { |
1902 HandleAndZoneScope handles; | 1902 HandleAndZoneScope handles; |
1903 i::Isolate* isolate = handles.main_isolate(); | 1903 i::Isolate* isolate = handles.main_isolate(); |
1904 | 1904 |
1905 std::pair<const char*, Handle<Object>> context_vars[5] = { | 1905 std::pair<const char*, Handle<Object>> context_vars[] = { |
1906 std::make_pair("var a; (function() { a = 1; })(); return a;", | 1906 std::make_pair("var a; (function() { a = 1; })(); return a;", |
1907 handle(Smi::FromInt(1), isolate)), | 1907 handle(Smi::FromInt(1), isolate)), |
1908 std::make_pair("var a = 10; (function() { a; })(); return a;", | 1908 std::make_pair("var a = 10; (function() { a; })(); return a;", |
1909 handle(Smi::FromInt(10), isolate)), | 1909 handle(Smi::FromInt(10), isolate)), |
1910 std::make_pair("var a = 20; var b = 30;\n" | 1910 std::make_pair("var a = 20; var b = 30;\n" |
1911 "return (function() { return a + b; })();", | 1911 "return (function() { return a + b; })();", |
1912 handle(Smi::FromInt(50), isolate)), | 1912 handle(Smi::FromInt(50), isolate)), |
1913 std::make_pair("'use strict'; let a = 1;\n" | 1913 std::make_pair("'use strict'; let a = 1;\n" |
1914 "{ let b = 2; return (function() { return a + b; })(); }", | 1914 "{ let b = 2; return (function() { return a + b; })(); }", |
1915 handle(Smi::FromInt(3), isolate)), | 1915 handle(Smi::FromInt(3), isolate)), |
(...skipping 11 matching lines...) Expand all Loading... |
1927 Handle<i::Object> return_value = callable().ToHandleChecked(); | 1927 Handle<i::Object> return_value = callable().ToHandleChecked(); |
1928 CHECK(return_value->SameValue(*context_vars[i].second)); | 1928 CHECK(return_value->SameValue(*context_vars[i].second)); |
1929 } | 1929 } |
1930 } | 1930 } |
1931 | 1931 |
1932 | 1932 |
1933 TEST(InterpreterContextParameters) { | 1933 TEST(InterpreterContextParameters) { |
1934 HandleAndZoneScope handles; | 1934 HandleAndZoneScope handles; |
1935 i::Isolate* isolate = handles.main_isolate(); | 1935 i::Isolate* isolate = handles.main_isolate(); |
1936 | 1936 |
1937 std::pair<const char*, Handle<Object>> context_params[3] = { | 1937 std::pair<const char*, Handle<Object>> context_params[] = { |
1938 std::make_pair("return (function() { return arg1; })();", | 1938 std::make_pair("return (function() { return arg1; })();", |
1939 handle(Smi::FromInt(1), isolate)), | 1939 handle(Smi::FromInt(1), isolate)), |
1940 std::make_pair("(function() { arg1 = 4; })(); return arg1;", | 1940 std::make_pair("(function() { arg1 = 4; })(); return arg1;", |
1941 handle(Smi::FromInt(4), isolate)), | 1941 handle(Smi::FromInt(4), isolate)), |
1942 std::make_pair("(function() { arg3 = arg2 - arg1; })(); return arg3;", | 1942 std::make_pair("(function() { arg3 = arg2 - arg1; })(); return arg3;", |
1943 handle(Smi::FromInt(1), isolate)), | 1943 handle(Smi::FromInt(1), isolate)), |
1944 }; | 1944 }; |
1945 | 1945 |
1946 for (size_t i = 0; i < arraysize(context_params); i++) { | 1946 for (size_t i = 0; i < arraysize(context_params); i++) { |
1947 std::string source = "function " + InterpreterTester::function_name() + | 1947 std::string source = "function " + InterpreterTester::function_name() + |
1948 "(arg1, arg2, arg3) {" + context_params[i].first + "}"; | 1948 "(arg1, arg2, arg3) {" + context_params[i].first + "}"; |
1949 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 1949 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
1950 auto callable = | 1950 auto callable = |
1951 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); | 1951 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); |
1952 | 1952 |
1953 Handle<Object> a1 = handle(Smi::FromInt(1), isolate); | 1953 Handle<Object> a1 = handle(Smi::FromInt(1), isolate); |
1954 Handle<Object> a2 = handle(Smi::FromInt(2), isolate); | 1954 Handle<Object> a2 = handle(Smi::FromInt(2), isolate); |
1955 Handle<Object> a3 = handle(Smi::FromInt(3), isolate); | 1955 Handle<Object> a3 = handle(Smi::FromInt(3), isolate); |
1956 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked(); | 1956 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked(); |
1957 CHECK(return_value->SameValue(*context_params[i].second)); | 1957 CHECK(return_value->SameValue(*context_params[i].second)); |
1958 } | 1958 } |
1959 } | 1959 } |
1960 | 1960 |
1961 | 1961 |
1962 TEST(InterpreterOuterContextVariables) { | 1962 TEST(InterpreterOuterContextVariables) { |
1963 HandleAndZoneScope handles; | 1963 HandleAndZoneScope handles; |
1964 i::Isolate* isolate = handles.main_isolate(); | 1964 i::Isolate* isolate = handles.main_isolate(); |
1965 | 1965 |
1966 std::pair<const char*, Handle<Object>> context_vars[2] = { | 1966 std::pair<const char*, Handle<Object>> context_vars[] = { |
1967 std::make_pair("return outerVar * innerArg;", | 1967 std::make_pair("return outerVar * innerArg;", |
1968 handle(Smi::FromInt(200), isolate)), | 1968 handle(Smi::FromInt(200), isolate)), |
1969 std::make_pair("outerVar = innerArg; return outerVar", | 1969 std::make_pair("outerVar = innerArg; return outerVar", |
1970 handle(Smi::FromInt(20), isolate)), | 1970 handle(Smi::FromInt(20), isolate)), |
1971 }; | 1971 }; |
1972 | 1972 |
1973 std::string header( | 1973 std::string header( |
1974 "function Outer() {" | 1974 "function Outer() {" |
1975 " var outerVar = 10;" | 1975 " var outerVar = 10;" |
1976 " function Inner(innerArg) {" | 1976 " function Inner(innerArg) {" |
(...skipping 13 matching lines...) Expand all Loading... |
1990 CHECK(return_value->SameValue(*context_vars[i].second)); | 1990 CHECK(return_value->SameValue(*context_vars[i].second)); |
1991 } | 1991 } |
1992 } | 1992 } |
1993 | 1993 |
1994 | 1994 |
1995 TEST(InterpreterComma) { | 1995 TEST(InterpreterComma) { |
1996 HandleAndZoneScope handles; | 1996 HandleAndZoneScope handles; |
1997 i::Isolate* isolate = handles.main_isolate(); | 1997 i::Isolate* isolate = handles.main_isolate(); |
1998 i::Factory* factory = isolate->factory(); | 1998 i::Factory* factory = isolate->factory(); |
1999 | 1999 |
2000 std::pair<const char*, Handle<Object>> literals[6] = { | 2000 std::pair<const char*, Handle<Object>> literals[] = { |
2001 std::make_pair("var a; return 0, a;\n", factory->undefined_value()), | 2001 std::make_pair("var a; return 0, a;\n", factory->undefined_value()), |
2002 std::make_pair("return 'a', 2.2, 3;\n", | 2002 std::make_pair("return 'a', 2.2, 3;\n", |
2003 handle(Smi::FromInt(3), isolate)), | 2003 handle(Smi::FromInt(3), isolate)), |
2004 std::make_pair("return 'a', 'b', 'c';\n", | 2004 std::make_pair("return 'a', 'b', 'c';\n", |
2005 factory->NewStringFromStaticChars("c")), | 2005 factory->NewStringFromStaticChars("c")), |
2006 std::make_pair("return 3.2, 2.3, 4.5;\n", factory->NewNumber(4.5)), | 2006 std::make_pair("return 3.2, 2.3, 4.5;\n", factory->NewNumber(4.5)), |
2007 std::make_pair("var a = 10; return b = a, b = b+1;\n", | 2007 std::make_pair("var a = 10; return b = a, b = b+1;\n", |
2008 handle(Smi::FromInt(11), isolate)), | 2008 handle(Smi::FromInt(11), isolate)), |
2009 std::make_pair("var a = 10; return b = a, b = b+1, b + 10;\n", | 2009 std::make_pair("var a = 10; return b = a, b = b+1, b + 10;\n", |
2010 handle(Smi::FromInt(21), isolate))}; | 2010 handle(Smi::FromInt(21), isolate))}; |
2011 | 2011 |
2012 for (size_t i = 0; i < arraysize(literals); i++) { | 2012 for (size_t i = 0; i < arraysize(literals); i++) { |
2013 std::string source(InterpreterTester::SourceForBody(literals[i].first)); | 2013 std::string source(InterpreterTester::SourceForBody(literals[i].first)); |
2014 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 2014 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
2015 auto callable = tester.GetCallable<>(); | 2015 auto callable = tester.GetCallable<>(); |
2016 | 2016 |
2017 Handle<i::Object> return_value = callable().ToHandleChecked(); | 2017 Handle<i::Object> return_value = callable().ToHandleChecked(); |
2018 CHECK(return_value->SameValue(*literals[i].second)); | 2018 CHECK(return_value->SameValue(*literals[i].second)); |
2019 } | 2019 } |
2020 } | 2020 } |
2021 | 2021 |
2022 | 2022 |
2023 TEST(InterpreterLogicalOr) { | 2023 TEST(InterpreterLogicalOr) { |
2024 HandleAndZoneScope handles; | 2024 HandleAndZoneScope handles; |
2025 i::Isolate* isolate = handles.main_isolate(); | 2025 i::Isolate* isolate = handles.main_isolate(); |
2026 i::Factory* factory = isolate->factory(); | 2026 i::Factory* factory = isolate->factory(); |
2027 | 2027 |
2028 std::pair<const char*, Handle<Object>> literals[5] = { | 2028 std::pair<const char*, Handle<Object>> literals[] = { |
2029 std::make_pair("var a, b; return a || b;\n", factory->undefined_value()), | 2029 std::make_pair("var a, b; return a || b;\n", factory->undefined_value()), |
2030 std::make_pair("var a, b = 10; return a || b;\n", | 2030 std::make_pair("var a, b = 10; return a || b;\n", |
2031 handle(Smi::FromInt(10), isolate)), | 2031 handle(Smi::FromInt(10), isolate)), |
2032 std::make_pair("var a = '0', b = 10; return a || b;\n", | 2032 std::make_pair("var a = '0', b = 10; return a || b;\n", |
2033 factory->NewStringFromStaticChars("0")), | 2033 factory->NewStringFromStaticChars("0")), |
2034 std::make_pair("return 0 || 3.2;\n", factory->NewNumber(3.2)), | 2034 std::make_pair("return 0 || 3.2;\n", factory->NewNumber(3.2)), |
2035 std::make_pair("return 'a' || 0;\n", | 2035 std::make_pair("return 'a' || 0;\n", |
2036 factory->NewStringFromStaticChars("a"))}; | 2036 factory->NewStringFromStaticChars("a"))}; |
2037 | 2037 |
2038 for (size_t i = 0; i < arraysize(literals); i++) { | 2038 for (size_t i = 0; i < arraysize(literals); i++) { |
2039 std::string source(InterpreterTester::SourceForBody(literals[i].first)); | 2039 std::string source(InterpreterTester::SourceForBody(literals[i].first)); |
2040 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 2040 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
2041 auto callable = tester.GetCallable<>(); | 2041 auto callable = tester.GetCallable<>(); |
2042 | 2042 |
2043 Handle<i::Object> return_value = callable().ToHandleChecked(); | 2043 Handle<i::Object> return_value = callable().ToHandleChecked(); |
2044 CHECK(return_value->SameValue(*literals[i].second)); | 2044 CHECK(return_value->SameValue(*literals[i].second)); |
2045 } | 2045 } |
2046 } | 2046 } |
2047 | 2047 |
2048 | 2048 |
2049 TEST(InterpreterLogicalAnd) { | 2049 TEST(InterpreterLogicalAnd) { |
2050 HandleAndZoneScope handles; | 2050 HandleAndZoneScope handles; |
2051 i::Isolate* isolate = handles.main_isolate(); | 2051 i::Isolate* isolate = handles.main_isolate(); |
2052 i::Factory* factory = isolate->factory(); | 2052 i::Factory* factory = isolate->factory(); |
2053 | 2053 |
2054 std::pair<const char*, Handle<Object>> literals[7] = { | 2054 std::pair<const char*, Handle<Object>> literals[] = { |
2055 std::make_pair("var a, b = 10; return a && b;\n", | 2055 std::make_pair("var a, b = 10; return a && b;\n", |
2056 factory->undefined_value()), | 2056 factory->undefined_value()), |
2057 std::make_pair("var a = 0, b = 10; return a && b / a;\n", | 2057 std::make_pair("var a = 0, b = 10; return a && b / a;\n", |
2058 handle(Smi::FromInt(0), isolate)), | 2058 handle(Smi::FromInt(0), isolate)), |
2059 std::make_pair("var a = '0', b = 10; return a && b;\n", | 2059 std::make_pair("var a = '0', b = 10; return a && b;\n", |
2060 handle(Smi::FromInt(10), isolate)), | 2060 handle(Smi::FromInt(10), isolate)), |
2061 std::make_pair("return 0.0 && 3.2;\n", | 2061 std::make_pair("return 0.0 && 3.2;\n", |
2062 handle(Smi::FromInt(0), isolate)), | 2062 handle(Smi::FromInt(0), isolate)), |
2063 std::make_pair("return 'a' && 'b';\n", | 2063 std::make_pair("return 'a' && 'b';\n", |
2064 factory->NewStringFromStaticChars("b")), | 2064 factory->NewStringFromStaticChars("b")), |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2105 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(4)); | 2105 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(4)); |
2106 } | 2106 } |
2107 | 2107 |
2108 | 2108 |
2109 TEST(InterpreterThrow) { | 2109 TEST(InterpreterThrow) { |
2110 HandleAndZoneScope handles; | 2110 HandleAndZoneScope handles; |
2111 i::Isolate* isolate = handles.main_isolate(); | 2111 i::Isolate* isolate = handles.main_isolate(); |
2112 i::Factory* factory = isolate->factory(); | 2112 i::Factory* factory = isolate->factory(); |
2113 | 2113 |
2114 // TODO(rmcilroy): modify tests when we have real try catch support. | 2114 // TODO(rmcilroy): modify tests when we have real try catch support. |
2115 std::pair<const char*, Handle<Object>> throws[6] = { | 2115 std::pair<const char*, Handle<Object>> throws[] = { |
2116 std::make_pair("throw undefined;\n", | 2116 std::make_pair("throw undefined;\n", |
2117 factory->undefined_value()), | 2117 factory->undefined_value()), |
2118 std::make_pair("throw 1;\n", | 2118 std::make_pair("throw 1;\n", |
2119 handle(Smi::FromInt(1), isolate)), | 2119 handle(Smi::FromInt(1), isolate)), |
2120 std::make_pair("throw 'Error';\n", | 2120 std::make_pair("throw 'Error';\n", |
2121 factory->NewStringFromStaticChars("Error")), | 2121 factory->NewStringFromStaticChars("Error")), |
2122 std::make_pair("var a = true; if (a) { throw 'Error'; }\n", | 2122 std::make_pair("var a = true; if (a) { throw 'Error'; }\n", |
2123 factory->NewStringFromStaticChars("Error")), | 2123 factory->NewStringFromStaticChars("Error")), |
2124 std::make_pair("var a = false; if (a) { throw 'Error'; }\n", | 2124 std::make_pair("var a = false; if (a) { throw 'Error'; }\n", |
2125 factory->undefined_value()), | 2125 factory->undefined_value()), |
(...skipping 12 matching lines...) Expand all Loading... |
2138 CHECK(thrown_obj->SameValue(*throws[i].second)); | 2138 CHECK(thrown_obj->SameValue(*throws[i].second)); |
2139 } | 2139 } |
2140 } | 2140 } |
2141 | 2141 |
2142 | 2142 |
2143 TEST(InterpreterCountOperators) { | 2143 TEST(InterpreterCountOperators) { |
2144 HandleAndZoneScope handles; | 2144 HandleAndZoneScope handles; |
2145 i::Isolate* isolate = handles.main_isolate(); | 2145 i::Isolate* isolate = handles.main_isolate(); |
2146 i::Factory* factory = isolate->factory(); | 2146 i::Factory* factory = isolate->factory(); |
2147 | 2147 |
2148 std::pair<const char*, Handle<Object>> count_ops[16] = { | 2148 std::pair<const char*, Handle<Object>> count_ops[] = { |
2149 std::make_pair("var a = 1; return ++a;", | 2149 std::make_pair("var a = 1; return ++a;", |
2150 handle(Smi::FromInt(2), isolate)), | 2150 handle(Smi::FromInt(2), isolate)), |
2151 std::make_pair("var a = 1; return a++;", | 2151 std::make_pair("var a = 1; return a++;", |
2152 handle(Smi::FromInt(1), isolate)), | 2152 handle(Smi::FromInt(1), isolate)), |
2153 std::make_pair("var a = 5; return --a;", | 2153 std::make_pair("var a = 5; return --a;", |
2154 handle(Smi::FromInt(4), isolate)), | 2154 handle(Smi::FromInt(4), isolate)), |
2155 std::make_pair("var a = 5; return a--;", | 2155 std::make_pair("var a = 5; return a--;", |
2156 handle(Smi::FromInt(5), isolate)), | 2156 handle(Smi::FromInt(5), isolate)), |
2157 std::make_pair("var a = 5.2; return --a;", | 2157 std::make_pair("var a = 5.2; return --a;", |
2158 factory->NewHeapNumber(4.2)), | 2158 factory->NewHeapNumber(4.2)), |
(...skipping 29 matching lines...) Expand all Loading... |
2188 Handle<i::Object> return_value = callable().ToHandleChecked(); | 2188 Handle<i::Object> return_value = callable().ToHandleChecked(); |
2189 CHECK(return_value->SameValue(*count_ops[i].second)); | 2189 CHECK(return_value->SameValue(*count_ops[i].second)); |
2190 } | 2190 } |
2191 } | 2191 } |
2192 | 2192 |
2193 | 2193 |
2194 TEST(InterpreterGlobalCountOperators) { | 2194 TEST(InterpreterGlobalCountOperators) { |
2195 HandleAndZoneScope handles; | 2195 HandleAndZoneScope handles; |
2196 i::Isolate* isolate = handles.main_isolate(); | 2196 i::Isolate* isolate = handles.main_isolate(); |
2197 | 2197 |
2198 std::pair<const char*, Handle<Object>> count_ops[6] = { | 2198 std::pair<const char*, Handle<Object>> count_ops[] = { |
2199 std::make_pair("var global = 100;function f(){ return ++global; }", | 2199 std::make_pair("var global = 100;function f(){ return ++global; }", |
2200 handle(Smi::FromInt(101), isolate)), | 2200 handle(Smi::FromInt(101), isolate)), |
2201 std::make_pair("var global = 100; function f(){ return --global; }", | 2201 std::make_pair("var global = 100; function f(){ return --global; }", |
2202 handle(Smi::FromInt(99), isolate)), | 2202 handle(Smi::FromInt(99), isolate)), |
2203 std::make_pair("var global = 100; function f(){ return global++; }", | 2203 std::make_pair("var global = 100; function f(){ return global++; }", |
2204 handle(Smi::FromInt(100), isolate)), | 2204 handle(Smi::FromInt(100), isolate)), |
2205 std::make_pair("unallocated = 200; function f(){ return ++unallocated; }", | 2205 std::make_pair("unallocated = 200; function f(){ return ++unallocated; }", |
2206 handle(Smi::FromInt(201), isolate)), | 2206 handle(Smi::FromInt(201), isolate)), |
2207 std::make_pair("unallocated = 200; function f(){ return --unallocated; }", | 2207 std::make_pair("unallocated = 200; function f(){ return --unallocated; }", |
2208 handle(Smi::FromInt(199), isolate)), | 2208 handle(Smi::FromInt(199), isolate)), |
2209 std::make_pair("unallocated = 200; function f(){ return unallocated++; }", | 2209 std::make_pair("unallocated = 200; function f(){ return unallocated++; }", |
2210 handle(Smi::FromInt(200), isolate)), | 2210 handle(Smi::FromInt(200), isolate)), |
2211 }; | 2211 }; |
2212 | 2212 |
2213 for (size_t i = 0; i < arraysize(count_ops); i++) { | 2213 for (size_t i = 0; i < arraysize(count_ops); i++) { |
2214 InterpreterTester tester(handles.main_isolate(), count_ops[i].first); | 2214 InterpreterTester tester(handles.main_isolate(), count_ops[i].first); |
2215 auto callable = tester.GetCallable<>(); | 2215 auto callable = tester.GetCallable<>(); |
2216 | 2216 |
2217 Handle<i::Object> return_value = callable().ToHandleChecked(); | 2217 Handle<i::Object> return_value = callable().ToHandleChecked(); |
2218 CHECK(return_value->SameValue(*count_ops[i].second)); | 2218 CHECK(return_value->SameValue(*count_ops[i].second)); |
2219 } | 2219 } |
2220 } | 2220 } |
2221 | 2221 |
2222 | 2222 |
2223 TEST(InterpreterCompoundExpressions) { | 2223 TEST(InterpreterCompoundExpressions) { |
2224 HandleAndZoneScope handles; | 2224 HandleAndZoneScope handles; |
2225 i::Isolate* isolate = handles.main_isolate(); | 2225 i::Isolate* isolate = handles.main_isolate(); |
2226 i::Factory* factory = isolate->factory(); | 2226 i::Factory* factory = isolate->factory(); |
2227 | 2227 |
2228 std::pair<const char*, Handle<Object>> compound_expr[5] = { | 2228 std::pair<const char*, Handle<Object>> compound_expr[] = { |
2229 std::make_pair("var a = 1; a += 2; return a;", | 2229 std::make_pair("var a = 1; a += 2; return a;", |
2230 Handle<Object>(Smi::FromInt(3), isolate)), | 2230 Handle<Object>(Smi::FromInt(3), isolate)), |
2231 std::make_pair("var a = 10; a /= 2; return a;", | 2231 std::make_pair("var a = 10; a /= 2; return a;", |
2232 Handle<Object>(Smi::FromInt(5), isolate)), | 2232 Handle<Object>(Smi::FromInt(5), isolate)), |
2233 std::make_pair("var a = 'test'; a += 'ing'; return a;", | 2233 std::make_pair("var a = 'test'; a += 'ing'; return a;", |
2234 factory->NewStringFromStaticChars("testing")), | 2234 factory->NewStringFromStaticChars("testing")), |
2235 std::make_pair("var a = { val: 2 }; a.val *= 2; return a.val;", | 2235 std::make_pair("var a = { val: 2 }; a.val *= 2; return a.val;", |
2236 Handle<Object>(Smi::FromInt(4), isolate)), | 2236 Handle<Object>(Smi::FromInt(4), isolate)), |
2237 std::make_pair("var a = 1; (function f() { a = 2; })(); a += 24;" | 2237 std::make_pair("var a = 1; (function f() { a = 2; })(); a += 24;" |
2238 "return a;", | 2238 "return a;", |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2272 CHECK(return_value->SameValue(*compound_expr[i].second)); | 2272 CHECK(return_value->SameValue(*compound_expr[i].second)); |
2273 } | 2273 } |
2274 } | 2274 } |
2275 | 2275 |
2276 | 2276 |
2277 TEST(InterpreterCreateArguments) { | 2277 TEST(InterpreterCreateArguments) { |
2278 HandleAndZoneScope handles; | 2278 HandleAndZoneScope handles; |
2279 i::Isolate* isolate = handles.main_isolate(); | 2279 i::Isolate* isolate = handles.main_isolate(); |
2280 i::Factory* factory = isolate->factory(); | 2280 i::Factory* factory = isolate->factory(); |
2281 | 2281 |
2282 std::pair<const char*, int> create_args[9] = { | 2282 std::pair<const char*, int> create_args[] = { |
2283 std::make_pair("function f() { return arguments[0]; }", 0), | 2283 std::make_pair("function f() { return arguments[0]; }", 0), |
2284 std::make_pair("function f(a) { return arguments[0]; }", 0), | 2284 std::make_pair("function f(a) { return arguments[0]; }", 0), |
2285 std::make_pair("function f() { return arguments[2]; }", 2), | 2285 std::make_pair("function f() { return arguments[2]; }", 2), |
2286 std::make_pair("function f(a) { return arguments[2]; }", 2), | 2286 std::make_pair("function f(a) { return arguments[2]; }", 2), |
2287 std::make_pair("function f(a, b, c, d) { return arguments[2]; }", 2), | 2287 std::make_pair("function f(a, b, c, d) { return arguments[2]; }", 2), |
2288 std::make_pair("function f(a) {" | 2288 std::make_pair("function f(a) {" |
2289 "'use strict'; return arguments[0]; }", | 2289 "'use strict'; return arguments[0]; }", |
2290 0), | 2290 0), |
2291 std::make_pair("function f(a, b, c, d) {" | 2291 std::make_pair("function f(a, b, c, d) {" |
2292 "'use strict'; return arguments[2]; }", | 2292 "'use strict'; return arguments[2]; }", |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2336 callable(args[0], args[1], args[2]).ToHandleChecked(); | 2336 callable(args[0], args[1], args[2]).ToHandleChecked(); |
2337 CHECK(return_val->SameValue(*args[create_args[i].second])); | 2337 CHECK(return_val->SameValue(*args[create_args[i].second])); |
2338 } | 2338 } |
2339 } | 2339 } |
2340 | 2340 |
2341 | 2341 |
2342 TEST(InterpreterConditional) { | 2342 TEST(InterpreterConditional) { |
2343 HandleAndZoneScope handles; | 2343 HandleAndZoneScope handles; |
2344 i::Isolate* isolate = handles.main_isolate(); | 2344 i::Isolate* isolate = handles.main_isolate(); |
2345 | 2345 |
2346 std::pair<const char*, Handle<Object>> conditional[8] = { | 2346 std::pair<const char*, Handle<Object>> conditional[] = { |
2347 std::make_pair("return true ? 2 : 3;", | 2347 std::make_pair("return true ? 2 : 3;", |
2348 handle(Smi::FromInt(2), isolate)), | 2348 handle(Smi::FromInt(2), isolate)), |
2349 std::make_pair("return false ? 2 : 3;", | 2349 std::make_pair("return false ? 2 : 3;", |
2350 handle(Smi::FromInt(3), isolate)), | 2350 handle(Smi::FromInt(3), isolate)), |
2351 std::make_pair("var a = 1; return a ? 20 : 30;", | 2351 std::make_pair("var a = 1; return a ? 20 : 30;", |
2352 handle(Smi::FromInt(20), isolate)), | 2352 handle(Smi::FromInt(20), isolate)), |
2353 std::make_pair("var a = 1; return a ? 20 : 30;", | 2353 std::make_pair("var a = 1; return a ? 20 : 30;", |
2354 handle(Smi::FromInt(20), isolate)), | 2354 handle(Smi::FromInt(20), isolate)), |
2355 std::make_pair("var a = 'string'; return a ? 20 : 30;", | 2355 std::make_pair("var a = 'string'; return a ? 20 : 30;", |
2356 handle(Smi::FromInt(20), isolate)), | 2356 handle(Smi::FromInt(20), isolate)), |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2717 " }", | 2717 " }", |
2718 0}}; | 2718 0}}; |
2719 | 2719 |
2720 for (size_t i = 0; i < arraysize(for_in_samples); i++) { | 2720 for (size_t i = 0; i < arraysize(for_in_samples); i++) { |
2721 InterpreterTester tester(handles.main_isolate(), for_in_samples[i].first); | 2721 InterpreterTester tester(handles.main_isolate(), for_in_samples[i].first); |
2722 auto callable = tester.GetCallable<>(); | 2722 auto callable = tester.GetCallable<>(); |
2723 Handle<Object> return_val = callable().ToHandleChecked(); | 2723 Handle<Object> return_val = callable().ToHandleChecked(); |
2724 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), for_in_samples[i].second); | 2724 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), for_in_samples[i].second); |
2725 } | 2725 } |
2726 } | 2726 } |
| 2727 |
| 2728 |
| 2729 TEST(InterpreterSwitch) { |
| 2730 HandleAndZoneScope handles; |
| 2731 i::Isolate* isolate = handles.main_isolate(); |
| 2732 i::Factory* factory = isolate->factory(); |
| 2733 |
| 2734 std::pair<const char*, Handle<Object>> switch_ops[] = { |
| 2735 std::make_pair("var a = 1;\n" |
| 2736 "switch(a) {\n" |
| 2737 " case 1: return 2;\n" |
| 2738 " case 2: return 3;\n" |
| 2739 "}\n", |
| 2740 handle(Smi::FromInt(2), isolate)), |
| 2741 std::make_pair("var a = 1;\n" |
| 2742 "switch(a) {\n" |
| 2743 " case 2: a = 2; break;\n" |
| 2744 " case 1: a = 3; break;\n" |
| 2745 "}\n" |
| 2746 "return a;", |
| 2747 handle(Smi::FromInt(3), isolate)), |
| 2748 std::make_pair("var a = 1;\n" |
| 2749 "switch(a) {\n" |
| 2750 " case 1: a = 2; // fall-through\n" |
| 2751 " case 2: a = 3; break;\n" |
| 2752 "}\n" |
| 2753 "return a;", |
| 2754 handle(Smi::FromInt(3), isolate)), |
| 2755 std::make_pair("var a = 100;\n" |
| 2756 "switch(a) {\n" |
| 2757 " case 1: return 100;\n" |
| 2758 " case 2: return 200;\n" |
| 2759 "}\n" |
| 2760 "return undefined;", |
| 2761 factory->undefined_value()), |
| 2762 std::make_pair("var a = 100;\n" |
| 2763 "switch(a) {\n" |
| 2764 " case 1: return 100;\n" |
| 2765 " case 2: return 200;\n" |
| 2766 " default: return 300;\n" |
| 2767 "}\n" |
| 2768 "return undefined;", |
| 2769 handle(Smi::FromInt(300), isolate)), |
| 2770 std::make_pair("var a = 100;\n" |
| 2771 "switch(typeof(a)) {\n" |
| 2772 " case 'string': return 1;\n" |
| 2773 " case 'number': return 2;\n" |
| 2774 " default: return 3;\n" |
| 2775 "}\n", |
| 2776 handle(Smi::FromInt(2), isolate)), |
| 2777 std::make_pair("var a = 100;\n" |
| 2778 "switch(a) {\n" |
| 2779 " case a += 20: return 1;\n" |
| 2780 " case a -= 10: return 2;\n" |
| 2781 " case a -= 10: return 3;\n" |
| 2782 " default: return 3;\n" |
| 2783 "}\n", |
| 2784 handle(Smi::FromInt(3), isolate)), |
| 2785 }; |
| 2786 |
| 2787 for (size_t i = 0; i < arraysize(switch_ops); i++) { |
| 2788 std::string source(InterpreterTester::SourceForBody(switch_ops[i].first)); |
| 2789 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
| 2790 auto callable = tester.GetCallable<>(); |
| 2791 |
| 2792 Handle<i::Object> return_value = callable().ToHandleChecked(); |
| 2793 CHECK(return_value->SameValue(*switch_ops[i].second)); |
| 2794 } |
| 2795 } |
OLD | NEW |