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 1700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1711 Handle<Smi>(Smi::FromInt(3), handles.main_isolate())).ToHandleChecked(); | 1711 Handle<Smi>(Smi::FromInt(3), handles.main_isolate())).ToHandleChecked(); |
1712 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5)); | 1712 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5)); |
1713 } | 1713 } |
1714 | 1714 |
1715 | 1715 |
1716 TEST(InterpreterRegExpLiterals) { | 1716 TEST(InterpreterRegExpLiterals) { |
1717 HandleAndZoneScope handles; | 1717 HandleAndZoneScope handles; |
1718 i::Isolate* isolate = handles.main_isolate(); | 1718 i::Isolate* isolate = handles.main_isolate(); |
1719 i::Factory* factory = isolate->factory(); | 1719 i::Factory* factory = isolate->factory(); |
1720 | 1720 |
1721 std::pair<const char*, Handle<Object>> literals[5] = { | 1721 std::pair<const char*, Handle<Object>> literals[] = { |
1722 std::make_pair("return /abd/.exec('cccabbdd');\n", | 1722 std::make_pair("return /abd/.exec('cccabbdd');\n", |
1723 factory->null_value()), | 1723 factory->null_value()), |
1724 std::make_pair("return /ab+d/.exec('cccabbdd')[0];\n", | 1724 std::make_pair("return /ab+d/.exec('cccabbdd')[0];\n", |
1725 factory->NewStringFromStaticChars("abbd")), | 1725 factory->NewStringFromStaticChars("abbd")), |
1726 std::make_pair("return /AbC/i.exec('ssaBC')[0];\n", | 1726 std::make_pair("return /AbC/i.exec('ssaBC')[0];\n", |
1727 factory->NewStringFromStaticChars("aBC")), | 1727 factory->NewStringFromStaticChars("aBC")), |
1728 std::make_pair("return 'ssaBC'.match(/AbC/i)[0];\n", | 1728 std::make_pair("return 'ssaBC'.match(/AbC/i)[0];\n", |
1729 factory->NewStringFromStaticChars("aBC")), | 1729 factory->NewStringFromStaticChars("aBC")), |
1730 std::make_pair("return 'ssaBCtAbC'.match(/(AbC)/gi)[1];\n", | 1730 std::make_pair("return 'ssaBCtAbC'.match(/(AbC)/gi)[1];\n", |
1731 factory->NewStringFromStaticChars("AbC")), | 1731 factory->NewStringFromStaticChars("AbC")), |
1732 }; | 1732 }; |
1733 | 1733 |
1734 for (size_t i = 0; i < arraysize(literals); i++) { | 1734 for (size_t i = 0; i < arraysize(literals); i++) { |
1735 std::string source(InterpreterTester::SourceForBody(literals[i].first)); | 1735 std::string source(InterpreterTester::SourceForBody(literals[i].first)); |
1736 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 1736 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
1737 auto callable = tester.GetCallable<>(); | 1737 auto callable = tester.GetCallable<>(); |
1738 | 1738 |
1739 Handle<i::Object> return_value = callable().ToHandleChecked(); | 1739 Handle<i::Object> return_value = callable().ToHandleChecked(); |
1740 CHECK(return_value->SameValue(*literals[i].second)); | 1740 CHECK(return_value->SameValue(*literals[i].second)); |
1741 } | 1741 } |
1742 } | 1742 } |
1743 | 1743 |
1744 | 1744 |
1745 TEST(InterpreterArrayLiterals) { | 1745 TEST(InterpreterArrayLiterals) { |
1746 HandleAndZoneScope handles; | 1746 HandleAndZoneScope handles; |
1747 i::Isolate* isolate = handles.main_isolate(); | 1747 i::Isolate* isolate = handles.main_isolate(); |
1748 i::Factory* factory = isolate->factory(); | 1748 i::Factory* factory = isolate->factory(); |
1749 | 1749 |
1750 std::pair<const char*, Handle<Object>> literals[6] = { | 1750 std::pair<const char*, Handle<Object>> literals[] = { |
1751 std::make_pair("return [][0];\n", | 1751 std::make_pair("return [][0];\n", |
1752 factory->undefined_value()), | 1752 factory->undefined_value()), |
1753 std::make_pair("return [1, 3, 2][1];\n", | 1753 std::make_pair("return [1, 3, 2][1];\n", |
1754 handle(Smi::FromInt(3), isolate)), | 1754 handle(Smi::FromInt(3), isolate)), |
1755 std::make_pair("return ['a', 'b', 'c'][2];\n", | 1755 std::make_pair("return ['a', 'b', 'c'][2];\n", |
1756 factory->NewStringFromStaticChars("c")), | 1756 factory->NewStringFromStaticChars("c")), |
1757 std::make_pair("var a = 100; return [a, a + 1, a + 2, a + 3][2];\n", | 1757 std::make_pair("var a = 100; return [a, a + 1, a + 2, a + 3][2];\n", |
1758 handle(Smi::FromInt(102), isolate)), | 1758 handle(Smi::FromInt(102), isolate)), |
1759 std::make_pair("return [[1, 2, 3], ['a', 'b', 'c']][1][0];\n", | 1759 std::make_pair("return [[1, 2, 3], ['a', 'b', 'c']][1][0];\n", |
1760 factory->NewStringFromStaticChars("a")), | 1760 factory->NewStringFromStaticChars("a")), |
(...skipping 10 matching lines...) Expand all Loading... |
1771 CHECK(return_value->SameValue(*literals[i].second)); | 1771 CHECK(return_value->SameValue(*literals[i].second)); |
1772 } | 1772 } |
1773 } | 1773 } |
1774 | 1774 |
1775 | 1775 |
1776 TEST(InterpreterObjectLiterals) { | 1776 TEST(InterpreterObjectLiterals) { |
1777 HandleAndZoneScope handles; | 1777 HandleAndZoneScope handles; |
1778 i::Isolate* isolate = handles.main_isolate(); | 1778 i::Isolate* isolate = handles.main_isolate(); |
1779 i::Factory* factory = isolate->factory(); | 1779 i::Factory* factory = isolate->factory(); |
1780 | 1780 |
1781 std::pair<const char*, Handle<Object>> literals[14] = { | 1781 std::pair<const char*, Handle<Object>> literals[] = { |
1782 std::make_pair("return { }.name;", | 1782 std::make_pair("return { }.name;", |
1783 factory->undefined_value()), | 1783 factory->undefined_value()), |
1784 std::make_pair("return { name: 'string', val: 9.2 }.name;", | 1784 std::make_pair("return { name: 'string', val: 9.2 }.name;", |
1785 factory->NewStringFromStaticChars("string")), | 1785 factory->NewStringFromStaticChars("string")), |
1786 std::make_pair("var a = 15; return { name: 'string', val: a }.val;", | 1786 std::make_pair("var a = 15; return { name: 'string', val: a }.val;", |
1787 handle(Smi::FromInt(15), isolate)), | 1787 handle(Smi::FromInt(15), isolate)), |
1788 std::make_pair("var a = 5; return { val: a, val: a + 1 }.val;", | 1788 std::make_pair("var a = 5; return { val: a, val: a + 1 }.val;", |
1789 handle(Smi::FromInt(6), isolate)), | 1789 handle(Smi::FromInt(6), isolate)), |
1790 std::make_pair("return { func: function() { return 'test' } }.func();", | 1790 std::make_pair("return { func: function() { return 'test' } }.func();", |
1791 factory->NewStringFromStaticChars("test")), | 1791 factory->NewStringFromStaticChars("test")), |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1882 | 1882 |
1883 Handle<Object> return_val = callable().ToHandleChecked(); | 1883 Handle<Object> return_val = callable().ToHandleChecked(); |
1884 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(15)); | 1884 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(15)); |
1885 } | 1885 } |
1886 | 1886 |
1887 | 1887 |
1888 TEST(InterpreterContextVariables) { | 1888 TEST(InterpreterContextVariables) { |
1889 HandleAndZoneScope handles; | 1889 HandleAndZoneScope handles; |
1890 i::Isolate* isolate = handles.main_isolate(); | 1890 i::Isolate* isolate = handles.main_isolate(); |
1891 | 1891 |
1892 std::pair<const char*, Handle<Object>> context_vars[5] = { | 1892 std::pair<const char*, Handle<Object>> context_vars[] = { |
1893 std::make_pair("var a; (function() { a = 1; })(); return a;", | 1893 std::make_pair("var a; (function() { a = 1; })(); return a;", |
1894 handle(Smi::FromInt(1), isolate)), | 1894 handle(Smi::FromInt(1), isolate)), |
1895 std::make_pair("var a = 10; (function() { a; })(); return a;", | 1895 std::make_pair("var a = 10; (function() { a; })(); return a;", |
1896 handle(Smi::FromInt(10), isolate)), | 1896 handle(Smi::FromInt(10), isolate)), |
1897 std::make_pair("var a = 20; var b = 30;\n" | 1897 std::make_pair("var a = 20; var b = 30;\n" |
1898 "return (function() { return a + b; })();", | 1898 "return (function() { return a + b; })();", |
1899 handle(Smi::FromInt(50), isolate)), | 1899 handle(Smi::FromInt(50), isolate)), |
1900 std::make_pair("'use strict'; let a = 1;\n" | 1900 std::make_pair("'use strict'; let a = 1;\n" |
1901 "{ let b = 2; return (function() { return a + b; })(); }", | 1901 "{ let b = 2; return (function() { return a + b; })(); }", |
1902 handle(Smi::FromInt(3), isolate)), | 1902 handle(Smi::FromInt(3), isolate)), |
(...skipping 11 matching lines...) Expand all Loading... |
1914 Handle<i::Object> return_value = callable().ToHandleChecked(); | 1914 Handle<i::Object> return_value = callable().ToHandleChecked(); |
1915 CHECK(return_value->SameValue(*context_vars[i].second)); | 1915 CHECK(return_value->SameValue(*context_vars[i].second)); |
1916 } | 1916 } |
1917 } | 1917 } |
1918 | 1918 |
1919 | 1919 |
1920 TEST(InterpreterContextParameters) { | 1920 TEST(InterpreterContextParameters) { |
1921 HandleAndZoneScope handles; | 1921 HandleAndZoneScope handles; |
1922 i::Isolate* isolate = handles.main_isolate(); | 1922 i::Isolate* isolate = handles.main_isolate(); |
1923 | 1923 |
1924 std::pair<const char*, Handle<Object>> context_params[3] = { | 1924 std::pair<const char*, Handle<Object>> context_params[] = { |
1925 std::make_pair("return (function() { return arg1; })();", | 1925 std::make_pair("return (function() { return arg1; })();", |
1926 handle(Smi::FromInt(1), isolate)), | 1926 handle(Smi::FromInt(1), isolate)), |
1927 std::make_pair("(function() { arg1 = 4; })(); return arg1;", | 1927 std::make_pair("(function() { arg1 = 4; })(); return arg1;", |
1928 handle(Smi::FromInt(4), isolate)), | 1928 handle(Smi::FromInt(4), isolate)), |
1929 std::make_pair("(function() { arg3 = arg2 - arg1; })(); return arg3;", | 1929 std::make_pair("(function() { arg3 = arg2 - arg1; })(); return arg3;", |
1930 handle(Smi::FromInt(1), isolate)), | 1930 handle(Smi::FromInt(1), isolate)), |
1931 }; | 1931 }; |
1932 | 1932 |
1933 for (size_t i = 0; i < arraysize(context_params); i++) { | 1933 for (size_t i = 0; i < arraysize(context_params); i++) { |
1934 std::string source = "function " + InterpreterTester::function_name() + | 1934 std::string source = "function " + InterpreterTester::function_name() + |
1935 "(arg1, arg2, arg3) {" + context_params[i].first + "}"; | 1935 "(arg1, arg2, arg3) {" + context_params[i].first + "}"; |
1936 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 1936 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
1937 auto callable = | 1937 auto callable = |
1938 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); | 1938 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); |
1939 | 1939 |
1940 Handle<Object> a1 = handle(Smi::FromInt(1), isolate); | 1940 Handle<Object> a1 = handle(Smi::FromInt(1), isolate); |
1941 Handle<Object> a2 = handle(Smi::FromInt(2), isolate); | 1941 Handle<Object> a2 = handle(Smi::FromInt(2), isolate); |
1942 Handle<Object> a3 = handle(Smi::FromInt(3), isolate); | 1942 Handle<Object> a3 = handle(Smi::FromInt(3), isolate); |
1943 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked(); | 1943 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked(); |
1944 CHECK(return_value->SameValue(*context_params[i].second)); | 1944 CHECK(return_value->SameValue(*context_params[i].second)); |
1945 } | 1945 } |
1946 } | 1946 } |
1947 | 1947 |
1948 | 1948 |
1949 TEST(InterpreterOuterContextVariables) { | 1949 TEST(InterpreterOuterContextVariables) { |
1950 HandleAndZoneScope handles; | 1950 HandleAndZoneScope handles; |
1951 i::Isolate* isolate = handles.main_isolate(); | 1951 i::Isolate* isolate = handles.main_isolate(); |
1952 | 1952 |
1953 std::pair<const char*, Handle<Object>> context_vars[2] = { | 1953 std::pair<const char*, Handle<Object>> context_vars[] = { |
1954 std::make_pair("return outerVar * innerArg;", | 1954 std::make_pair("return outerVar * innerArg;", |
1955 handle(Smi::FromInt(200), isolate)), | 1955 handle(Smi::FromInt(200), isolate)), |
1956 std::make_pair("outerVar = innerArg; return outerVar", | 1956 std::make_pair("outerVar = innerArg; return outerVar", |
1957 handle(Smi::FromInt(20), isolate)), | 1957 handle(Smi::FromInt(20), isolate)), |
1958 }; | 1958 }; |
1959 | 1959 |
1960 std::string header( | 1960 std::string header( |
1961 "function Outer() {" | 1961 "function Outer() {" |
1962 " var outerVar = 10;" | 1962 " var outerVar = 10;" |
1963 " function Inner(innerArg) {" | 1963 " function Inner(innerArg) {" |
(...skipping 13 matching lines...) Expand all Loading... |
1977 CHECK(return_value->SameValue(*context_vars[i].second)); | 1977 CHECK(return_value->SameValue(*context_vars[i].second)); |
1978 } | 1978 } |
1979 } | 1979 } |
1980 | 1980 |
1981 | 1981 |
1982 TEST(InterpreterComma) { | 1982 TEST(InterpreterComma) { |
1983 HandleAndZoneScope handles; | 1983 HandleAndZoneScope handles; |
1984 i::Isolate* isolate = handles.main_isolate(); | 1984 i::Isolate* isolate = handles.main_isolate(); |
1985 i::Factory* factory = isolate->factory(); | 1985 i::Factory* factory = isolate->factory(); |
1986 | 1986 |
1987 std::pair<const char*, Handle<Object>> literals[6] = { | 1987 std::pair<const char*, Handle<Object>> literals[] = { |
1988 std::make_pair("var a; return 0, a;\n", factory->undefined_value()), | 1988 std::make_pair("var a; return 0, a;\n", factory->undefined_value()), |
1989 std::make_pair("return 'a', 2.2, 3;\n", | 1989 std::make_pair("return 'a', 2.2, 3;\n", |
1990 handle(Smi::FromInt(3), isolate)), | 1990 handle(Smi::FromInt(3), isolate)), |
1991 std::make_pair("return 'a', 'b', 'c';\n", | 1991 std::make_pair("return 'a', 'b', 'c';\n", |
1992 factory->NewStringFromStaticChars("c")), | 1992 factory->NewStringFromStaticChars("c")), |
1993 std::make_pair("return 3.2, 2.3, 4.5;\n", factory->NewNumber(4.5)), | 1993 std::make_pair("return 3.2, 2.3, 4.5;\n", factory->NewNumber(4.5)), |
1994 std::make_pair("var a = 10; return b = a, b = b+1;\n", | 1994 std::make_pair("var a = 10; return b = a, b = b+1;\n", |
1995 handle(Smi::FromInt(11), isolate)), | 1995 handle(Smi::FromInt(11), isolate)), |
1996 std::make_pair("var a = 10; return b = a, b = b+1, b + 10;\n", | 1996 std::make_pair("var a = 10; return b = a, b = b+1, b + 10;\n", |
1997 handle(Smi::FromInt(21), isolate))}; | 1997 handle(Smi::FromInt(21), isolate))}; |
1998 | 1998 |
1999 for (size_t i = 0; i < arraysize(literals); i++) { | 1999 for (size_t i = 0; i < arraysize(literals); i++) { |
2000 std::string source(InterpreterTester::SourceForBody(literals[i].first)); | 2000 std::string source(InterpreterTester::SourceForBody(literals[i].first)); |
2001 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 2001 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
2002 auto callable = tester.GetCallable<>(); | 2002 auto callable = tester.GetCallable<>(); |
2003 | 2003 |
2004 Handle<i::Object> return_value = callable().ToHandleChecked(); | 2004 Handle<i::Object> return_value = callable().ToHandleChecked(); |
2005 CHECK(return_value->SameValue(*literals[i].second)); | 2005 CHECK(return_value->SameValue(*literals[i].second)); |
2006 } | 2006 } |
2007 } | 2007 } |
2008 | 2008 |
2009 | 2009 |
2010 TEST(InterpreterLogicalOr) { | 2010 TEST(InterpreterLogicalOr) { |
2011 HandleAndZoneScope handles; | 2011 HandleAndZoneScope handles; |
2012 i::Isolate* isolate = handles.main_isolate(); | 2012 i::Isolate* isolate = handles.main_isolate(); |
2013 i::Factory* factory = isolate->factory(); | 2013 i::Factory* factory = isolate->factory(); |
2014 | 2014 |
2015 std::pair<const char*, Handle<Object>> literals[5] = { | 2015 std::pair<const char*, Handle<Object>> literals[] = { |
2016 std::make_pair("var a, b; return a || b;\n", factory->undefined_value()), | 2016 std::make_pair("var a, b; return a || b;\n", factory->undefined_value()), |
2017 std::make_pair("var a, b = 10; return a || b;\n", | 2017 std::make_pair("var a, b = 10; return a || b;\n", |
2018 handle(Smi::FromInt(10), isolate)), | 2018 handle(Smi::FromInt(10), isolate)), |
2019 std::make_pair("var a = '0', b = 10; return a || b;\n", | 2019 std::make_pair("var a = '0', b = 10; return a || b;\n", |
2020 factory->NewStringFromStaticChars("0")), | 2020 factory->NewStringFromStaticChars("0")), |
2021 std::make_pair("return 0 || 3.2;\n", factory->NewNumber(3.2)), | 2021 std::make_pair("return 0 || 3.2;\n", factory->NewNumber(3.2)), |
2022 std::make_pair("return 'a' || 0;\n", | 2022 std::make_pair("return 'a' || 0;\n", |
2023 factory->NewStringFromStaticChars("a"))}; | 2023 factory->NewStringFromStaticChars("a"))}; |
2024 | 2024 |
2025 for (size_t i = 0; i < arraysize(literals); i++) { | 2025 for (size_t i = 0; i < arraysize(literals); i++) { |
2026 std::string source(InterpreterTester::SourceForBody(literals[i].first)); | 2026 std::string source(InterpreterTester::SourceForBody(literals[i].first)); |
2027 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 2027 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
2028 auto callable = tester.GetCallable<>(); | 2028 auto callable = tester.GetCallable<>(); |
2029 | 2029 |
2030 Handle<i::Object> return_value = callable().ToHandleChecked(); | 2030 Handle<i::Object> return_value = callable().ToHandleChecked(); |
2031 CHECK(return_value->SameValue(*literals[i].second)); | 2031 CHECK(return_value->SameValue(*literals[i].second)); |
2032 } | 2032 } |
2033 } | 2033 } |
2034 | 2034 |
2035 | 2035 |
2036 TEST(InterpreterLogicalAnd) { | 2036 TEST(InterpreterLogicalAnd) { |
2037 HandleAndZoneScope handles; | 2037 HandleAndZoneScope handles; |
2038 i::Isolate* isolate = handles.main_isolate(); | 2038 i::Isolate* isolate = handles.main_isolate(); |
2039 i::Factory* factory = isolate->factory(); | 2039 i::Factory* factory = isolate->factory(); |
2040 | 2040 |
2041 std::pair<const char*, Handle<Object>> literals[7] = { | 2041 std::pair<const char*, Handle<Object>> literals[] = { |
2042 std::make_pair("var a, b = 10; return a && b;\n", | 2042 std::make_pair("var a, b = 10; return a && b;\n", |
2043 factory->undefined_value()), | 2043 factory->undefined_value()), |
2044 std::make_pair("var a = 0, b = 10; return a && b / a;\n", | 2044 std::make_pair("var a = 0, b = 10; return a && b / a;\n", |
2045 handle(Smi::FromInt(0), isolate)), | 2045 handle(Smi::FromInt(0), isolate)), |
2046 std::make_pair("var a = '0', b = 10; return a && b;\n", | 2046 std::make_pair("var a = '0', b = 10; return a && b;\n", |
2047 handle(Smi::FromInt(10), isolate)), | 2047 handle(Smi::FromInt(10), isolate)), |
2048 std::make_pair("return 0.0 && 3.2;\n", | 2048 std::make_pair("return 0.0 && 3.2;\n", |
2049 handle(Smi::FromInt(0), isolate)), | 2049 handle(Smi::FromInt(0), isolate)), |
2050 std::make_pair("return 'a' && 'b';\n", | 2050 std::make_pair("return 'a' && 'b';\n", |
2051 factory->NewStringFromStaticChars("b")), | 2051 factory->NewStringFromStaticChars("b")), |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2092 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(4)); | 2092 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(4)); |
2093 } | 2093 } |
2094 | 2094 |
2095 | 2095 |
2096 TEST(InterpreterThrow) { | 2096 TEST(InterpreterThrow) { |
2097 HandleAndZoneScope handles; | 2097 HandleAndZoneScope handles; |
2098 i::Isolate* isolate = handles.main_isolate(); | 2098 i::Isolate* isolate = handles.main_isolate(); |
2099 i::Factory* factory = isolate->factory(); | 2099 i::Factory* factory = isolate->factory(); |
2100 | 2100 |
2101 // TODO(rmcilroy): modify tests when we have real try catch support. | 2101 // TODO(rmcilroy): modify tests when we have real try catch support. |
2102 std::pair<const char*, Handle<Object>> throws[6] = { | 2102 std::pair<const char*, Handle<Object>> throws[] = { |
2103 std::make_pair("throw undefined;\n", | 2103 std::make_pair("throw undefined;\n", |
2104 factory->undefined_value()), | 2104 factory->undefined_value()), |
2105 std::make_pair("throw 1;\n", | 2105 std::make_pair("throw 1;\n", |
2106 handle(Smi::FromInt(1), isolate)), | 2106 handle(Smi::FromInt(1), isolate)), |
2107 std::make_pair("throw 'Error';\n", | 2107 std::make_pair("throw 'Error';\n", |
2108 factory->NewStringFromStaticChars("Error")), | 2108 factory->NewStringFromStaticChars("Error")), |
2109 std::make_pair("var a = true; if (a) { throw 'Error'; }\n", | 2109 std::make_pair("var a = true; if (a) { throw 'Error'; }\n", |
2110 factory->NewStringFromStaticChars("Error")), | 2110 factory->NewStringFromStaticChars("Error")), |
2111 std::make_pair("var a = false; if (a) { throw 'Error'; }\n", | 2111 std::make_pair("var a = false; if (a) { throw 'Error'; }\n", |
2112 factory->undefined_value()), | 2112 factory->undefined_value()), |
(...skipping 12 matching lines...) Expand all Loading... |
2125 CHECK(thrown_obj->SameValue(*throws[i].second)); | 2125 CHECK(thrown_obj->SameValue(*throws[i].second)); |
2126 } | 2126 } |
2127 } | 2127 } |
2128 | 2128 |
2129 | 2129 |
2130 TEST(InterpreterCountOperators) { | 2130 TEST(InterpreterCountOperators) { |
2131 HandleAndZoneScope handles; | 2131 HandleAndZoneScope handles; |
2132 i::Isolate* isolate = handles.main_isolate(); | 2132 i::Isolate* isolate = handles.main_isolate(); |
2133 i::Factory* factory = isolate->factory(); | 2133 i::Factory* factory = isolate->factory(); |
2134 | 2134 |
2135 std::pair<const char*, Handle<Object>> count_ops[16] = { | 2135 std::pair<const char*, Handle<Object>> count_ops[] = { |
2136 std::make_pair("var a = 1; return ++a;", | 2136 std::make_pair("var a = 1; return ++a;", |
2137 handle(Smi::FromInt(2), isolate)), | 2137 handle(Smi::FromInt(2), isolate)), |
2138 std::make_pair("var a = 1; return a++;", | 2138 std::make_pair("var a = 1; return a++;", |
2139 handle(Smi::FromInt(1), isolate)), | 2139 handle(Smi::FromInt(1), isolate)), |
2140 std::make_pair("var a = 5; return --a;", | 2140 std::make_pair("var a = 5; return --a;", |
2141 handle(Smi::FromInt(4), isolate)), | 2141 handle(Smi::FromInt(4), isolate)), |
2142 std::make_pair("var a = 5; return a--;", | 2142 std::make_pair("var a = 5; return a--;", |
2143 handle(Smi::FromInt(5), isolate)), | 2143 handle(Smi::FromInt(5), isolate)), |
2144 std::make_pair("var a = 5.2; return --a;", | 2144 std::make_pair("var a = 5.2; return --a;", |
2145 factory->NewHeapNumber(4.2)), | 2145 factory->NewHeapNumber(4.2)), |
(...skipping 29 matching lines...) Expand all Loading... |
2175 Handle<i::Object> return_value = callable().ToHandleChecked(); | 2175 Handle<i::Object> return_value = callable().ToHandleChecked(); |
2176 CHECK(return_value->SameValue(*count_ops[i].second)); | 2176 CHECK(return_value->SameValue(*count_ops[i].second)); |
2177 } | 2177 } |
2178 } | 2178 } |
2179 | 2179 |
2180 | 2180 |
2181 TEST(InterpreterGlobalCountOperators) { | 2181 TEST(InterpreterGlobalCountOperators) { |
2182 HandleAndZoneScope handles; | 2182 HandleAndZoneScope handles; |
2183 i::Isolate* isolate = handles.main_isolate(); | 2183 i::Isolate* isolate = handles.main_isolate(); |
2184 | 2184 |
2185 std::pair<const char*, Handle<Object>> count_ops[6] = { | 2185 std::pair<const char*, Handle<Object>> count_ops[] = { |
2186 std::make_pair("var global = 100;function f(){ return ++global; }", | 2186 std::make_pair("var global = 100;function f(){ return ++global; }", |
2187 handle(Smi::FromInt(101), isolate)), | 2187 handle(Smi::FromInt(101), isolate)), |
2188 std::make_pair("var global = 100; function f(){ return --global; }", | 2188 std::make_pair("var global = 100; function f(){ return --global; }", |
2189 handle(Smi::FromInt(99), isolate)), | 2189 handle(Smi::FromInt(99), isolate)), |
2190 std::make_pair("var global = 100; function f(){ return global++; }", | 2190 std::make_pair("var global = 100; function f(){ return global++; }", |
2191 handle(Smi::FromInt(100), isolate)), | 2191 handle(Smi::FromInt(100), isolate)), |
2192 std::make_pair("unallocated = 200; function f(){ return ++unallocated; }", | 2192 std::make_pair("unallocated = 200; function f(){ return ++unallocated; }", |
2193 handle(Smi::FromInt(201), isolate)), | 2193 handle(Smi::FromInt(201), isolate)), |
2194 std::make_pair("unallocated = 200; function f(){ return --unallocated; }", | 2194 std::make_pair("unallocated = 200; function f(){ return --unallocated; }", |
2195 handle(Smi::FromInt(199), isolate)), | 2195 handle(Smi::FromInt(199), isolate)), |
2196 std::make_pair("unallocated = 200; function f(){ return unallocated++; }", | 2196 std::make_pair("unallocated = 200; function f(){ return unallocated++; }", |
2197 handle(Smi::FromInt(200), isolate)), | 2197 handle(Smi::FromInt(200), isolate)), |
2198 }; | 2198 }; |
2199 | 2199 |
2200 for (size_t i = 0; i < arraysize(count_ops); i++) { | 2200 for (size_t i = 0; i < arraysize(count_ops); i++) { |
2201 InterpreterTester tester(handles.main_isolate(), count_ops[i].first); | 2201 InterpreterTester tester(handles.main_isolate(), count_ops[i].first); |
2202 auto callable = tester.GetCallable<>(); | 2202 auto callable = tester.GetCallable<>(); |
2203 | 2203 |
2204 Handle<i::Object> return_value = callable().ToHandleChecked(); | 2204 Handle<i::Object> return_value = callable().ToHandleChecked(); |
2205 CHECK(return_value->SameValue(*count_ops[i].second)); | 2205 CHECK(return_value->SameValue(*count_ops[i].second)); |
2206 } | 2206 } |
2207 } | 2207 } |
2208 | 2208 |
2209 | 2209 |
2210 TEST(InterpreterCompoundExpressions) { | 2210 TEST(InterpreterCompoundExpressions) { |
2211 HandleAndZoneScope handles; | 2211 HandleAndZoneScope handles; |
2212 i::Isolate* isolate = handles.main_isolate(); | 2212 i::Isolate* isolate = handles.main_isolate(); |
2213 i::Factory* factory = isolate->factory(); | 2213 i::Factory* factory = isolate->factory(); |
2214 | 2214 |
2215 std::pair<const char*, Handle<Object>> compound_expr[5] = { | 2215 std::pair<const char*, Handle<Object>> compound_expr[] = { |
2216 std::make_pair("var a = 1; a += 2; return a;", | 2216 std::make_pair("var a = 1; a += 2; return a;", |
2217 Handle<Object>(Smi::FromInt(3), isolate)), | 2217 Handle<Object>(Smi::FromInt(3), isolate)), |
2218 std::make_pair("var a = 10; a /= 2; return a;", | 2218 std::make_pair("var a = 10; a /= 2; return a;", |
2219 Handle<Object>(Smi::FromInt(5), isolate)), | 2219 Handle<Object>(Smi::FromInt(5), isolate)), |
2220 std::make_pair("var a = 'test'; a += 'ing'; return a;", | 2220 std::make_pair("var a = 'test'; a += 'ing'; return a;", |
2221 factory->NewStringFromStaticChars("testing")), | 2221 factory->NewStringFromStaticChars("testing")), |
2222 std::make_pair("var a = { val: 2 }; a.val *= 2; return a.val;", | 2222 std::make_pair("var a = { val: 2 }; a.val *= 2; return a.val;", |
2223 Handle<Object>(Smi::FromInt(4), isolate)), | 2223 Handle<Object>(Smi::FromInt(4), isolate)), |
2224 std::make_pair("var a = 1; (function f() { a = 2; })(); a += 24;" | 2224 std::make_pair("var a = 1; (function f() { a = 2; })(); a += 24;" |
2225 "return a;", | 2225 "return a;", |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2259 CHECK(return_value->SameValue(*compound_expr[i].second)); | 2259 CHECK(return_value->SameValue(*compound_expr[i].second)); |
2260 } | 2260 } |
2261 } | 2261 } |
2262 | 2262 |
2263 | 2263 |
2264 TEST(InterpreterCreateArguments) { | 2264 TEST(InterpreterCreateArguments) { |
2265 HandleAndZoneScope handles; | 2265 HandleAndZoneScope handles; |
2266 i::Isolate* isolate = handles.main_isolate(); | 2266 i::Isolate* isolate = handles.main_isolate(); |
2267 i::Factory* factory = isolate->factory(); | 2267 i::Factory* factory = isolate->factory(); |
2268 | 2268 |
2269 std::pair<const char*, int> create_args[9] = { | 2269 std::pair<const char*, int> create_args[] = { |
2270 std::make_pair("function f() { return arguments[0]; }", 0), | 2270 std::make_pair("function f() { return arguments[0]; }", 0), |
2271 std::make_pair("function f(a) { return arguments[0]; }", 0), | 2271 std::make_pair("function f(a) { return arguments[0]; }", 0), |
2272 std::make_pair("function f() { return arguments[2]; }", 2), | 2272 std::make_pair("function f() { return arguments[2]; }", 2), |
2273 std::make_pair("function f(a) { return arguments[2]; }", 2), | 2273 std::make_pair("function f(a) { return arguments[2]; }", 2), |
2274 std::make_pair("function f(a, b, c, d) { return arguments[2]; }", 2), | 2274 std::make_pair("function f(a, b, c, d) { return arguments[2]; }", 2), |
2275 std::make_pair("function f(a) {" | 2275 std::make_pair("function f(a) {" |
2276 "'use strict'; return arguments[0]; }", | 2276 "'use strict'; return arguments[0]; }", |
2277 0), | 2277 0), |
2278 std::make_pair("function f(a, b, c, d) {" | 2278 std::make_pair("function f(a, b, c, d) {" |
2279 "'use strict'; return arguments[2]; }", | 2279 "'use strict'; return arguments[2]; }", |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2323 callable(args[0], args[1], args[2]).ToHandleChecked(); | 2323 callable(args[0], args[1], args[2]).ToHandleChecked(); |
2324 CHECK(return_val->SameValue(*args[create_args[i].second])); | 2324 CHECK(return_val->SameValue(*args[create_args[i].second])); |
2325 } | 2325 } |
2326 } | 2326 } |
2327 | 2327 |
2328 | 2328 |
2329 TEST(InterpreterConditional) { | 2329 TEST(InterpreterConditional) { |
2330 HandleAndZoneScope handles; | 2330 HandleAndZoneScope handles; |
2331 i::Isolate* isolate = handles.main_isolate(); | 2331 i::Isolate* isolate = handles.main_isolate(); |
2332 | 2332 |
2333 std::pair<const char*, Handle<Object>> conditional[8] = { | 2333 std::pair<const char*, Handle<Object>> conditional[] = { |
2334 std::make_pair("return true ? 2 : 3;", | 2334 std::make_pair("return true ? 2 : 3;", |
2335 handle(Smi::FromInt(2), isolate)), | 2335 handle(Smi::FromInt(2), isolate)), |
2336 std::make_pair("return false ? 2 : 3;", | 2336 std::make_pair("return false ? 2 : 3;", |
2337 handle(Smi::FromInt(3), isolate)), | 2337 handle(Smi::FromInt(3), isolate)), |
2338 std::make_pair("var a = 1; return a ? 20 : 30;", | 2338 std::make_pair("var a = 1; return a ? 20 : 30;", |
2339 handle(Smi::FromInt(20), isolate)), | 2339 handle(Smi::FromInt(20), isolate)), |
2340 std::make_pair("var a = 1; return a ? 20 : 30;", | 2340 std::make_pair("var a = 1; return a ? 20 : 30;", |
2341 handle(Smi::FromInt(20), isolate)), | 2341 handle(Smi::FromInt(20), isolate)), |
2342 std::make_pair("var a = 'string'; return a ? 20 : 30;", | 2342 std::make_pair("var a = 'string'; return a ? 20 : 30;", |
2343 handle(Smi::FromInt(20), isolate)), | 2343 handle(Smi::FromInt(20), isolate)), |
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2705 0}}; | 2705 0}}; |
2706 | 2706 |
2707 for (size_t i = 0; i < arraysize(for_in_samples); i++) { | 2707 for (size_t i = 0; i < arraysize(for_in_samples); i++) { |
2708 InterpreterTester tester(handles.main_isolate(), for_in_samples[i].first); | 2708 InterpreterTester tester(handles.main_isolate(), for_in_samples[i].first); |
2709 auto callable = tester.GetCallable<>(); | 2709 auto callable = tester.GetCallable<>(); |
2710 Handle<Object> return_val = callable().ToHandleChecked(); | 2710 Handle<Object> return_val = callable().ToHandleChecked(); |
2711 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), for_in_samples[i].second); | 2711 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), for_in_samples[i].second); |
2712 } | 2712 } |
2713 } | 2713 } |
2714 | 2714 |
| 2715 |
| 2716 TEST(InterpreterSwitch) { |
| 2717 HandleAndZoneScope handles; |
| 2718 i::Isolate* isolate = handles.main_isolate(); |
| 2719 i::Factory* factory = isolate->factory(); |
| 2720 |
| 2721 std::pair<const char*, Handle<Object>> switch_ops[] = { |
| 2722 std::make_pair("var a = 1;\n" |
| 2723 "switch(a) {\n" |
| 2724 " case 1: return 2;\n" |
| 2725 " case 2: return 3;\n" |
| 2726 "}\n", |
| 2727 handle(Smi::FromInt(2), isolate)), |
| 2728 std::make_pair("var a = 1;\n" |
| 2729 "switch(a) {\n" |
| 2730 " case 2: a = 2; break;\n" |
| 2731 " case 1: a = 3; break;\n" |
| 2732 "}\n" |
| 2733 "return a;", |
| 2734 handle(Smi::FromInt(3), isolate)), |
| 2735 std::make_pair("var a = 1;\n" |
| 2736 "switch(a) {\n" |
| 2737 " case 1: a = 2; // fall-through\n" |
| 2738 " case 2: a = 3; break;\n" |
| 2739 "}\n" |
| 2740 "return a;", |
| 2741 handle(Smi::FromInt(3), isolate)), |
| 2742 std::make_pair("var a = 100;\n" |
| 2743 "switch(a) {\n" |
| 2744 " case 1: return 100;\n" |
| 2745 " case 2: return 200;\n" |
| 2746 "}\n" |
| 2747 "return undefined;", |
| 2748 factory->undefined_value()), |
| 2749 std::make_pair("var a = 100;\n" |
| 2750 "switch(a) {\n" |
| 2751 " case 1: return 100;\n" |
| 2752 " case 2: return 200;\n" |
| 2753 " default: return 300;\n" |
| 2754 "}\n" |
| 2755 "return undefined;", |
| 2756 handle(Smi::FromInt(300), isolate)), |
| 2757 std::make_pair("var a = 100;\n" |
| 2758 "switch(typeof(a)) {\n" |
| 2759 " case 'string': return 1;\n" |
| 2760 " case 'number': return 2;\n" |
| 2761 " default: return 3;\n" |
| 2762 "}\n", |
| 2763 handle(Smi::FromInt(2), isolate)), |
| 2764 std::make_pair("var a = 100;\n" |
| 2765 "switch(a) {\n" |
| 2766 " case a += 20: return 1;\n" |
| 2767 " case a -= 10: return 2;\n" |
| 2768 " case a -= 10: return 3;\n" |
| 2769 " default: return 3;\n" |
| 2770 "}\n", |
| 2771 handle(Smi::FromInt(3), isolate)), |
| 2772 std::make_pair("var a = 1;\n" |
| 2773 "switch(a) {\n" |
| 2774 " case 1: \n" |
| 2775 " switch(a + 1) {\n" |
| 2776 " case 2 : a += 1; break;\n" |
| 2777 " default : a += 2; break;\n" |
| 2778 " } // fall-through\n" |
| 2779 " case 2: a += 3;\n" |
| 2780 "}\n" |
| 2781 "return a;", |
| 2782 handle(Smi::FromInt(5), isolate)), |
| 2783 }; |
| 2784 |
| 2785 for (size_t i = 0; i < arraysize(switch_ops); i++) { |
| 2786 std::string source(InterpreterTester::SourceForBody(switch_ops[i].first)); |
| 2787 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
| 2788 auto callable = tester.GetCallable<>(); |
| 2789 |
| 2790 Handle<i::Object> return_value = callable().ToHandleChecked(); |
| 2791 CHECK(return_value->SameValue(*switch_ops[i].second)); |
| 2792 } |
| 2793 } |
| 2794 |
2715 } // namespace interpreter | 2795 } // namespace interpreter |
2716 } // namespace internal | 2796 } // namespace internal |
2717 } // namespace v8 | 2797 } // namespace v8 |
OLD | NEW |