| 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 |